Lines Matching full:os

240     virtual void writeAccessors(raw_ostream &OS) const = 0;
241 virtual void writeAccessorDefinitions(raw_ostream &OS) const {}
242 virtual void writeASTVisitorTraversal(raw_ostream &OS) const {}
243 virtual void writeCloneArgs(raw_ostream &OS) const = 0;
244 virtual void writeTemplateInstantiationArgs(raw_ostream &OS) const = 0;
245 virtual void writeTemplateInstantiation(raw_ostream &OS) const {}
246 virtual void writeCtorBody(raw_ostream &OS) const {}
247 virtual void writeCtorInitializers(raw_ostream &OS) const = 0;
248 virtual void writeCtorDefaultInitializers(raw_ostream &OS) const = 0;
249 virtual void writeCtorParameters(raw_ostream &OS) const = 0;
250 virtual void writeDeclarations(raw_ostream &OS) const = 0;
251 virtual void writePCHReadArgs(raw_ostream &OS) const = 0;
252 virtual void writePCHReadDecls(raw_ostream &OS) const = 0;
253 virtual void writePCHWrite(raw_ostream &OS) const = 0;
255 virtual void writeValue(raw_ostream &OS) const = 0;
256 virtual void writeDump(raw_ostream &OS) const = 0;
257 virtual void writeDumpChildren(raw_ostream &OS) const {}
258 virtual void writeHasChildren(raw_ostream &OS) const { OS << "false"; }
264 virtual void writeImplicitCtorArgs(raw_ostream &OS) const {
265 OS << getUpperName();
278 void writeAccessors(raw_ostream &OS) const override {
279 OS << " " << type << " get" << getUpperName() << "() const {\n";
280 OS << " return " << getLowerName() << ";\n";
281 OS << " }";
284 void writeCloneArgs(raw_ostream &OS) const override {
285 OS << getLowerName();
288 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
289 OS << "A->get" << getUpperName() << "()";
292 void writeCtorInitializers(raw_ostream &OS) const override {
293 OS << getLowerName() << "(" << getUpperName() << ")";
296 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
297 OS << getLowerName() << "()";
300 void writeCtorParameters(raw_ostream &OS) const override {
301 OS << type << " " << getUpperName();
304 void writeDeclarations(raw_ostream &OS) const override {
305 OS << type << " " << getLowerName() << ";";
308 void writePCHReadDecls(raw_ostream &OS) const override {
310 OS << " " << type << " " << getLowerName() << " = " << read << ";\n";
313 void writePCHReadArgs(raw_ostream &OS) const override {
314 OS << getLowerName();
317 void writePCHWrite(raw_ostream &OS) const override {
318 OS << " "
340 void writeValue(raw_ostream &OS) const override {
342 OS << "\" << get" << getUpperName()
347 OS << "\" << (get" << getUpperName() << "() ? get" << getUpperName()
350 OS << "\" << get" << getUpperName() << "()->getName() << \"";
352 OS << "\" << get" << getUpperName() << "().getAsString() << \"";
354 OS << "\" << get" << getUpperName() << "().getSourceIndex() << \"";
356 OS << "\" << get" << getUpperName() << "() << \"";
359 void writeDump(raw_ostream &OS) const override {
361 OS << " OS << \" \";\n";
362 OS << " dumpBareDeclRef(SA->get" << getUpperName() << "());\n";
366 OS << " if (SA->get" << getUpperName() << "())\n"
367 << " OS << \" \" << SA->get" << getUpperName()
371 OS << " if (SA->get" << getUpperName() << "Loc())";
372 OS << " OS << \" \" << SA->get" << getUpperName()
375 OS << " if (SA->get" << getUpperName() << "()) OS << \" "
378 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
381 OS << " if (SA->get" << getUpperName() << "().isValid())\n ";
382 OS << " OS << \" \" << SA->get" << getUpperName()
385 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
400 void writeAccessors(raw_ostream &OS) const override {
401 SimpleArgument::writeAccessors(OS);
403 OS << "\n\n static const " << getType() << " Default" << getUpperName()
406 OS << (Default != 0 ? "true" : "false");
408 OS << Default;
409 OS << ";";
419 void writeAccessors(raw_ostream &OS) const override {
420 OS << " llvm::StringRef get" << getUpperName() << "() const {\n";
421 OS << " return llvm::StringRef(" << getLowerName() << ", "
423 OS << " }\n";
424 OS << " unsigned get" << getUpperName() << "Length() const {\n";
425 OS << " return " << getLowerName() << "Length;\n";
426 OS << " }\n";
427 OS << " void set" << getUpperName()
429 OS << " " << getLowerName() << "Length = S.size();\n";
430 OS << " this->" << getLowerName() << " = new (C, 1) char ["
432 OS << " if (!S.empty())\n";
433 OS << " std::memcpy(this->" << getLowerName() << ", S.data(), "
435 OS << " }";
438 void writeCloneArgs(raw_ostream &OS) const override {
439 OS << "get" << getUpperName() << "()";
442 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
443 OS << "A->get" << getUpperName() << "()";
446 void writeCtorBody(raw_ostream &OS) const override {
447 OS << " if (!" << getUpperName() << ".empty())\n";
448 OS << " std::memcpy(" << getLowerName() << ", " << getUpperName()
452 void writeCtorInitializers(raw_ostream &OS) const override {
453 OS << getLowerName() << "Length(" << getUpperName() << ".size()),"
458 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
459 OS << getLowerName() << "Length(0)," << getLowerName() << "(nullptr)";
462 void writeCtorParameters(raw_ostream &OS) const override {
463 OS << "llvm::StringRef " << getUpperName();
466 void writeDeclarations(raw_ostream &OS) const override {
467 OS << "unsigned " << getLowerName() << "Length;\n";
468 OS << "char *" << getLowerName() << ";";
471 void writePCHReadDecls(raw_ostream &OS) const override {
472 OS << " std::string " << getLowerName()
476 void writePCHReadArgs(raw_ostream &OS) const override {
477 OS << getLowerName();
480 void writePCHWrite(raw_ostream &OS) const override {
481 OS << " Record.AddString(SA->get" << getUpperName() << "());\n";
484 void writeValue(raw_ostream &OS) const override {
485 OS << "\\\"\" << get" << getUpperName() << "() << \"\\\"";
488 void writeDump(raw_ostream &OS) const override {
489 OS << " OS << \" \\\"\" << SA->get" << getUpperName()
500 void writeAccessors(raw_ostream &OS) const override {
501 OS << " bool is" << getUpperName() << "Dependent() const;\n";
502 OS << " bool is" << getUpperName() << "ErrorDependent() const;\n";
504 OS << " unsigned get" << getUpperName() << "(ASTContext &Ctx) const;\n";
506 OS << " bool is" << getUpperName() << "Expr() const {\n";
507 OS << " return is" << getLowerName() << "Expr;\n";
508 OS << " }\n";
510 OS << " Expr *get" << getUpperName() << "Expr() const {\n";
511 OS << " assert(is" << getLowerName() << "Expr);\n";
512 OS << " return " << getLowerName() << "Expr;\n";
513 OS << " }\n";
515 OS << " TypeSourceInfo *get" << getUpperName() << "Type() const {\n";
516 OS << " assert(!is" << getLowerName() << "Expr);\n";
517 OS << " return " << getLowerName() << "Type;\n";
518 OS << " }";
520 OS << " std::optional<unsigned> getCached" << getUpperName()
522 OS << " return " << getLowerName() << "Cache;\n";
523 OS << " }";
525 OS << " void setCached" << getUpperName()
527 OS << " " << getLowerName() << "Cache = AlignVal;\n";
528 OS << " }";
531 void writeAccessorDefinitions(raw_ostream &OS) const override {
532 OS << "bool " << getAttrName() << "Attr::is" << getUpperName()
534 OS << " if (is" << getLowerName() << "Expr)\n";
535 OS << " return " << getLowerName() << "Expr && (" << getLowerName()
538 OS << " else\n";
539 OS << " return " << getLowerName()
541 OS << "}\n";
543 OS << "bool " << getAttrName() << "Attr::is" << getUpperName()
545 OS << " if (is" << getLowerName() << "Expr)\n";
546 OS << " return " << getLowerName() << "Expr && " << getLowerName()
548 OS << " return " << getLowerName()
550 OS << "}\n";
553 void writeASTVisitorTraversal(raw_ostream &OS) const override {
555 OS << " if (A->is" << Name << "Expr()) {\n"
564 void writeCloneArgs(raw_ostream &OS) const override {
565 OS << "is" << getLowerName() << "Expr, is" << getLowerName()
571 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
576 void writeCtorBody(raw_ostream &OS) const override {
577 OS << " if (is" << getLowerName() << "Expr)\n";
578 OS << " " << getLowerName() << "Expr = reinterpret_cast<Expr *>("
580 OS << " else\n";
581 OS << " " << getLowerName()
586 void writeCtorInitializers(raw_ostream &OS) const override {
587 OS << "is" << getLowerName() << "Expr(Is" << getUpperName() << "Expr)";
590 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
591 OS << "is" << getLowerName() << "Expr(false)";
594 void writeCtorParameters(raw_ostream &OS) const override {
595 OS << "bool Is" << getUpperName() << "Expr, void *" << getUpperName();
598 void writeImplicitCtorArgs(raw_ostream &OS) const override {
599 OS << "Is" << getUpperName() << "Expr, " << getUpperName();
602 void writeDeclarations(raw_ostream &OS) const override {
603 OS << "bool is" << getLowerName() << "Expr;\n";
604 OS << "union {\n";
605 OS << "Expr *" << getLowerName() << "Expr;\n";
606 OS << "TypeSourceInfo *" << getLowerName() << "Type;\n";
607 OS << "};\n";
608 OS << "std::optional<unsigned> " << getLowerName() << "Cache;\n";
611 void writePCHReadArgs(raw_ostream &OS) const override {
612 OS << "is" << getLowerName() << "Expr, " << getLowerName() << "Ptr";
615 void writePCHReadDecls(raw_ostream &OS) const override {
616 OS << " bool is" << getLowerName() << "Expr = Record.readInt();\n";
617 OS << " void *" << getLowerName() << "Ptr;\n";
618 OS << " if (is" << getLowerName() << "Expr)\n";
619 OS << " " << getLowerName() << "Ptr = Record.readExpr();\n";
620 OS << " else\n";
621 OS << " " << getLowerName()
625 void writePCHWrite(raw_ostream &OS) const override {
626 OS << " Record.push_back(SA->is" << getUpperName() << "Expr());\n";
627 OS << " if (SA->is" << getUpperName() << "Expr())\n";
628 OS << " Record.AddStmt(SA->get" << getUpperName() << "Expr());\n";
629 OS << " else\n";
630 OS << " Record.AddTypeSourceInfo(SA->get" << getUpperName()
640 void writeValue(raw_ostream &OS) const override {
641 OS << "\";\n";
642 OS << " if (is" << getLowerName() << "Expr && " << getLowerName()
644 OS << " " << getLowerName()
645 << "Expr->printPretty(OS, nullptr, Policy);\n";
646 OS << " if (!is" << getLowerName() << "Expr && " << getLowerName()
648 OS << " " << getLowerName()
649 << "Type->getType().print(OS, Policy);\n";
650 OS << " OS << \"";
653 void writeDump(raw_ostream &OS) const override {
654 OS << " if (!SA->is" << getUpperName() << "Expr())\n";
655 OS << " dumpType(SA->get" << getUpperName()
659 void writeDumpChildren(raw_ostream &OS) const override {
660 OS << " if (SA->is" << getUpperName() << "Expr())\n";
661 OS << " Visit(SA->get" << getUpperName() << "Expr());\n";
664 void writeHasChildren(raw_ostream &OS) const override {
665 OS << "SA->is" << getUpperName() << "Expr()";
673 // Assumed to receive a parameter: raw_ostream OS.
674 virtual void writeValueImpl(raw_ostream &OS) const {
675 OS << " OS << Val;\n";
677 // Assumed to receive a parameter: raw_ostream OS.
678 virtual void writeDumpImpl(raw_ostream &OS) const {
679 OS << " OS << \" \" << Val;\n";
698 void writeAccessors(raw_ostream &OS) const override {
703 OS << " typedef " << Type << "* " << IteratorType << ";\n";
704 OS << " " << IteratorType << " " << BeginFn << " const {"
706 OS << " " << IteratorType << " " << EndFn << " const {"
708 OS << " unsigned " << getLowerName() << "_size() const {"
710 OS << " llvm::iterator_range<" << IteratorType << "> " << RangeName
715 void writeSetter(raw_ostream &OS) const {
716 OS << " void set" << getUpperName() << "(ASTContext &Ctx, ";
717 writeCtorParameters(OS);
718 OS << ") {\n";
719 OS << " " << ArgSizeName << " = " << getUpperName() << "Size;\n";
720 OS << " " << ArgName << " = new (Ctx, 16) " << getType() << "["
722 OS << " ";
723 writeCtorBody(OS);
724 OS << " }\n";
727 void writeCloneArgs(raw_ostream &OS) const override {
728 OS << ArgName << ", " << ArgSizeName;
731 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
733 OS << "A->" << getLowerName() << "_begin(), "
737 void writeASTVisitorTraversal(raw_ostream &OS) const override {
741 void writeCtorBody(raw_ostream &OS) const override {
742 OS << " std::copy(" << getUpperName() << ", " << getUpperName() << " + "
746 void writeCtorInitializers(raw_ostream &OS) const override {
747 OS << ArgSizeName << "(" << getUpperName() << "Size), "
752 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
753 OS << ArgSizeName << "(0), " << ArgName << "(nullptr)";
756 void writeCtorParameters(raw_ostream &OS) const override {
757 OS << getType() << " *" << getUpperName() << ", unsigned "
761 void writeImplicitCtorArgs(raw_ostream &OS) const override {
762 OS << getUpperName() << ", " << getUpperName() << "Size";
765 void writeDeclarations(raw_ostream &OS) const override {
766 OS << " unsigned " << ArgSizeName << ";\n";
767 OS << " " << getType() << " *" << ArgName << ";";
770 void writePCHReadDecls(raw_ostream &OS) const override {
771 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
772 OS << " SmallVector<" << getType() << ", 4> "
774 OS << " " << getLowerName() << ".reserve(" << getLowerName()
784 OS << " SmallVector<" << StorageType << ", 4> "
786 OS << " " << StorageName << ".reserve(" << getLowerName()
790 OS << " for (unsigned i = 0; i != " << getLowerName() << "Size; ++i)\n";
792 OS << " " << StorageName << ".push_back(" << read << ");\n";
795 OS << " for (unsigned i = 0; i != " << getLowerName() << "Size; ++i)\n";
796 OS << " " << getLowerName() << ".push_back("
801 void writePCHReadArgs(raw_ostream &OS) const override {
802 OS << getLowerName() << ".data(), " << getLowerName() << "Size";
805 void writePCHWrite(raw_ostream &OS) const override {
806 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
807 OS << " for (auto &Val : SA->" << RangeName << "())\n";
808 OS << " " << WritePCHRecord(Type, "Val");
811 void writeValue(raw_ostream &OS) const override {
812 OS << "\";\n";
813 OS << " for (const auto &Val : " << RangeName << "()) {\n"
814 << " DelimitAttributeArgument(OS, IsFirstArgument);\n";
815 writeValueImpl(OS);
816 OS << " }\n";
817 OS << " OS << \"";
820 void writeDump(raw_ostream &OS) const override {
821 OS << " for (const auto &Val : SA->" << RangeName << "())\n";
822 writeDumpImpl(OS);
831 void writeDump(raw_ostream &OS) const override {
832 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
835 OS << " if (I->IsTarget && I->IsTargetSync)\n";
836 OS << " OS << \" Target_TargetSync\";\n";
837 OS << " else if (I->IsTarget)\n";
838 OS << " OS << \" Target\";\n";
839 OS << " else\n";
840 OS << " OS << \" TargetSync\";\n";
841 OS << " }\n";
844 void writePCHReadDecls(raw_ostream &OS) const override {
845 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
846 OS << " SmallVector<OMPInteropInfo, 4> " << getLowerName() << ";\n";
847 OS << " " << getLowerName() << ".reserve(" << getLowerName()
849 OS << " for (unsigned I = 0, E = " << getLowerName() << "Size; ";
850 OS << "I != E; ++I) {\n";
851 OS << " bool IsTarget = Record.readBool();\n";
852 OS << " bool IsTargetSync = Record.readBool();\n";
853 OS << " " << getLowerName()
855 OS << " }\n";
858 void writePCHWrite(raw_ostream &OS) const override {
859 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
860 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
863 OS << " Record.writeBool(I->IsTarget);\n";
864 OS << " Record.writeBool(I->IsTargetSync);\n";
865 OS << " }\n";
875 void writeValueImpl(raw_ostream &OS) const override {
876 OS << " OS << Val.getSourceIndex();\n";
879 void writeDumpImpl(raw_ostream &OS) const override {
880 OS << " OS << \" \" << Val.getSourceIndex();\n";
929 void writeAccessors(raw_ostream &OS) const override {
930 OS << " " << fullType << " get" << getUpperName() << "() const {\n";
931 OS << " return " << getLowerName() << ";\n";
932 OS << " }";
935 void writeCloneArgs(raw_ostream &OS) const override {
936 OS << getLowerName();
939 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
940 OS << "A->get" << getUpperName() << "()";
942 void writeCtorInitializers(raw_ostream &OS) const override {
943 OS << getLowerName() << "(" << getUpperName() << ")";
945 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
946 OS << getLowerName() << "(" << fullType << "(0))";
948 void writeCtorParameters(raw_ostream &OS) const override {
949 OS << fullType << " " << getUpperName();
951 void writeDeclarations(raw_ostream &OS) const override {
957 OS << "public:\n";
958 OS << " enum " << shortType << " {\n";
960 OS << " " << *i << ",\n";
961 OS << " " << *e << "\n";
962 OS << " };\n";
965 OS << "private:\n";
966 OS << " " << fullType << " " << getLowerName() << ";";
969 void writePCHReadDecls(raw_ostream &OS) const override {
970 OS << " " << fullType << " " << getLowerName() << "(static_cast<"
974 void writePCHReadArgs(raw_ostream &OS) const override {
975 OS << getLowerName();
978 void writePCHWrite(raw_ostream &OS) const override {
979 OS << "Record.push_back(static_cast<uint64_t>(SA->get" << getUpperName()
983 void writeValue(raw_ostream &OS) const override {
987 OS << "\\\"\" << " << getAttrName() << "Attr::Convert" << shortType
991 void writeDump(raw_ostream &OS) const override {
992 OS << " switch(SA->get" << getUpperName() << "()) {\n";
994 OS << " case " << fullType << "::" << I << ":\n";
995 OS << " OS << \" " << I << "\";\n";
996 OS << " break;\n";
999 OS << " default:\n";
1000 OS << " llvm_unreachable(\"Invalid attribute value\");\n";
1002 OS << " }\n";
1005 void writeConversion(raw_ostream &OS, bool Header) const {
1007 OS << " static bool ConvertStrTo" << shortType << "(StringRef Val, "
1009 OS << " static const char *Convert" << shortType << "ToStr("
1014 OS << "bool " << getAttrName() << "Attr::ConvertStrTo" << shortType
1016 OS << " std::optional<" << fullType << "> "
1019 OS << " .Case(\"" << values[I] << "\", ";
1020 OS << fullType << "::" << enums[I] << ")\n";
1022 OS << " .Default(std::optional<" << fullType << ">());\n";
1023 OS << " if (R) {\n";
1024 OS << " Out = *R;\n return true;\n }\n";
1025 OS << " return false;\n";
1026 OS << "}\n\n";
1032 OS << "const char *" << getAttrName() << "Attr::Convert" << shortType
1038 OS << " case " << fullType << "::" << enums[I] << ": return \""
1042 OS << " default: llvm_unreachable(\"Invalid attribute value\");\n";
1044 OS << " }\n"
1058 void writeValueImpl(raw_ostream &OS) const override {
1062 OS << " OS << \"\\\"\" << " << getAttrName() << "Attr::Convert"
1090 void writeDeclarations(raw_ostream &OS) const override {
1096 OS << "public:\n";
1097 OS << " enum " << shortType << " {\n";
1099 OS << " " << *i << ",\n";
1100 OS << " " << *e << "\n";
1101 OS << " };\n";
1103 OS << "private:\n";
1105 VariadicArgument::writeDeclarations(OS);
1108 void writeDump(raw_ostream &OS) const override {
1109 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
1112 OS << " switch(*I) {\n";
1114 OS << " case " << fullType << "::" << UI << ":\n";
1115 OS << " OS << \" " << UI << "\";\n";
1116 OS << " break;\n";
1119 OS << " default:\n";
1120 OS << " llvm_unreachable(\"Invalid attribute value\");\n";
1122 OS << " }\n";
1123 OS << " }\n";
1126 void writePCHReadDecls(raw_ostream &OS) const override {
1127 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
1128 OS << " SmallVector<" << fullType << ", 4> " << getLowerName()
1130 OS << " " << getLowerName() << ".reserve(" << getLowerName()
1132 OS << " for (unsigned i = " << getLowerName() << "Size; i; --i)\n";
1133 OS << " " << getLowerName() << ".push_back("
1137 void writePCHWrite(raw_ostream &OS) const override {
1138 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
1139 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
1142 OS << " " << WritePCHRecord(fullType, "(*i)");
1145 void writeConversion(raw_ostream &OS, bool Header) const {
1147 OS << " static bool ConvertStrTo" << shortType << "(StringRef Val, "
1149 OS << " static const char *Convert" << shortType << "ToStr("
1154 OS << "bool " << getAttrName() << "Attr::ConvertStrTo" << shortType
1156 OS << fullType << " &Out) {\n";
1157 OS << " std::optional<" << fullType
1159 OS << fullType << ">>(Val)\n";
1161 OS << " .Case(\"" << values[I] << "\", ";
1162 OS << fullType << "::" << enums[I] << ")\n";
1164 OS << " .Default(std::optional<" << fullType << ">());\n";
1165 OS << " if (R) {\n";
1166 OS << " Out = *R;\n return true;\n }\n";
1167 OS << " return false;\n";
1168 OS << "}\n\n";
1170 OS << "const char *" << getAttrName() << "Attr::Convert" << shortType
1176 OS << " case " << fullType << "::" << enums[I] << ": return \""
1180 OS << " default: llvm_unreachable(\"Invalid attribute value\");\n";
1182 OS << " }\n"
1194 void writeAccessors(raw_ostream &OS) const override {
1195 OS << " VersionTuple get" << getUpperName() << "() const {\n";
1196 OS << " return " << getLowerName() << ";\n";
1197 OS << " }\n";
1198 OS << " void set" << getUpperName()
1200 OS << " " << getLowerName() << " = V;\n";
1201 OS << " }";
1204 void writeCloneArgs(raw_ostream &OS) const override {
1205 OS << "get" << getUpperName() << "()";
1208 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1209 OS << "A->get" << getUpperName() << "()";
1212 void writeCtorInitializers(raw_ostream &OS) const override {
1213 OS << getLowerName() << "(" << getUpperName() << ")";
1216 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
1217 OS << getLowerName() << "()";
1220 void writeCtorParameters(raw_ostream &OS) const override {
1221 OS << "VersionTuple " << getUpperName();
1224 void writeDeclarations(raw_ostream &OS) const override {
1225 OS << "VersionTuple " << getLowerName() << ";\n";
1228 void writePCHReadDecls(raw_ostream &OS) const override {
1229 OS << " VersionTuple " << getLowerName()
1233 void writePCHReadArgs(raw_ostream &OS) const override {
1234 OS << getLowerName();
1237 void writePCHWrite(raw_ostream &OS) const override {
1238 OS << " Record.AddVersionTuple(SA->get" << getUpperName() << "());\n";
1241 void writeValue(raw_ostream &OS) const override {
1242 OS << getLowerName() << "=\" << get" << getUpperName() << "() << \"";
1245 void writeDump(raw_ostream &OS) const override {
1246 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
1256 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1257 OS << " if (!"
1259 OS << " return false;\n";
1262 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1263 OS << "tempInst" << getUpperName();
1266 void writeTemplateInstantiation(raw_ostream &OS) const override {
1267 OS << " " << getType() << " tempInst" << getUpperName() << ";\n";
1268 OS << " {\n";
1269 OS << " EnterExpressionEvaluationContext "
1271 OS << " ExprResult " << "Result = S.SubstExpr("
1273 OS << " if (Result.isInvalid())\n";
1274 OS << " return nullptr;\n";
1275 OS << " tempInst" << getUpperName() << " = Result.get();\n";
1276 OS << " }\n";
1279 void writeValue(raw_ostream &OS) const override {
1280 OS << "\";\n";
1281 OS << " get" << getUpperName()
1282 << "()->printPretty(OS, nullptr, Policy);\n";
1283 OS << " OS << \"";
1286 void writeDump(raw_ostream &OS) const override {}
1288 void writeDumpChildren(raw_ostream &OS) const override {
1289 OS << " Visit(SA->get" << getUpperName() << "());\n";
1292 void writeHasChildren(raw_ostream &OS) const override { OS << "true"; }
1304 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1305 OS << " {\n";
1306 OS << " " << getType() << " *I = A->" << getLowerName()
1308 OS << " " << getType() << " *E = A->" << getLowerName()
1310 OS << " for (; I != E; ++I) {\n";
1311 OS << " if (!getDerived().TraverseStmt(*I))\n";
1312 OS << " return false;\n";
1313 OS << " }\n";
1314 OS << " }\n";
1317 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1318 OS << "tempInst" << getUpperName() << ", "
1322 void writeTemplateInstantiation(raw_ostream &OS) const override {
1323 OS << " auto *tempInst" << getUpperName()
1326 OS << " {\n";
1327 OS << " EnterExpressionEvaluationContext "
1329 OS << " " << getType() << " *TI = tempInst" << getUpperName()
1331 OS << " " << getType() << " *I = A->" << getLowerName()
1333 OS << " " << getType() << " *E = A->" << getLowerName()
1335 OS << " for (; I != E; ++I, ++TI) {\n";
1336 OS << " ExprResult Result = S.SubstExpr(*I, TemplateArgs);\n";
1337 OS << " if (Result.isInvalid())\n";
1338 OS << " return nullptr;\n";
1339 OS << " *TI = Result.get();\n";
1340 OS << " }\n";
1341 OS << " }\n";
1344 void writeDump(raw_ostream &OS) const override {}
1346 void writeDumpChildren(raw_ostream &OS) const override {
1347 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
1350 OS << " Visit(*I);\n";
1353 void writeHasChildren(raw_ostream &OS) const override {
1354 OS << "SA->" << getLowerName() << "_begin() != "
1372 void writeCtorBody(raw_ostream &OS) const override {
1373 OS << " for (size_t I = 0, E = " << getArgSizeName() << "; I != E;\n"
1384 void writeValueImpl(raw_ostream &OS) const override {
1385 OS << " OS << \"\\\"\" << Val << \"\\\"\";\n";
1395 void writeAccessors(raw_ostream &OS) const override {
1396 OS << " QualType get" << getUpperName() << "() const {\n";
1397 OS << " return " << getLowerName() << "->getType();\n";
1398 OS << " }";
1399 OS << " " << getType() << " get" << getUpperName() << "Loc() const {\n";
1400 OS << " return " << getLowerName() << ";\n";
1401 OS << " }";
1404 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1405 OS << " if (auto *TSI = A->get" << getUpperName() << "Loc())\n";
1406 OS << " if (!getDerived().TraverseTypeLoc(TSI->getTypeLoc()))\n";
1407 OS << " return false;\n";
1410 void writeTemplateInstantiation(raw_ostream &OS) const override {
1411 OS << " " << getType() << " tempInst" << getUpperName() << " =\n";
1412 OS << " S.SubstType(A->get" << getUpperName() << "Loc(), "
1414 OS << " if (!tempInst" << getUpperName() << ")\n";
1415 OS << " return nullptr;\n";
1418 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1419 OS << "tempInst" << getUpperName();
1422 void writePCHWrite(raw_ostream &OS) const override {
1423 OS << " "
1434 void writePCHReadDecls(raw_ostream &OS) const override {
1435 OS << " Attr *" << getLowerName() << " = Record.readAttr();";
1438 void writePCHWrite(raw_ostream &OS) const override {
1439 OS << " AddAttr(SA->get" << getUpperName() << "());";
1442 void writeDump(raw_ostream &OS) const override {}
1444 void writeDumpChildren(raw_ostream &OS) const override {
1445 OS << " Visit(SA->get" << getUpperName() << "());\n";
1448 void writeHasChildren(raw_ostream &OS) const override { OS << "true"; }
1532 static void writeAvailabilityValue(raw_ostream &OS) {
1533 OS << "\" << getPlatform()->getName();\n"
1534 << " if (getStrict()) OS << \", strict\";\n"
1535 << " if (!getIntroduced().empty()) OS << \", introduced=\" << getIntroduced();\n"
1536 << " if (!getDeprecated().empty()) OS << \", deprecated=\" << getDeprecated();\n"
1537 << " if (!getObsoleted().empty()) OS << \", obsoleted=\" << getObsoleted();\n"
1538 << " if (getUnavailable()) OS << \", unavailable\";\n"
1539 << " OS << \"";
1542 static void writeDeprecatedAttrValue(raw_ostream &OS, std::string &Variety) {
1543 OS << "\\\"\" << getMessage() << \"\\\"\";\n";
1546 OS << " if (!getReplacement().empty()) OS << \", \\\"\""
1548 OS << " OS << \"";
1551 static void writeGetSpellingFunction(const Record &R, raw_ostream &OS) {
1554 OS << "const char *" << R.getName() << "Attr::getSpelling() const {\n";
1556 OS << " return \"(No spelling)\";\n}\n\n";
1560 OS << " switch (getAttributeSpellingListIndex()) {\n"
1566 OS << " case " << I << ":\n"
1569 OS << " }\n";
1571 OS << "}\n\n";
1577 raw_ostream &OS) {
1580 OS << "void " << R.getName() << "Attr::printPretty("
1581 << "raw_ostream &OS, const PrintingPolicy &Policy) const {\n";
1584 OS << "}\n\n";
1588 OS << " bool IsFirstArgument = true; (void)IsFirstArgument;\n"
1641 OS << " case " << I << " : {\n"
1642 << " OS << \"" << Prefix << Spelling << "\";\n";
1645 OS << " printPrettyPragma(OS, Policy);\n";
1646 OS << " OS << \"\\n\";";
1647 OS << " break;\n";
1648 OS << " }\n";
1653 OS << " OS << \"(";
1654 writeAvailabilityValue(OS);
1655 OS << ")\";\n";
1657 OS << " OS << \"(";
1658 writeDeprecatedAttrValue(OS, Variety);
1659 OS << ")\";\n";
1676 OS << " if (" << arg->getIsOmitted() << ")\n"
1685 OS << " if (!(" << IsOmitted << ")) {\n";
1688 OS << " DelimitAttributeArgument(OS, IsFirstArgument);\n";
1689 OS << " OS << \"";
1690 arg->writeValue(OS);
1691 OS << "\";\n";
1693 OS << " }\n";
1697 OS << " if (!IsFirstArgument)\n"
1698 << " OS << \")\";\n";
1700 OS << " OS << \"" << Suffix << "\";\n"
1706 OS << "}\n";
1708 OS << "}\n\n";
1732 static void writeAttrAccessorDefinition(const Record &R, raw_ostream &OS) {
1744 OS << " bool " << Name
1747 OS << getSpellingListIndex(SpellingList, Spellings[Index]);
1749 OS << " ||\n getAttributeSpellingListIndex() == ";
1751 OS << "; }\n";
1828 raw_ostream &OS) {
1829 OS << " switch (" << VarName << ") {\n default: "
1832 OS << " case " << I.first << ": return " << I.second << ";\n";
1833 OS << " }\n";
1896 raw_ostream &OS,
1911 OS << ".Case(\"" << I.name() << "\", 1)\n";
1917 raw_ostream &OS) {
1918 OS << "#if defined(CLANG_ATTR_LATE_PARSED_LIST)\n";
1919 emitClangAttrLateParsedListImpl(Records, OS, LateAttrParseKind::Standard);
1920 OS << "#endif // CLANG_ATTR_LATE_PARSED_LIST\n\n";
1924 raw_ostream &OS) {
1925 OS << "#if defined(CLANG_ATTR_LATE_PARSED_EXPERIMENTAL_EXT_LIST)\n";
1926 emitClangAttrLateParsedListImpl(Records, OS,
1928 OS << "#endif // CLANG_ATTR_LATE_PARSED_EXPERIMENTAL_EXT_LIST\n\n";
2054 void emitMatchRuleList(raw_ostream &OS);
2056 void generateStrictConformsTo(const Record &Attr, raw_ostream &OS);
2058 void generateParsingHelpers(raw_ostream &OS);
2158 void PragmaClangAttributeSupport::emitMatchRuleList(raw_ostream &OS) {
2159 OS << "#ifndef ATTR_MATCH_SUB_RULE\n";
2160 OS << "#define ATTR_MATCH_SUB_RULE(Value, Spelling, IsAbstract, Parent, "
2163 OS << "#endif\n";
2165 OS << (Rule.isSubRule() ? "ATTR_MATCH_SUB_RULE" : "ATTR_MATCH_RULE") << '(';
2166 OS << Rule.getEnumValueName() << ", \"" << Rule.getSpelling() << "\", "
2169 OS << ", "
2172 OS << ")\n";
2174 OS << "#undef ATTR_MATCH_SUB_RULE\n";
2254 raw_ostream &OS) {
2259 OS << "void getPragmaAttributeMatchRules("
2275 OS << " MatchRules.push_back(std::make_pair(" << Rule.getEnumValue()
2280 OS << "}\n\n";
2283 void PragmaClangAttributeSupport::generateParsingHelpers(raw_ostream &OS) {
2285 OS << "std::optional<attr::SubjectMatchRule> "
2287 OS << " return std::nullopt;\n";
2288 OS << "}\n\n";
2299 OS << "std::optional<attr::SubjectMatchRule> "
2303 OS << " if (IsUnless)\n";
2304 OS << " return "
2308 OS << " Case(\"" << Rule.getName() << "\", " << Rule.getEnumValue()
2311 OS << " Default(std::nullopt);\n";
2312 OS << " return "
2316 OS << " Case(\"" << Rule.getName() << "\", " << Rule.getEnumValue()
2319 OS << " Default(std::nullopt);\n";
2320 OS << "}\n\n";
2324 OS << "std::pair<std::optional<attr::SubjectMatchRule>, "
2327 OS << " return "
2340 OS << " Case(\"" << Rule.getName() << "\", std::make_pair("
2343 OS << " Default(std::make_pair(std::nullopt, "
2345 OS << "}\n\n";
2348 OS << "const char *validAttributeSubjectMatchSubRules("
2350 OS << " switch (Rule) {\n";
2352 OS << " case "
2355 OS << " return \"'";
2359 OS << ", '";
2362 OS << "unless(";
2363 OS << Rule.getName();
2365 OS << ')';
2366 OS << "'";
2368 OS << "\";\n";
2370 OS << " default: return nullptr;\n";
2371 OS << " }\n";
2372 OS << "}\n\n";
2391 static void emitClangAttrTypeArgList(RecordKeeper &Records, raw_ostream &OS) {
2392 OS << "#if defined(CLANG_ATTR_TYPE_ARG_LIST)\n";
2406 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
2409 OS << "#endif // CLANG_ATTR_TYPE_ARG_LIST\n\n";
2414 static void emitClangAttrArgContextList(RecordKeeper &Records, raw_ostream &OS) {
2415 OS << "#if defined(CLANG_ATTR_ARG_CONTEXT_LIST)\n";
2425 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
2428 OS << "#endif // CLANG_ATTR_ARG_CONTEXT_LIST\n\n";
2476 raw_ostream &OS) {
2477 OS << "#if defined(CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST)\n";
2487 OS << ".Case(\"" << S.name() << "\", "
2492 OS << "#endif // CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST\n\n";
2503 raw_ostream &OS) {
2504 OS << "#if defined(CLANG_ATTR_STRING_LITERAL_ARG_LIST)\n";
2556 OS << ".Case(\"" << S.name() << "\", " << MaskStr << ")\n";
2559 OS << "#endif // CLANG_ATTR_STRING_LITERAL_ARG_LIST\n\n";
2563 static void emitClangAttrIdentifierArgList(RecordKeeper &Records, raw_ostream &OS) {
2564 OS << "#if defined(CLANG_ATTR_IDENTIFIER_ARG_LIST)\n";
2575 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
2578 OS << "#endif // CLANG_ATTR_IDENTIFIER_ARG_LIST\n\n";
2583 raw_ostream &OS) {
2584 OS << "#if defined(CLANG_ATTR_STRICT_IDENTIFIER_ARG_AT_INDEX_LIST)\n";
2601 OS << ".Case(\"" << S.name() << "\", " << enumAtIndex << "ull)\n";
2604 OS << "#endif // CLANG_ATTR_STRICT_IDENTIFIER_ARG_AT_INDEX_LIST\n\n";
2616 raw_ostream &OS) {
2617 OS << "#if defined(CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST)\n";
2627 OS << ".Case(\"" << S.name() << "\", "
2632 OS << "#endif // CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST\n\n";
2636 raw_ostream &OS) {
2637 OS << "#if defined(CLANG_ATTR_ACCEPTS_EXPR_PACK)\n";
2646 OS << ".Case(\"" << S.name() << "\", true)\n";
2649 OS << "#endif // CLANG_ATTR_ACCEPTS_EXPR_PACK\n\n";
2657 static void emitFormInitializer(raw_ostream &OS,
2662 OS << "{AttributeCommonInfo::AS_" << Spelling.variety() << ", "
2669 static void emitAttributes(RecordKeeper &Records, raw_ostream &OS,
2677 OS << "static inline void DelimitAttributeArgument("
2678 << "raw_ostream& OS, bool& IsFirst) {\n"
2681 << " OS << \"(\";\n"
2683 << " OS << \", \";\n"
2717 OS << "class " << R.getName() << "Attr : public " << SuperName << " {\n";
2719 OS << "\n// " << R.getName() << "Attr implementation\n\n";
2749 Args.back()->writeDeclarations(OS);
2750 OS << "\n\n";
2766 DelayedArgs->writeDeclarations(OS);
2767 OS << "\n\n";
2772 OS << "public:\n";
2789 OS << SpellingEnum;
2799 OS << " static ";
2800 OS << R.getName() << "Attr *";
2802 OS << R.getName() << "Attr::";
2803 OS << "Create";
2805 OS << "Implicit";
2807 OS << "WithDelayedArgs";
2808 OS << "(";
2809 OS << "ASTContext &Ctx";
2814 OS << ", ";
2815 ai->writeCtorParameters(OS);
2818 OS << ", ";
2819 DelayedArgs->writeCtorParameters(OS);
2821 OS << ", const AttributeCommonInfo &CommonInfo";
2822 OS << ")";
2824 OS << ";\n";
2828 OS << " {\n";
2829 OS << " auto *A = new (Ctx) " << R.getName();
2830 OS << "Attr(Ctx, CommonInfo";
2836 OS << ", ";
2837 ai->writeImplicitCtorArgs(OS);
2840 OS << ");\n";
2842 OS << " A->setImplicit(true);\n";
2845 OS << " if (!A->isAttributeSpellingListCalculated() && "
2847 OS << " A->setAttributeSpellingListIndex(0);\n";
2850 OS << " A->setDelayedArgs(Ctx, ";
2851 DelayedArgs->writeImplicitCtorArgs(OS);
2852 OS << ");\n";
2854 OS << " return A;\n}\n\n";
2860 OS << " static ";
2861 OS << R.getName() << "Attr *";
2863 OS << R.getName() << "Attr::";
2864 OS << "Create";
2866 OS << "Implicit";
2868 OS << "WithDelayedArgs";
2869 OS << "(";
2870 OS << "ASTContext &Ctx";
2875 OS << ", ";
2876 ai->writeCtorParameters(OS);
2879 OS << ", ";
2880 DelayedArgs->writeCtorParameters(OS);
2882 OS << ", SourceRange Range";
2884 OS << " = {}";
2886 OS << ", Spelling S";
2888 OS << " = " << SemanticToSyntacticMap[0];
2890 OS << ")";
2892 OS << ";\n";
2896 OS << " {\n";
2897 OS << " AttributeCommonInfo I(Range, ";
2900 OS << "AT_" << ParsedAttrSpellingItr->first;
2902 OS << "NoSemaHandlerAttribute";
2905 OS << ", AttributeCommonInfo::Form::Implicit()";
2907 OS << ", ";
2908 emitFormInitializer(OS, Spellings[0], "0");
2910 OS << ", [&]() {\n";
2911 OS << " switch (S) {\n";
2919 OS << " case " << Name << ":\n";
2920 OS << " return AttributeCommonInfo::Form";
2921 emitFormInitializer(OS, S, Name);
2922 OS << ";\n";
2925 OS << " default:\n";
2926 OS << " llvm_unreachable(\"Unknown attribute spelling!\");\n"
2928 emitFormInitializer(OS, Spellings[0], "0");
2929 OS << ";\n"
2934 OS << ");\n";
2935 OS << " return Create";
2937 OS << "Implicit";
2939 OS << "WithDelayedArgs";
2940 OS << "(Ctx";
2945 OS << ", ";
2946 ai->writeImplicitCtorArgs(OS);
2949 OS << ", ";
2950 DelayedArgs->writeImplicitCtorArgs(OS);
2952 OS << ", I);\n";
2953 OS << "}\n\n";
2964 OS << " // Factory methods\n";
2990 OS << " ";
2992 OS << R.getName() << "Attr::";
2993 OS << R.getName()
2995 OS << '\n';
2999 OS << " , ";
3000 ai->writeCtorParameters(OS);
3001 OS << "\n";
3004 OS << " )";
3006 OS << ";\n";
3009 OS << "\n : " << SuperName << "(Ctx, CommonInfo, ";
3010 OS << "attr::" << R.getName() << ", ";
3013 OS << "/*IsLateParsed=*/";
3016 OS << "false";
3027 OS << "true";
3032 OS << ", "
3036 OS << ")\n";
3039 OS << " , ";
3041 ai->writeCtorDefaultInitializers(OS);
3043 ai->writeCtorInitializers(OS);
3045 OS << "\n";
3048 OS << " , ";
3049 DelayedArgs->writeCtorDefaultInitializers(OS);
3050 OS << "\n";
3053 OS << " {\n";
3058 ai->writeCtorBody(OS);
3060 OS << "}\n\n";
3064 OS << "\n // Constructors\n";
3088 OS << '\n';
3089 OS << " " << R.getName() << "Attr *clone(ASTContext &C) const;\n";
3090 OS << " void printPretty(raw_ostream &OS,\n"
3092 OS << " const char *getSpelling() const;\n";
3098 OS << " Spelling getSemanticSpelling() const;\n";
3100 OS << R.getName() << "Attr::Spelling " << R.getName()
3103 SemanticToSyntacticMap, OS);
3104 OS << "}\n";
3109 writeAttrAccessorDefinition(R, OS);
3113 ai->writeAccessors(OS);
3115 ai->writeAccessorDefinitions(OS);
3117 OS << "\n\n";
3123 static_cast<const EnumArgument *>(ai.get())->writeConversion(OS,
3127 OS, Header);
3132 DelayedArgs->writeAccessors(OS);
3133 DelayedArgs->writeSetter(OS);
3136 OS << R.getValueAsString("AdditionalMembers");
3137 OS << "\n\n";
3139 OS << " static bool classof(const Attr *A) { return A->getKind() == "
3142 OS << "};\n\n";
3145 DelayedArgs->writeAccessorDefinitions(OS);
3147 OS << R.getName() << "Attr *" << R.getName()
3149 OS << " auto *A = new (C) " << R.getName() << "Attr(C, *this";
3151 OS << ", ";
3152 ai->writeCloneArgs(OS);
3154 OS << ");\n";
3155 OS << " A->Inherited = Inherited;\n";
3156 OS << " A->IsPackExpansion = IsPackExpansion;\n";
3157 OS << " A->setImplicit(Implicit);\n";
3159 OS << " A->setDelayedArgs(C, ";
3160 DelayedArgs->writeCloneArgs(OS);
3161 OS << ");\n";
3163 OS << " return A;\n}\n\n";
3165 writePrettyPrintFunction(R, Args, OS);
3166 writeGetSpellingFunction(R, OS);
3171 void clang::EmitClangAttrClass(RecordKeeper &Records, raw_ostream &OS) {
3172 emitSourceFileHeader("Attribute classes' definitions", OS, Records);
3174 OS << "#ifndef LLVM_CLANG_ATTR_CLASSES_INC\n";
3175 OS << "#define LLVM_CLANG_ATTR_CLASSES_INC\n\n";
3177 emitAttributes(Records, OS, true);
3179 OS << "#endif // LLVM_CLANG_ATTR_CLASSES_INC\n";
3183 void clang::EmitClangAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
3184 emitSourceFileHeader("Attribute classes' member function definitions", OS,
3187 emitAttributes(Records, OS, false);
3194 OS << " switch (getKind()) {\n";
3200 OS << " case attr::" << R.getName() << ":\n";
3201 OS << " return cast<" << R.getName() << "Attr>(this)->" << Method
3204 OS << " }\n";
3205 OS << " llvm_unreachable(\"Unexpected attribute kind!\");\n";
3206 OS << "}\n\n";
3209 OS << "const char *Attr::getSpelling() const {\n";
3212 OS << "Attr *Attr::clone(ASTContext &C) const {\n";
3215 OS << "void Attr::printPretty(raw_ostream &OS, "
3217 EmitFunc("printPretty(OS, Policy)");
3220 static void emitAttrList(raw_ostream &OS, StringRef Class,
3223 OS << Class << "(" << Cur->getName() << ")\n";
3256 static void emitDefaultDefine(raw_ostream &OS, StringRef name,
3258 OS << "#ifndef " << name << "\n";
3259 OS << "#define " << name << "(NAME) ";
3260 if (superName) OS << superName << "(NAME)";
3261 OS << "\n#endif\n\n";
3277 void emitDefaultDefines(raw_ostream &OS) const {
3280 emitDefaultDefine(OS, Descriptor.MacroName,
3285 void emitUndefs(raw_ostream &OS) const {
3286 OS << "#undef " << Descriptor.MacroName << "\n";
3289 void emitAttrList(raw_ostream &OS) const {
3291 SubClass->emitAttrList(OS);
3294 ::emitAttrList(OS, Descriptor.MacroName, Attrs);
3302 void emitAttrRange(raw_ostream &OS) const {
3303 OS << "ATTR_RANGE(" << Descriptor.TableGenName
3367 void emitDefaultDefines(raw_ostream &OS) const {
3369 Class->emitDefaultDefines(OS);
3373 void emitUndefs(raw_ostream &OS) const {
3375 Class->emitUndefs(OS);
3379 void emitAttrLists(raw_ostream &OS) const {
3381 Classes[0]->emitAttrList(OS);
3384 void emitAttrRanges(raw_ostream &OS) const {
3386 Class->emitAttrRange(OS);
3420 void EmitClangAttrList(RecordKeeper &Records, raw_ostream &OS) {
3421 emitSourceFileHeader("List of all attributes that Clang recognizes", OS,
3427 Hierarchy.emitDefaultDefines(OS);
3428 emitDefaultDefine(OS, "PRAGMA_SPELLING_ATTR", nullptr);
3445 Hierarchy.emitAttrLists(OS);
3448 emitAttrList(OS, "PRAGMA_SPELLING_ATTR", PragmaAttrs);
3451 OS << "#ifdef ATTR_RANGE\n";
3452 Hierarchy.emitAttrRanges(OS);
3453 OS << "#undef ATTR_RANGE\n";
3454 OS << "#endif\n";
3456 Hierarchy.emitUndefs(OS);
3457 OS << "#undef PRAGMA_SPELLING_ATTR\n";
3461 void EmitClangAttrSubjectMatchRuleList(RecordKeeper &Records, raw_ostream &OS) {
3463 "List of all attribute subject matching rules that Clang recognizes", OS,
3467 emitDefaultDefine(OS, "ATTR_MATCH_RULE", nullptr);
3468 PragmaAttributeSupport.emitMatchRuleList(OS);
3469 OS << "#undef ATTR_MATCH_RULE\n";
3473 void EmitClangAttrPCHRead(RecordKeeper &Records, raw_ostream &OS) {
3474 emitSourceFileHeader("Attribute deserialization code", OS, Records);
3482 OS << " switch (Kind) {\n";
3488 OS << " case attr::" << R.getName() << ": {\n";
3490 OS << " bool isInherited = Record.readInt();\n";
3491 OS << " bool isImplicit = Record.readInt();\n";
3492 OS << " bool isPackExpansion = Record.readInt();\n";
3497 DelayedArgs->writePCHReadDecls(OS);
3503 Args.back()->writePCHReadDecls(OS);
3505 OS << " New = new (Context) " << R.getName() << "Attr(Context, Info";
3507 OS << ", ";
3508 ri->writePCHReadArgs(OS);
3510 OS << ");\n";
3512 OS << " cast<InheritableAttr>(New)->setInherited(isInherited);\n";
3513 OS << " New->setImplicit(isImplicit);\n";
3514 OS << " New->setPackExpansion(isPackExpansion);\n";
3516 OS << " cast<" << R.getName()
3518 DelayedArgs->writePCHReadArgs(OS);
3519 OS << ");\n";
3521 OS << " break;\n";
3522 OS << " }\n";
3524 OS << " }\n";
3528 void EmitClangAttrPCHWrite(RecordKeeper &Records, raw_ostream &OS) {
3529 emitSourceFileHeader("Attribute serialization code", OS, Records);
3534 OS << " switch (A->getKind()) {\n";
3539 OS << " case attr::" << R.getName() << ": {\n";
3542 OS << " const auto *SA = cast<" << R.getName()
3545 OS << " Record.push_back(SA->isInherited());\n";
3546 OS << " Record.push_back(A->isImplicit());\n";
3547 OS << " Record.push_back(A->isPackExpansion());\n";
3549 VariadicExprArgument("DelayedArgs", R.getName()).writePCHWrite(OS);
3552 createArgument(*Arg, R.getName())->writePCHWrite(OS);
3553 OS << " break;\n";
3554 OS << " }\n";
3556 OS << " }\n";
3645 raw_ostream &OS, const std::string &Variety,
3712 OS << " .Case(\"" << Spelling.name() << "\", " << TestStr << ")\n";
3714 OS << " .Default(0);\n";
3721 raw_ostream &OS) {
3725 OS);
3736 OS << "KEYWORD_ATTRIBUTE("
3740 OS << "#undef KEYWORD_ATTRIBUTE\n";
3744 void EmitClangAttrHasAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
3745 emitSourceFileHeader("Code to implement the __has_attribute logic", OS,
3780 OS << "const llvm::Triple &T = Target.getTriple();\n";
3781 OS << "switch (Syntax) {\n";
3782 OS << "case AttributeCommonInfo::Syntax::AS_GNU:\n";
3783 OS << " return llvm::StringSwitch<int>(Name)\n";
3784 GenerateHasAttrSpellingStringSwitch(GNU, OS, "GNU");
3785 OS << "case AttributeCommonInfo::Syntax::AS_Declspec:\n";
3786 OS << " return llvm::StringSwitch<int>(Name)\n";
3787 GenerateHasAttrSpellingStringSwitch(Declspec, OS, "Declspec");
3788 OS << "case AttributeCommonInfo::Syntax::AS_Microsoft:\n";
3789 OS << " return llvm::StringSwitch<int>(Name)\n";
3790 GenerateHasAttrSpellingStringSwitch(Microsoft, OS, "Microsoft");
3791 OS << "case AttributeCommonInfo::Syntax::AS_Pragma:\n";
3792 OS << " return llvm::StringSwitch<int>(Name)\n";
3793 GenerateHasAttrSpellingStringSwitch(Pragma, OS, "Pragma");
3794 OS << "case AttributeCommonInfo::Syntax::AS_HLSLAnnotation:\n";
3795 OS << " return llvm::StringSwitch<int>(Name)\n";
3796 GenerateHasAttrSpellingStringSwitch(HLSLAnnotation, OS, "HLSLAnnotation");
3797 auto fn = [&OS](const char *Spelling,
3802 OS << "case AttributeCommonInfo::Syntax::AS_" << Spelling << ": {\n";
3806 OS << " else ";
3808 OS << "if (ScopeName == \"\") {\n";
3810 OS << "if (ScopeName == \"" << I->first << "\") {\n";
3811 OS << " return llvm::StringSwitch<int>(Name)\n";
3812 GenerateHasAttrSpellingStringSwitch(I->second, OS, Spelling, I->first);
3813 OS << "}";
3815 OS << "\n} break;\n";
3819 OS << "case AttributeCommonInfo::Syntax::AS_Keyword:\n";
3820 OS << "case AttributeCommonInfo::Syntax::AS_ContextSensitiveKeyword:\n";
3821 OS << " llvm_unreachable(\"hasAttribute not supported for keyword\");\n";
3822 OS << " return 0;\n";
3823 OS << "case AttributeCommonInfo::Syntax::AS_Implicit:\n";
3824 OS << " llvm_unreachable (\"hasAttribute not supported for "
3826 OS << " return 0;\n";
3828 OS << "}\n";
3831 void EmitClangAttrSpellingListIndex(RecordKeeper &Records, raw_ostream &OS) {
3834 OS, Records);
3836 OS << " switch (getParsedKind()) {\n";
3837 OS << " case IgnoredAttribute:\n";
3838 OS << " case UnknownAttribute:\n";
3839 OS << " case NoSemaHandlerAttribute:\n";
3840 OS << " llvm_unreachable(\"Ignored/unknown shouldn't get here\");\n";
3846 OS << " case AT_" << I.first << ": {\n";
3848 OS << " if (Name == \"" << Spellings[I].name() << "\" && "
3854 OS << " break;\n";
3855 OS << " }\n";
3858 OS << " }\n";
3859 OS << " return 0;\n";
3863 void EmitClangAttrASTVisitor(RecordKeeper &Records, raw_ostream &OS) {
3864 emitSourceFileHeader("Used by RecursiveASTVisitor to visit attributes.", OS,
3872 OS << "#ifdef ATTR_VISITOR_DECLS_ONLY\n\n";
3877 OS << " bool Traverse"
3879 OS << " bool Visit"
3884 OS << "\n#else // ATTR_VISITOR_DECLS_ONLY\n\n";
3892 OS << "template <typename Derived>\n"
3902 createArgument(*Arg, R.getName())->writeASTVisitorTraversal(OS);
3906 .writeASTVisitorTraversal(OS);
3908 OS << " return true;\n";
3909 OS << "}\n\n";
3913 OS << "template <typename Derived>\n"
3925 OS << " case attr::" << R.getName() << ":\n"
3929 OS << " }\n"; // end switch
3930 OS << " llvm_unreachable(\"bad attribute kind\");\n";
3931 OS << "}\n"; // end function
3932 OS << "#endif // ATTR_VISITOR_DECLS_ONLY\n";
3936 raw_ostream &OS,
3939 OS << " switch (At->getKind()) {\n";
3944 OS << " case attr::" << R.getName() << ": {\n";
3950 OS << " return nullptr;\n";
3951 OS << " }\n";
3955 OS << " const auto *A = cast<"
3960 OS << " return A->clone(C);\n";
3961 OS << " }\n";
3973 ai->writeTemplateInstantiation(OS);
3975 OS << " return new (C) " << R.getName() << "Attr(C, *A";
3977 OS << ", ";
3978 ai->writeTemplateInstantiationArgs(OS);
3980 OS << ");\n"
3983 OS << " } // end switch\n"
3989 void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS) {
3990 emitSourceFileHeader("Template instantiation code for attributes", OS,
3995 OS << "namespace clang {\n"
4000 EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/false);
4001 OS << "}\n\n"
4005 EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/true);
4006 OS << "}\n\n"
4012 void EmitClangAttrParsedAttrList(RecordKeeper &Records, raw_ostream &OS) {
4013 emitSourceFileHeader("List of all attributes that Clang recognizes", OS,
4016 OS << "#ifndef PARSED_ATTR\n";
4017 OS << "#define PARSED_ATTR(NAME) NAME\n";
4018 OS << "#endif\n\n";
4022 OS << "PARSED_ATTR(" << I.first << ")\n";
4030 static void emitArgInfo(const Record &R, raw_ostream &OS) {
4050 OS << " /*NumArgs=*/" << ArgCount << ",\n";
4051 OS << " /*OptArgs=*/" << (HasVariadic ? 15 : OptCount) << ",\n";
4052 OS << " /*NumArgMembers=*/" << ArgMemberCount << ",\n";
4133 static void GenerateCustomAppertainsTo(const Record &Subject, raw_ostream &OS) {
4152 OS << "static bool " << FnName << "(const Decl *D) {\n";
4153 OS << " if (const auto *S = dyn_cast<";
4154 OS << GetSubjectWithSuffix(Base);
4155 OS << ">(D))\n";
4156 OS << " return " << Subject.getValueAsString("CheckCode") << ";\n";
4157 OS << " return false;\n";
4158 OS << "}\n\n";
4163 static void GenerateAppertainsTo(const Record &Attr, raw_ostream &OS) {
4199 OS << "bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, ";
4200 OS << "const Decl *D) const override {\n";
4201 OS << " S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)\n";
4202 OS << " << AL << AL.isRegularKeywordAttribute() << "
4204 OS << " return false;\n";
4205 OS << "}\n\n";
4210 OS << "bool diagAppertainsToDecl(Sema &S, ";
4211 OS << "const ParsedAttr &Attr, const Decl *D) const override {\n";
4212 OS << " if (";
4220 OS << "!" << functionNameForCustomAppertainsTo(**I) << "(D)";
4222 OS << "!isa<" << GetSubjectWithSuffix(*I) << ">(D)";
4225 OS << " && ";
4227 OS << ") {\n";
4228 OS << " S.Diag(Attr.getLoc(), diag::";
4229 OS << (Warn ? "warn_attribute_wrong_decl_type_str"
4231 OS << ")\n";
4232 OS << " << Attr << Attr.isRegularKeywordAttribute() << ";
4233 OS << CalculateDiagnostic(*SubjectObj) << ";\n";
4234 OS << " return false;\n";
4235 OS << " }\n";
4236 OS << " return true;\n";
4237 OS << "}\n\n";
4244 OS << "bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, ";
4245 OS << "const Stmt *St) const override {\n";
4246 OS << " S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)\n";
4247 OS << " << AL << AL.isRegularKeywordAttribute() << "
4249 OS << " return false;\n";
4250 OS << "}\n\n";
4254 OS << "bool diagAppertainsToStmt(Sema &S, ";
4255 OS << "const ParsedAttr &Attr, const Stmt *St) const override {\n";
4256 OS << " if (";
4258 OS << "!isa<" << (*I)->getName() << ">(St)";
4260 OS << " && ";
4262 OS << ") {\n";
4263 OS << " S.Diag(Attr.getLoc(), diag::";
4264 OS << (Warn ? "warn_attribute_wrong_decl_type_str"
4266 OS << ")\n";
4267 OS << " << Attr << Attr.isRegularKeywordAttribute() << ";
4268 OS << CalculateDiagnostic(*SubjectObj) << ";\n";
4269 OS << " return false;\n";
4270 OS << " }\n";
4271 OS << " return true;\n";
4272 OS << "}\n\n";
4277 // written into OS and the checks for merging declaration attributes are
4281 raw_ostream &OS,
4327 OS << " using ParsedAttrInfo::diagMutualExclusion;\n\n";
4333 OS << " bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, "
4336 OS << " if (const auto *A = D->getAttr<" << A << ">()) {\n";
4337 OS << " S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible)"
4340 OS << " S.Diag(A->getLocation(), diag::note_conflicting_attribute);";
4341 OS << " \nreturn false;\n";
4342 OS << " }\n";
4344 OS << " return true;\n";
4345 OS << " }\n\n";
4413 raw_ostream &OS) {
4414 OS << "static bool checkAttributeMatchRuleAppliesTo(const Decl *D, "
4416 OS << " switch (rule) {\n";
4419 OS << " case " << Rule.getEnumValue() << ":\n";
4420 OS << " assert(false && \"Abstract matcher rule isn't allowed\");\n";
4421 OS << " return false;\n";
4426 OS << " case " << Rule.getEnumValue() << ":\n";
4427 OS << " return ";
4433 OS << functionNameForCustomAppertainsTo(**I) << "(D)";
4435 OS << "isa<" << GetSubjectWithSuffix(*I) << ">(D)";
4438 OS << " || ";
4440 OS << ";\n";
4442 OS << " }\n";
4443 OS << " llvm_unreachable(\"Invalid match rule\");\nreturn false;\n";
4444 OS << "}\n\n";
4448 raw_ostream &OS) {
4455 OS << "bool acceptsLangOpts(const LangOptions &LangOpts) const override {\n";
4456 OS << " return " << GenerateTestExpression(LangOpts) << ";\n";
4457 OS << "}\n\n";
4462 raw_ostream &OS) {
4494 OS << "bool existsInTarget(const TargetInfo &Target) const override {\n";
4496 OS << " const llvm::Triple &T = Target.getTriple(); (void)T;\n";
4497 OS << " return " << Test << ";\n";
4498 OS << "}\n\n";
4504 raw_ostream &OS) {
4538 OS << "bool spellingExistsInTarget(const TargetInfo &Target,\n";
4539 OS << " const unsigned SpellingListIndex) const "
4542 OS << " const llvm::Triple &T = Target.getTriple(); (void)T;\n";
4543 OS << " return " << Test << ";\n", OS << "}\n\n";
4547 raw_ostream &OS) {
4564 OS << "unsigned spellingIndexToSemanticSpelling(";
4565 OS << "const ParsedAttr &Attr) const override {\n";
4566 OS << Enum;
4567 OS << " unsigned Idx = Attr.getAttributeSpellingListIndex();\n";
4568 WriteSemanticSpellingSwitch("Idx", SemanticToSyntacticMap, OS);
4569 OS << "}\n\n";
4572 static void GenerateHandleDeclAttribute(const Record &Attr, raw_ostream &OS) {
4578 OS << "AttrHandling handleDeclAttribute(Sema &S, Decl *D,";
4579 OS << "const ParsedAttr &Attr) const override {\n";
4580 OS << " D->addAttr(::new (S.Context) " << Attr.getName();
4581 OS << "Attr(S.Context, Attr));\n";
4582 OS << " return AttributeApplied;\n";
4583 OS << "}\n\n";
4595 void GenerateIsParamExpr(const Record &Attr, raw_ostream &OS) {
4596 OS << "bool isParamExpr(size_t N) const override {\n";
4597 OS << " return ";
4601 OS << "(N == " << I << ") || ";
4602 OS << "false;\n";
4603 OS << "}\n\n";
4606 void GenerateHandleAttrWithDelayedArgs(RecordKeeper &Records, raw_ostream &OS) {
4607 OS << "static void handleAttrWithDelayedArgs(Sema &S, Decl *D, ";
4608 OS << "const ParsedAttr &Attr) {\n";
4609 OS << " SmallVector<Expr *, 4> ArgExprs;\n";
4610 OS << " ArgExprs.reserve(Attr.getNumArgs());\n";
4611 OS << " for (unsigned I = 0; I < Attr.getNumArgs(); ++I) {\n";
4612 OS << " assert(!Attr.isArgIdent(I));\n";
4613 OS << " ArgExprs.push_back(Attr.getArgAsExpr(I));\n";
4614 OS << " }\n";
4615 OS << " clang::Attr *CreatedAttr = nullptr;\n";
4616 OS << " switch (Attr.getKind()) {\n";
4617 OS << " default:\n";
4618 OS << " llvm_unreachable(\"Attribute cannot hold delayed arguments.\");\n";
4624 OS << " case ParsedAttr::AT_" << I.first << ": {\n";
4625 OS << " CreatedAttr = " << R.getName() << "Attr::CreateWithDelayedArgs";
4626 OS << "(S.Context, ArgExprs.data(), ArgExprs.size(), Attr);\n";
4627 OS << " break;\n";
4628 OS << " }\n";
4630 OS << " }\n";
4631 OS << " D->addAttr(CreatedAttr);\n";
4632 OS << "}\n\n";
4644 void EmitClangAttrParsedAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
4645 emitSourceFileHeader("Parsed attribute helpers", OS, Records);
4647 OS << "#if !defined(WANT_DECL_MERGE_LOGIC) && "
4666 GenerateCustomAppertainsTo(*Subject, OS);
4689 OS << "static constexpr ParsedAttrInfo::Spelling " << I->first
4700 OS << " {AttributeCommonInfo::AS_" << S.variety();
4701 OS << ", \"" << Spelling << "\"},\n";
4703 OS << "};\n";
4720 OS << "static constexpr const char *" << I->first << "ArgNames[] = {\n";
4722 OS << '"' << N << "\",";
4723 OS << "};\n";
4726 OS << "struct ParsedAttrInfo" << I->first
4728 OS << " constexpr ParsedAttrInfo" << I->first << "() : ParsedAttrInfo(\n";
4729 OS << " /*AttrKind=*/ParsedAttr::AT_" << AttrName << ",\n";
4730 emitArgInfo(Attr, OS);
4731 OS << " /*HasCustomParsing=*/";
4732 OS << Attr.getValueAsBit("HasCustomParsing") << ",\n";
4733 OS << " /*AcceptsExprPack=*/";
4734 OS << Attr.getValueAsBit("AcceptsExprPack") << ",\n";
4735 OS << " /*IsTargetSpecific=*/";
4736 OS << Attr.isSubClassOf("TargetSpecificAttr") << ",\n";
4737 OS << " /*IsType=*/";
4738 OS << (Attr.isSubClassOf("TypeAttr") || Attr.isSubClassOf("DeclOrTypeAttr"))
4740 OS << " /*IsStmt=*/";
4741 OS << (Attr.isSubClassOf("StmtAttr") || Attr.isSubClassOf("DeclOrStmtAttr"))
4743 OS << " /*IsKnownToGCC=*/";
4744 OS << IsKnownToGCC(Attr) << ",\n";
4745 OS << " /*IsSupportedByPragmaAttribute=*/";
4746 OS << PragmaAttributeSupport.isAttributedSupported(*I->second) << ",\n";
4748 OS << " /*Spellings=*/" << I->first << "Spellings,\n";
4750 OS << " /*Spellings=*/{},\n";
4752 OS << " /*ArgNames=*/" << I->first << "ArgNames";
4754 OS << " /*ArgNames=*/{}";
4755 OS << ") {}\n";
4756 GenerateAppertainsTo(Attr, OS);
4757 GenerateMutualExclusionsChecks(Attr, Records, OS, MergeDeclOS, MergeStmtOS);
4758 GenerateLangOptRequirements(Attr, OS);
4759 GenerateTargetRequirements(Attr, Dupes, OS);
4761 Attr, Attr.getValueAsListOfDefs("TargetSpecificSpellings"), OS);
4762 GenerateSpellingIndexToSemanticSpelling(Attr, OS);
4763 PragmaAttributeSupport.generateStrictConformsTo(*I->second, OS);
4764 GenerateHandleDeclAttribute(Attr, OS);
4765 GenerateIsParamExpr(Attr, OS);
4766 OS << "static const ParsedAttrInfo" << I->first << " Instance;\n";
4767 OS << "};\n";
4768 OS << "const ParsedAttrInfo" << I->first << " ParsedAttrInfo" << I->first
4772 OS << "static const ParsedAttrInfo *AttrInfoMap[] = {\n";
4774 OS << "&ParsedAttrInfo" << I->first << "::Instance,\n";
4776 OS << "};\n\n";
4779 GenerateHandleAttrWithDelayedArgs(Records, OS);
4782 emitAttributeMatchRules(PragmaAttributeSupport, OS);
4784 OS << "#elif defined(WANT_DECL_MERGE_LOGIC)\n\n";
4787 OS << "static bool DiagnoseMutualExclusions(Sema &S, const NamedDecl *D, "
4789 OS << DeclMergeChecks;
4790 OS << " return true;\n";
4791 OS << "}\n\n";
4793 OS << "#elif defined(WANT_STMT_MERGE_LOGIC)\n\n";
4796 OS << "static bool DiagnoseMutualExclusions(Sema &S, "
4798 OS << " for (const Attr *A : C) {\n";
4799 OS << StmtMergeChecks;
4800 OS << " }\n";
4801 OS << " return true;\n";
4802 OS << "}\n\n";
4804 OS << "#endif\n";
4808 void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream &OS) {
4809 emitSourceFileHeader("Attribute name matcher", OS, Records);
4884 OS << "static AttributeCommonInfo::Kind getAttrKind(StringRef Name, ";
4885 OS << "AttributeCommonInfo::Syntax Syntax) {\n";
4886 OS << " if (AttributeCommonInfo::AS_GNU == Syntax) {\n";
4887 StringMatcher("Name", GNU, OS).Emit();
4888 OS << " } else if (AttributeCommonInfo::AS_Declspec == Syntax) {\n";
4889 StringMatcher("Name", Declspec, OS).Emit();
4890 OS << " } else if (AttributeCommonInfo::AS_Microsoft == Syntax) {\n";
4891 StringMatcher("Name", Microsoft, OS).Emit();
4892 OS << " } else if (AttributeCommonInfo::AS_CXX11 == Syntax) {\n";
4893 StringMatcher("Name", CXX11, OS).Emit();
4894 OS << " } else if (AttributeCommonInfo::AS_C23 == Syntax) {\n";
4895 StringMatcher("Name", C23, OS).Emit();
4896 OS << " } else if (AttributeCommonInfo::AS_Keyword == Syntax || ";
4897 OS << "AttributeCommonInfo::AS_ContextSensitiveKeyword == Syntax) {\n";
4898 StringMatcher("Name", Keywords, OS).Emit();
4899 OS << " } else if (AttributeCommonInfo::AS_Pragma == Syntax) {\n";
4900 StringMatcher("Name", Pragma, OS).Emit();
4901 OS << " } else if (AttributeCommonInfo::AS_HLSLAnnotation == Syntax) {\n";
4902 StringMatcher("Name", HLSLAnnotation, OS).Emit();
4903 OS << " }\n";
4904 OS << " return AttributeCommonInfo::UnknownAttribute;\n"
4909 void EmitClangAttrTextNodeDump(RecordKeeper &Records, raw_ostream &OS) {
4910 emitSourceFileHeader("Attribute text node dumper", OS, Records);
4927 SS << " OS << \" \" << A->getSpelling();\n";
4934 VariadicExprArgument("DelayedArgs", R.getName()).writeDump(OS);
4937 OS << " void Visit" << R.getName() << "Attr(const " << R.getName()
4940 OS << " const auto *SA = cast<" << R.getName()
4942 OS << FunctionContent;
4943 OS << " }\n";
4948 void EmitClangAttrNodeTraverse(RecordKeeper &Records, raw_ostream &OS) {
4949 emitSourceFileHeader("Attribute text node traverser", OS, Records);
4966 OS << " void Visit" << R.getName() << "Attr(const " << R.getName()
4969 OS << " const auto *SA = cast<" << R.getName()
4971 OS << FunctionContent;
4972 OS << " }\n";
4977 void EmitClangAttrParserStringSwitches(RecordKeeper &Records, raw_ostream &OS) {
4978 emitSourceFileHeader("Parser-related llvm::StringSwitch cases", OS, Records);
4979 emitClangAttrArgContextList(Records, OS);
4980 emitClangAttrIdentifierArgList(Records, OS);
4981 emitClangAttrUnevaluatedStringLiteralList(Records, OS);
4982 emitClangAttrVariadicIdentifierArgList(Records, OS);
4983 emitClangAttrThisIsaIdentifierArgList(Records, OS);
4984 emitClangAttrAcceptsExprPack(Records, OS);
4985 emitClangAttrTypeArgList(Records, OS);
4986 emitClangAttrLateParsedList(Records, OS);
4987 emitClangAttrLateParsedExperimentalList(Records, OS);
4988 emitClangAttrStrictIdentifierArgAtIndexList(Records, OS);
4992 raw_ostream &OS) {
4993 getPragmaAttributeSupport(Records).generateParsingHelpers(OS);
4996 void EmitClangAttrDocTable(RecordKeeper &Records, raw_ostream &OS) {
4997 emitSourceFileHeader("Clang attribute documentation", OS, Records);
5009 OS << "\nstatic const char AttrDoc_" << A->getName() << "[] = "
5081 raw_ostream &OS) {
5083 OS << Name << "\n" << std::string(Name.size(), '=') << "\n";
5088 OS << ContentStr.trim();
5090 OS << "\n\n";
5146 const DocumentationData &Doc, raw_ostream &OS) {
5147 OS << Doc.Heading << "\n" << std::string(Doc.Heading.length(), '-') << "\n";
5152 OS << ".. csv-table:: Supported Syntaxes\n";
5153 OS << " :header: \"GNU\", \"C++11\", \"C23\", \"``__declspec``\",";
5154 OS << " \"Keyword\", \"``#pragma``\", \"HLSL Annotation\", \"``#pragma "
5156 OS << "attribute``\"\n\n \"";
5167 OS << " |br| ";
5168 OS << "``" << Spelling << "``";
5172 OS << "\",\"";
5177 OS << "Yes";
5178 OS << "\"\n\n";
5183 OS << "This attribute has been deprecated, and may be removed in a future "
5188 OS << " This attribute has been superseded by ``" << Replacement
5190 OS << "\n\n";
5195 OS << ContentStr.trim();
5197 OS << "\n\n\n";
5200 void EmitClangAttrDocs(RecordKeeper &Records, raw_ostream &OS) {
5209 OS << Documentation->getValueAsString("Intro") << "\n";
5246 WriteCategoryHeader(I.first, OS);
5256 WriteDocumentation(Records, Doc, OS);
5261 raw_ostream &OS) {
5264 OS << "#pragma clang attribute supports the following attributes:\n";
5268 OS << I.first;
5270 OS << " ()\n";
5276 OS << " (";
5282 OS << ", ";
5287 OS << RuleSet.getRule().getEnumValueName();
5290 OS << "(";
5293 OS << ", ";
5294 OS << Rule.value().getEnumValueName();
5296 OS << ")";
5298 OS << ")\n";
5300 OS << "End of supported attributes.\n";