Lines Matching refs:OS

247     virtual void writeAccessors(raw_ostream &OS) const = 0;
248 virtual void writeAccessorDefinitions(raw_ostream &OS) const {}
249 virtual void writeASTVisitorTraversal(raw_ostream &OS) const {}
250 virtual void writeCloneArgs(raw_ostream &OS) const = 0;
251 virtual void writeTemplateInstantiationArgs(raw_ostream &OS) const = 0;
252 virtual void writeTemplateInstantiation(raw_ostream &OS) const {}
253 virtual void writeCtorBody(raw_ostream &OS) const {}
254 virtual void writeCtorInitializers(raw_ostream &OS) const = 0;
255 virtual void writeCtorDefaultInitializers(raw_ostream &OS) const = 0;
256 virtual void writeCtorParameters(raw_ostream &OS) const = 0;
257 virtual void writeDeclarations(raw_ostream &OS) const = 0;
258 virtual void writePCHReadArgs(raw_ostream &OS) const = 0;
259 virtual void writePCHReadDecls(raw_ostream &OS) const = 0;
260 virtual void writePCHWrite(raw_ostream &OS) const = 0;
262 virtual void writeValue(raw_ostream &OS) const = 0;
263 virtual void writeDump(raw_ostream &OS) const = 0;
264 virtual void writeDumpChildren(raw_ostream &OS) const {}
265 virtual void writeHasChildren(raw_ostream &OS) const { OS << "false"; }
271 virtual void writeImplicitCtorArgs(raw_ostream &OS) const {
272 OS << getUpperName();
285 void writeAccessors(raw_ostream &OS) const override {
286 OS << " " << type << " get" << getUpperName() << "() const {\n";
287 OS << " return " << getLowerName() << ";\n";
288 OS << " }";
291 void writeCloneArgs(raw_ostream &OS) const override {
292 OS << getLowerName();
295 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
296 OS << "A->get" << getUpperName() << "()";
299 void writeCtorInitializers(raw_ostream &OS) const override {
300 OS << getLowerName() << "(" << getUpperName() << ")";
303 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
304 OS << getLowerName() << "()";
307 void writeCtorParameters(raw_ostream &OS) const override {
308 OS << type << " " << getUpperName();
311 void writeDeclarations(raw_ostream &OS) const override {
312 OS << type << " " << getLowerName() << ";";
315 void writePCHReadDecls(raw_ostream &OS) const override {
317 OS << " " << type << " " << getLowerName() << " = " << read << ";\n";
320 void writePCHReadArgs(raw_ostream &OS) const override {
321 OS << getLowerName();
324 void writePCHWrite(raw_ostream &OS) const override {
325 OS << " "
346 void writeValue(raw_ostream &OS) const override {
348 OS << "\" << get" << getUpperName()
353 OS << "\" << (get" << getUpperName() << "() ? get" << getUpperName()
356 OS << "\" << get" << getUpperName() << "()->getName() << \"";
358 OS << "\" << get" << getUpperName() << "().getAsString() << \"";
360 OS << "\" << get" << getUpperName() << "().getSourceIndex() << \"";
362 OS << "\" << get" << getUpperName() << "() << \"";
365 void writeDump(raw_ostream &OS) const override {
367 OS << " OS << \" \";\n";
368 OS << " dumpBareDeclRef(SA->get" << getUpperName() << "());\n";
372 OS << " if (SA->get" << getUpperName() << "())\n"
373 << " OS << \" \" << SA->get" << getUpperName()
377 OS << " if (SA->get" << getUpperName() << "Loc())";
378 OS << " OS << \" \" << SA->get" << getUpperName()
381 OS << " if (SA->get" << getUpperName() << "()) OS << \" "
384 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
387 OS << " if (SA->get" << getUpperName() << "().isValid())\n ";
388 OS << " OS << \" \" << SA->get" << getUpperName()
391 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
406 void writeAccessors(raw_ostream &OS) const override {
407 SimpleArgument::writeAccessors(OS);
409 OS << "\n\n static const " << getType() << " Default" << getUpperName()
412 OS << (Default != 0 ? "true" : "false");
414 OS << Default;
415 OS << ";";
425 void writeAccessors(raw_ostream &OS) const override {
426 OS << " llvm::StringRef get" << getUpperName() << "() const {\n";
427 OS << " return llvm::StringRef(" << getLowerName() << ", "
429 OS << " }\n";
430 OS << " unsigned get" << getUpperName() << "Length() const {\n";
431 OS << " return " << getLowerName() << "Length;\n";
432 OS << " }\n";
433 OS << " void set" << getUpperName()
435 OS << " " << getLowerName() << "Length = S.size();\n";
436 OS << " this->" << getLowerName() << " = new (C, 1) char ["
438 OS << " if (!S.empty())\n";
439 OS << " std::memcpy(this->" << getLowerName() << ", S.data(), "
441 OS << " }";
444 void writeCloneArgs(raw_ostream &OS) const override {
445 OS << "get" << getUpperName() << "()";
448 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
449 OS << "A->get" << getUpperName() << "()";
452 void writeCtorBody(raw_ostream &OS) const override {
453 OS << " if (!" << getUpperName() << ".empty())\n";
454 OS << " std::memcpy(" << getLowerName() << ", " << getUpperName()
458 void writeCtorInitializers(raw_ostream &OS) const override {
459 OS << getLowerName() << "Length(" << getUpperName() << ".size()),"
464 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
465 OS << getLowerName() << "Length(0)," << getLowerName() << "(nullptr)";
468 void writeCtorParameters(raw_ostream &OS) const override {
469 OS << "llvm::StringRef " << getUpperName();
472 void writeDeclarations(raw_ostream &OS) const override {
473 OS << "unsigned " << getLowerName() << "Length;\n";
474 OS << "char *" << getLowerName() << ";";
477 void writePCHReadDecls(raw_ostream &OS) const override {
478 OS << " std::string " << getLowerName()
482 void writePCHReadArgs(raw_ostream &OS) const override {
483 OS << getLowerName();
486 void writePCHWrite(raw_ostream &OS) const override {
487 OS << " Record.AddString(SA->get" << getUpperName() << "());\n";
490 void writeValue(raw_ostream &OS) const override {
491 OS << "\\\"\" << get" << getUpperName() << "() << \"\\\"";
494 void writeDump(raw_ostream &OS) const override {
495 OS << " OS << \" \\\"\" << SA->get" << getUpperName()
506 void writeAccessors(raw_ostream &OS) const override {
507 OS << " bool is" << getUpperName() << "Dependent() const;\n";
508 OS << " bool is" << getUpperName() << "ErrorDependent() const;\n";
510 OS << " unsigned get" << getUpperName() << "(ASTContext &Ctx) const;\n";
512 OS << " bool is" << getUpperName() << "Expr() const {\n";
513 OS << " return is" << getLowerName() << "Expr;\n";
514 OS << " }\n";
516 OS << " Expr *get" << getUpperName() << "Expr() const {\n";
517 OS << " assert(is" << getLowerName() << "Expr);\n";
518 OS << " return " << getLowerName() << "Expr;\n";
519 OS << " }\n";
521 OS << " TypeSourceInfo *get" << getUpperName() << "Type() const {\n";
522 OS << " assert(!is" << getLowerName() << "Expr);\n";
523 OS << " return " << getLowerName() << "Type;\n";
524 OS << " }";
526 OS << " std::optional<unsigned> getCached" << getUpperName()
528 OS << " return " << getLowerName() << "Cache;\n";
529 OS << " }";
531 OS << " void setCached" << getUpperName()
533 OS << " " << getLowerName() << "Cache = AlignVal;\n";
534 OS << " }";
537 void writeAccessorDefinitions(raw_ostream &OS) const override {
538 OS << "bool " << getAttrName() << "Attr::is" << getUpperName()
540 OS << " if (is" << getLowerName() << "Expr)\n";
541 OS << " return " << getLowerName() << "Expr && (" << getLowerName()
544 OS << " else\n";
545 OS << " return " << getLowerName()
547 OS << "}\n";
549 OS << "bool " << getAttrName() << "Attr::is" << getUpperName()
551 OS << " if (is" << getLowerName() << "Expr)\n";
552 OS << " return " << getLowerName() << "Expr && " << getLowerName()
554 OS << " return " << getLowerName()
556 OS << "}\n";
559 void writeASTVisitorTraversal(raw_ostream &OS) const override {
561 OS << " if (A->is" << Name << "Expr()) {\n"
570 void writeCloneArgs(raw_ostream &OS) const override {
571 OS << "is" << getLowerName() << "Expr, is" << getLowerName()
577 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
582 void writeCtorBody(raw_ostream &OS) const override {
583 OS << " if (is" << getLowerName() << "Expr)\n";
584 OS << " " << getLowerName() << "Expr = reinterpret_cast<Expr *>("
586 OS << " else\n";
587 OS << " " << getLowerName()
592 void writeCtorInitializers(raw_ostream &OS) const override {
593 OS << "is" << getLowerName() << "Expr(Is" << getUpperName() << "Expr)";
596 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
597 OS << "is" << getLowerName() << "Expr(false)";
600 void writeCtorParameters(raw_ostream &OS) const override {
601 OS << "bool Is" << getUpperName() << "Expr, void *" << getUpperName();
604 void writeImplicitCtorArgs(raw_ostream &OS) const override {
605 OS << "Is" << getUpperName() << "Expr, " << getUpperName();
608 void writeDeclarations(raw_ostream &OS) const override {
609 OS << "bool is" << getLowerName() << "Expr;\n";
610 OS << "union {\n";
611 OS << "Expr *" << getLowerName() << "Expr;\n";
612 OS << "TypeSourceInfo *" << getLowerName() << "Type;\n";
613 OS << "};\n";
614 OS << "std::optional<unsigned> " << getLowerName() << "Cache;\n";
617 void writePCHReadArgs(raw_ostream &OS) const override {
618 OS << "is" << getLowerName() << "Expr, " << getLowerName() << "Ptr";
621 void writePCHReadDecls(raw_ostream &OS) const override {
622 OS << " bool is" << getLowerName() << "Expr = Record.readInt();\n";
623 OS << " void *" << getLowerName() << "Ptr;\n";
624 OS << " if (is" << getLowerName() << "Expr)\n";
625 OS << " " << getLowerName() << "Ptr = Record.readExpr();\n";
626 OS << " else\n";
627 OS << " " << getLowerName()
631 void writePCHWrite(raw_ostream &OS) const override {
632 OS << " Record.push_back(SA->is" << getUpperName() << "Expr());\n";
633 OS << " if (SA->is" << getUpperName() << "Expr())\n";
634 OS << " Record.AddStmt(SA->get" << getUpperName() << "Expr());\n";
635 OS << " else\n";
636 OS << " Record.AddTypeSourceInfo(SA->get" << getUpperName()
646 void writeValue(raw_ostream &OS) const override {
647 OS << "\";\n";
648 OS << " if (is" << getLowerName() << "Expr && " << getLowerName()
650 OS << " " << getLowerName()
651 << "Expr->printPretty(OS, nullptr, Policy);\n";
652 OS << " if (!is" << getLowerName() << "Expr && " << getLowerName()
654 OS << " " << getLowerName()
655 << "Type->getType().print(OS, Policy);\n";
656 OS << " OS << \"";
659 void writeDump(raw_ostream &OS) const override {
660 OS << " if (!SA->is" << getUpperName() << "Expr())\n";
661 OS << " dumpType(SA->get" << getUpperName()
665 void writeDumpChildren(raw_ostream &OS) const override {
666 OS << " if (SA->is" << getUpperName() << "Expr())\n";
667 OS << " Visit(SA->get" << getUpperName() << "Expr());\n";
670 void writeHasChildren(raw_ostream &OS) const override {
671 OS << "SA->is" << getUpperName() << "Expr()";
679 // Assumed to receive a parameter: raw_ostream OS.
680 virtual void writeValueImpl(raw_ostream &OS) const {
681 OS << " OS << Val;\n";
683 // Assumed to receive a parameter: raw_ostream OS.
684 virtual void writeDumpImpl(raw_ostream &OS) const {
685 OS << " OS << \" \" << Val;\n";
704 void writeAccessors(raw_ostream &OS) const override {
709 OS << " typedef " << Type << "* " << IteratorType << ";\n";
710 OS << " " << IteratorType << " " << BeginFn << " const {"
712 OS << " " << IteratorType << " " << EndFn << " const {"
714 OS << " unsigned " << getLowerName() << "_size() const {"
716 OS << " llvm::iterator_range<" << IteratorType << "> " << RangeName
721 void writeSetter(raw_ostream &OS) const {
722 OS << " void set" << getUpperName() << "(ASTContext &Ctx, ";
723 writeCtorParameters(OS);
724 OS << ") {\n";
725 OS << " " << ArgSizeName << " = " << getUpperName() << "Size;\n";
726 OS << " " << ArgName << " = new (Ctx, 16) " << getType() << "["
728 OS << " ";
729 writeCtorBody(OS);
730 OS << " }\n";
733 void writeCloneArgs(raw_ostream &OS) const override {
734 OS << ArgName << ", " << ArgSizeName;
737 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
739 OS << "A->" << getLowerName() << "_begin(), "
743 void writeASTVisitorTraversal(raw_ostream &OS) const override {
747 void writeCtorBody(raw_ostream &OS) const override {
748 OS << " std::copy(" << getUpperName() << ", " << getUpperName() << " + "
752 void writeCtorInitializers(raw_ostream &OS) const override {
753 OS << ArgSizeName << "(" << getUpperName() << "Size), "
758 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
759 OS << ArgSizeName << "(0), " << ArgName << "(nullptr)";
762 void writeCtorParameters(raw_ostream &OS) const override {
763 OS << getType() << " *" << getUpperName() << ", unsigned "
767 void writeImplicitCtorArgs(raw_ostream &OS) const override {
768 OS << getUpperName() << ", " << getUpperName() << "Size";
771 void writeDeclarations(raw_ostream &OS) const override {
772 OS << " unsigned " << ArgSizeName << ";\n";
773 OS << " " << getType() << " *" << ArgName << ";";
776 void writePCHReadDecls(raw_ostream &OS) const override {
777 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
778 OS << " SmallVector<" << getType() << ", 4> "
780 OS << " " << getLowerName() << ".reserve(" << getLowerName()
790 OS << " SmallVector<" << StorageType << ", 4> "
792 OS << " " << StorageName << ".reserve(" << getLowerName()
796 OS << " for (unsigned i = 0; i != " << getLowerName() << "Size; ++i)\n";
798 OS << " " << StorageName << ".push_back(" << read << ");\n";
801 OS << " for (unsigned i = 0; i != " << getLowerName() << "Size; ++i)\n";
802 OS << " " << getLowerName() << ".push_back("
807 void writePCHReadArgs(raw_ostream &OS) const override {
808 OS << getLowerName() << ".data(), " << getLowerName() << "Size";
811 void writePCHWrite(raw_ostream &OS) const override {
812 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
813 OS << " for (auto &Val : SA->" << RangeName << "())\n";
814 OS << " " << WritePCHRecord(Type, "Val");
817 void writeValue(raw_ostream &OS) const override {
818 OS << "\";\n";
819 OS << " for (const auto &Val : " << RangeName << "()) {\n"
820 << " DelimitAttributeArgument(OS, IsFirstArgument);\n";
821 writeValueImpl(OS);
822 OS << " }\n";
823 OS << " OS << \"";
826 void writeDump(raw_ostream &OS) const override {
827 OS << " for (const auto &Val : SA->" << RangeName << "())\n";
828 writeDumpImpl(OS);
837 void writeDump(raw_ostream &OS) const override {
838 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
841 OS << " if (I->IsTarget && I->IsTargetSync)\n";
842 OS << " OS << \" Target_TargetSync\";\n";
843 OS << " else if (I->IsTarget)\n";
844 OS << " OS << \" Target\";\n";
845 OS << " else\n";
846 OS << " OS << \" TargetSync\";\n";
847 OS << " }\n";
850 void writePCHReadDecls(raw_ostream &OS) const override {
851 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
852 OS << " SmallVector<OMPInteropInfo, 4> " << getLowerName() << ";\n";
853 OS << " " << getLowerName() << ".reserve(" << getLowerName()
855 OS << " for (unsigned I = 0, E = " << getLowerName() << "Size; ";
856 OS << "I != E; ++I) {\n";
857 OS << " bool IsTarget = Record.readBool();\n";
858 OS << " bool IsTargetSync = Record.readBool();\n";
859 OS << " " << getLowerName()
861 OS << " }\n";
864 void writePCHWrite(raw_ostream &OS) const override {
865 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
866 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
869 OS << " Record.writeBool(I->IsTarget);\n";
870 OS << " Record.writeBool(I->IsTargetSync);\n";
871 OS << " }\n";
881 void writeValueImpl(raw_ostream &OS) const override {
882 OS << " OS << Val.getSourceIndex();\n";
885 void writeDumpImpl(raw_ostream &OS) const override {
886 OS << " OS << \" \" << Val.getSourceIndex();\n";
935 void writeAccessors(raw_ostream &OS) const override {
936 OS << " " << fullType << " get" << getUpperName() << "() const {\n";
937 OS << " return " << getLowerName() << ";\n";
938 OS << " }";
941 void writeCloneArgs(raw_ostream &OS) const override {
942 OS << getLowerName();
945 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
946 OS << "A->get" << getUpperName() << "()";
948 void writeCtorInitializers(raw_ostream &OS) const override {
949 OS << getLowerName() << "(" << getUpperName() << ")";
951 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
952 OS << getLowerName() << "(" << fullType << "(0))";
954 void writeCtorParameters(raw_ostream &OS) const override {
955 OS << fullType << " " << getUpperName();
957 void writeDeclarations(raw_ostream &OS) const override {
963 OS << "public:\n";
964 OS << " enum " << shortType << " {\n";
966 OS << " " << *i << ",\n";
967 OS << " " << *e << "\n";
968 OS << " };\n";
971 OS << "private:\n";
972 OS << " " << fullType << " " << getLowerName() << ";";
975 void writePCHReadDecls(raw_ostream &OS) const override {
976 OS << " " << fullType << " " << getLowerName() << "(static_cast<"
980 void writePCHReadArgs(raw_ostream &OS) const override {
981 OS << getLowerName();
984 void writePCHWrite(raw_ostream &OS) const override {
985 OS << "Record.push_back(static_cast<uint64_t>(SA->get" << getUpperName()
989 void writeValue(raw_ostream &OS) const override {
993 OS << "\\\"\" << " << getAttrName() << "Attr::Convert" << shortType
997 void writeDump(raw_ostream &OS) const override {
998 OS << " switch(SA->get" << getUpperName() << "()) {\n";
1000 OS << " case " << fullType << "::" << I << ":\n";
1001 OS << " OS << \" " << I << "\";\n";
1002 OS << " break;\n";
1005 OS << " default:\n";
1006 OS << " llvm_unreachable(\"Invalid attribute value\");\n";
1008 OS << " }\n";
1011 void writeConversion(raw_ostream &OS, bool Header) const {
1013 OS << " static bool ConvertStrTo" << shortType << "(StringRef Val, "
1015 OS << " static const char *Convert" << shortType << "ToStr("
1020 OS << "bool " << getAttrName() << "Attr::ConvertStrTo" << shortType
1022 OS << " std::optional<" << fullType << "> "
1025 OS << " .Case(\"" << values[I] << "\", ";
1026 OS << fullType << "::" << enums[I] << ")\n";
1028 OS << " .Default(std::optional<" << fullType << ">());\n";
1029 OS << " if (R) {\n";
1030 OS << " Out = *R;\n return true;\n }\n";
1031 OS << " return false;\n";
1032 OS << "}\n\n";
1038 OS << "const char *" << getAttrName() << "Attr::Convert" << shortType
1044 OS << " case " << fullType << "::" << enums[I] << ": return \""
1048 OS << " default: llvm_unreachable(\"Invalid attribute value\");\n";
1050 OS << " }\n"
1064 void writeValueImpl(raw_ostream &OS) const override {
1068 OS << " OS << \"\\\"\" << " << getAttrName() << "Attr::Convert"
1095 void writeDeclarations(raw_ostream &OS) const override {
1101 OS << "public:\n";
1102 OS << " enum " << shortType << " {\n";
1104 OS << " " << *i << ",\n";
1105 OS << " " << *e << "\n";
1106 OS << " };\n";
1108 OS << "private:\n";
1110 VariadicArgument::writeDeclarations(OS);
1113 void writeDump(raw_ostream &OS) const override {
1114 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
1117 OS << " switch(*I) {\n";
1119 OS << " case " << fullType << "::" << UI << ":\n";
1120 OS << " OS << \" " << UI << "\";\n";
1121 OS << " break;\n";
1124 OS << " default:\n";
1125 OS << " llvm_unreachable(\"Invalid attribute value\");\n";
1127 OS << " }\n";
1128 OS << " }\n";
1131 void writePCHReadDecls(raw_ostream &OS) const override {
1132 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
1133 OS << " SmallVector<" << fullType << ", 4> " << getLowerName()
1135 OS << " " << getLowerName() << ".reserve(" << getLowerName()
1137 OS << " for (unsigned i = " << getLowerName() << "Size; i; --i)\n";
1138 OS << " " << getLowerName() << ".push_back("
1142 void writePCHWrite(raw_ostream &OS) const override {
1143 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
1144 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
1147 OS << " " << WritePCHRecord(fullType, "(*i)");
1150 void writeConversion(raw_ostream &OS, bool Header) const {
1152 OS << " static bool ConvertStrTo" << shortType << "(StringRef Val, "
1154 OS << " static const char *Convert" << shortType << "ToStr("
1159 OS << "bool " << getAttrName() << "Attr::ConvertStrTo" << shortType
1161 OS << fullType << " &Out) {\n";
1162 OS << " std::optional<" << fullType
1164 OS << fullType << ">>(Val)\n";
1166 OS << " .Case(\"" << values[I] << "\", ";
1167 OS << fullType << "::" << enums[I] << ")\n";
1169 OS << " .Default(std::optional<" << fullType << ">());\n";
1170 OS << " if (R) {\n";
1171 OS << " Out = *R;\n return true;\n }\n";
1172 OS << " return false;\n";
1173 OS << "}\n\n";
1175 OS << "const char *" << getAttrName() << "Attr::Convert" << shortType
1181 OS << " case " << fullType << "::" << enums[I] << ": return \""
1185 OS << " default: llvm_unreachable(\"Invalid attribute value\");\n";
1187 OS << " }\n"
1199 void writeAccessors(raw_ostream &OS) const override {
1200 OS << " VersionTuple get" << getUpperName() << "() const {\n";
1201 OS << " return " << getLowerName() << ";\n";
1202 OS << " }\n";
1203 OS << " void set" << getUpperName()
1205 OS << " " << getLowerName() << " = V;\n";
1206 OS << " }";
1209 void writeCloneArgs(raw_ostream &OS) const override {
1210 OS << "get" << getUpperName() << "()";
1213 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1214 OS << "A->get" << getUpperName() << "()";
1217 void writeCtorInitializers(raw_ostream &OS) const override {
1218 OS << getLowerName() << "(" << getUpperName() << ")";
1221 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
1222 OS << getLowerName() << "()";
1225 void writeCtorParameters(raw_ostream &OS) const override {
1226 OS << "VersionTuple " << getUpperName();
1229 void writeDeclarations(raw_ostream &OS) const override {
1230 OS << "VersionTuple " << getLowerName() << ";\n";
1233 void writePCHReadDecls(raw_ostream &OS) const override {
1234 OS << " VersionTuple " << getLowerName()
1238 void writePCHReadArgs(raw_ostream &OS) const override {
1239 OS << getLowerName();
1242 void writePCHWrite(raw_ostream &OS) const override {
1243 OS << " Record.AddVersionTuple(SA->get" << getUpperName() << "());\n";
1246 void writeValue(raw_ostream &OS) const override {
1247 OS << getLowerName() << "=\" << get" << getUpperName() << "() << \"";
1250 void writeDump(raw_ostream &OS) const override {
1251 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
1261 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1262 OS << " if (!"
1264 OS << " return false;\n";
1267 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1268 OS << "tempInst" << getUpperName();
1271 void writeTemplateInstantiation(raw_ostream &OS) const override {
1272 OS << " " << getType() << " tempInst" << getUpperName() << ";\n";
1273 OS << " {\n";
1274 OS << " EnterExpressionEvaluationContext "
1276 OS << " ExprResult " << "Result = S.SubstExpr("
1278 OS << " if (Result.isInvalid())\n";
1279 OS << " return nullptr;\n";
1280 OS << " tempInst" << getUpperName() << " = Result.get();\n";
1281 OS << " }\n";
1284 void writeValue(raw_ostream &OS) const override {
1285 OS << "\";\n";
1286 OS << " get" << getUpperName()
1287 << "()->printPretty(OS, nullptr, Policy);\n";
1288 OS << " OS << \"";
1291 void writeDump(raw_ostream &OS) const override {}
1293 void writeDumpChildren(raw_ostream &OS) const override {
1294 OS << " Visit(SA->get" << getUpperName() << "());\n";
1297 void writeHasChildren(raw_ostream &OS) const override { OS << "true"; }
1309 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1310 OS << " {\n";
1311 OS << " " << getType() << " *I = A->" << getLowerName()
1313 OS << " " << getType() << " *E = A->" << getLowerName()
1315 OS << " for (; I != E; ++I) {\n";
1316 OS << " if (!getDerived().TraverseStmt(*I))\n";
1317 OS << " return false;\n";
1318 OS << " }\n";
1319 OS << " }\n";
1322 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1323 OS << "tempInst" << getUpperName() << ", "
1327 void writeTemplateInstantiation(raw_ostream &OS) const override {
1328 OS << " auto *tempInst" << getUpperName()
1331 OS << " {\n";
1332 OS << " EnterExpressionEvaluationContext "
1334 OS << " " << getType() << " *TI = tempInst" << getUpperName()
1336 OS << " " << getType() << " *I = A->" << getLowerName()
1338 OS << " " << getType() << " *E = A->" << getLowerName()
1340 OS << " for (; I != E; ++I, ++TI) {\n";
1341 OS << " ExprResult Result = S.SubstExpr(*I, TemplateArgs);\n";
1342 OS << " if (Result.isInvalid())\n";
1343 OS << " return nullptr;\n";
1344 OS << " *TI = Result.get();\n";
1345 OS << " }\n";
1346 OS << " }\n";
1349 void writeDump(raw_ostream &OS) const override {}
1351 void writeDumpChildren(raw_ostream &OS) const override {
1352 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
1355 OS << " Visit(*I);\n";
1358 void writeHasChildren(raw_ostream &OS) const override {
1359 OS << "SA->" << getLowerName() << "_begin() != "
1377 void writeCtorBody(raw_ostream &OS) const override {
1378 OS << " for (size_t I = 0, E = " << getArgSizeName() << "; I != E;\n"
1389 void writeValueImpl(raw_ostream &OS) const override {
1390 OS << " OS << \"\\\"\" << Val << \"\\\"\";\n";
1400 void writeAccessors(raw_ostream &OS) const override {
1401 OS << " QualType get" << getUpperName() << "() const {\n";
1402 OS << " return " << getLowerName() << "->getType();\n";
1403 OS << " }";
1404 OS << " " << getType() << " get" << getUpperName() << "Loc() const {\n";
1405 OS << " return " << getLowerName() << ";\n";
1406 OS << " }";
1409 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1410 OS << " if (auto *TSI = A->get" << getUpperName() << "Loc())\n";
1411 OS << " if (!getDerived().TraverseTypeLoc(TSI->getTypeLoc()))\n";
1412 OS << " return false;\n";
1415 void writeTemplateInstantiation(raw_ostream &OS) const override {
1416 OS << " " << getType() << " tempInst" << getUpperName() << " =\n";
1417 OS << " S.SubstType(A->get" << getUpperName() << "Loc(), "
1419 OS << " if (!tempInst" << getUpperName() << ")\n";
1420 OS << " return nullptr;\n";
1423 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1424 OS << "tempInst" << getUpperName();
1427 void writePCHWrite(raw_ostream &OS) const override {
1428 OS << " "
1439 void writePCHReadDecls(raw_ostream &OS) const override {
1440 OS << " Attr *" << getLowerName() << " = Record.readAttr();";
1443 void writePCHWrite(raw_ostream &OS) const override {
1444 OS << " AddAttr(SA->get" << getUpperName() << "());";
1447 void writeDump(raw_ostream &OS) const override {}
1449 void writeDumpChildren(raw_ostream &OS) const override {
1450 OS << " Visit(SA->get" << getUpperName() << "());\n";
1453 void writeHasChildren(raw_ostream &OS) const override { OS << "true"; }
1536 static void writeAvailabilityValue(raw_ostream &OS) {
1537 OS << "\" << getPlatform()->getName();\n"
1538 << " if (getStrict()) OS << \", strict\";\n"
1539 << " if (!getIntroduced().empty()) OS << \", introduced=\" << getIntroduced();\n"
1540 << " if (!getDeprecated().empty()) OS << \", deprecated=\" << getDeprecated();\n"
1541 << " if (!getObsoleted().empty()) OS << \", obsoleted=\" << getObsoleted();\n"
1542 << " if (getUnavailable()) OS << \", unavailable\";\n"
1543 << " OS << \"";
1546 static void writeDeprecatedAttrValue(raw_ostream &OS, StringRef Variety) {
1547 OS << "\\\"\" << getMessage() << \"\\\"\";\n";
1550 OS << " if (!getReplacement().empty()) OS << \", \\\"\""
1552 OS << " OS << \"";
1555 static void writeGetSpellingFunction(const Record &R, raw_ostream &OS) {
1558 OS << "const char *" << R.getName() << "Attr::getSpelling() const {\n";
1560 OS << " return \"(No spelling)\";\n}\n\n";
1564 OS << " switch (getAttributeSpellingListIndex()) {\n"
1571 OS << " case " << Idx << ":\n"
1576 OS << " }\n";
1578 OS << "}\n\n";
1584 raw_ostream &OS) {
1587 OS << "void " << R.getName() << "Attr::printPretty("
1588 << "raw_ostream &OS, const PrintingPolicy &Policy) const {\n";
1591 OS << "}\n\n";
1595 OS << " bool IsFirstArgument = true; (void)IsFirstArgument;\n"
1648 OS << " case " << Idx << " : {\n"
1649 << " OS << \"" << Prefix << Spelling << "\";\n";
1652 OS << " printPrettyPragma(OS, Policy);\n";
1653 OS << " OS << \"\\n\";";
1654 OS << " break;\n";
1655 OS << " }\n";
1660 OS << " OS << \"(";
1661 writeAvailabilityValue(OS);
1662 OS << ")\";\n";
1664 OS << " OS << \"(";
1665 writeDeprecatedAttrValue(OS, Variety);
1666 OS << ")\";\n";
1683 OS << " if (" << arg->getIsOmitted() << ")\n"
1692 OS << " if (!(" << IsOmitted << ")) {\n";
1695 OS << " DelimitAttributeArgument(OS, IsFirstArgument);\n";
1696 OS << " OS << \"";
1697 arg->writeValue(OS);
1698 OS << "\";\n";
1700 OS << " }\n";
1704 OS << " if (!IsFirstArgument)\n"
1705 << " OS << \")\";\n";
1707 OS << " OS << \"" << Suffix << "\";\n"
1713 OS << "}\n";
1715 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";
1826 raw_ostream &OS) {
1827 OS << " switch (" << VarName << ") {\n default: "
1830 OS << " case " << I.first << ": return " << I.second << ";\n";
1831 OS << " }\n";
1892 raw_ostream &OS,
1905 OS << ".Case(\"" << I.name() << "\", 1)\n";
1911 raw_ostream &OS) {
1912 OS << "#if defined(CLANG_ATTR_LATE_PARSED_LIST)\n";
1913 emitClangAttrLateParsedListImpl(Records, OS, LateAttrParseKind::Standard);
1914 OS << "#endif // CLANG_ATTR_LATE_PARSED_LIST\n\n";
1918 raw_ostream &OS) {
1919 OS << "#if defined(CLANG_ATTR_LATE_PARSED_EXPERIMENTAL_EXT_LIST)\n";
1920 emitClangAttrLateParsedListImpl(Records, OS,
1922 OS << "#endif // CLANG_ATTR_LATE_PARSED_EXPERIMENTAL_EXT_LIST\n\n";
2049 void emitMatchRuleList(raw_ostream &OS);
2051 void generateStrictConformsTo(const Record &Attr, raw_ostream &OS);
2053 void generateParsingHelpers(raw_ostream &OS);
2149 void PragmaClangAttributeSupport::emitMatchRuleList(raw_ostream &OS) {
2150 OS << "#ifndef ATTR_MATCH_SUB_RULE\n";
2151 OS << "#define ATTR_MATCH_SUB_RULE(Value, Spelling, IsAbstract, Parent, "
2154 OS << "#endif\n";
2156 OS << (Rule.isSubRule() ? "ATTR_MATCH_SUB_RULE" : "ATTR_MATCH_RULE") << '(';
2157 OS << Rule.getEnumValueName() << ", \"" << Rule.getSpelling() << "\", "
2160 OS << ", "
2163 OS << ")\n";
2165 OS << "#undef ATTR_MATCH_SUB_RULE\n";
2244 raw_ostream &OS) {
2249 OS << "void getPragmaAttributeMatchRules("
2264 OS << " MatchRules.push_back(std::make_pair(" << Rule.getEnumValue()
2269 OS << "}\n\n";
2272 void PragmaClangAttributeSupport::generateParsingHelpers(raw_ostream &OS) {
2274 OS << "std::optional<attr::SubjectMatchRule> "
2276 OS << " return std::nullopt;\n";
2277 OS << "}\n\n";
2288 OS << "std::optional<attr::SubjectMatchRule> "
2292 OS << " if (IsUnless)\n";
2293 OS << " return "
2297 OS << " Case(\"" << Rule.getName() << "\", " << Rule.getEnumValue()
2300 OS << " Default(std::nullopt);\n";
2301 OS << " return "
2305 OS << " Case(\"" << Rule.getName() << "\", " << Rule.getEnumValue()
2308 OS << " Default(std::nullopt);\n";
2309 OS << "}\n\n";
2313 OS << "std::pair<std::optional<attr::SubjectMatchRule>, "
2316 OS << " return "
2329 OS << " Case(\"" << Rule.getName() << "\", std::make_pair("
2332 OS << " Default(std::make_pair(std::nullopt, "
2334 OS << "}\n\n";
2337 OS << "const char *validAttributeSubjectMatchSubRules("
2339 OS << " switch (Rule) {\n";
2341 OS << " case "
2344 OS << " return \"'";
2348 OS << ", '";
2351 OS << "unless(";
2352 OS << Rule.getName();
2354 OS << ')';
2355 OS << "'";
2357 OS << "\";\n";
2359 OS << " default: return nullptr;\n";
2360 OS << " }\n";
2361 OS << "}\n\n";
2411 raw_ostream &OS) {
2413 OS << ".Case(\"" << Name << "\", ";
2415 OS << ArgMask << ")\n";
2417 OS << "true)\n";
2424 raw_ostream &OS) {
2425 OS << "(Syntax==AttributeCommonInfo::AS_" << FSI.Syntax << " && ";
2427 OS << "ScopeName && ScopeName->getName()==\"" << FSI.Scope << "\"";
2429 OS << "!ScopeName";
2431 OS << " && " << FSI.TargetTest;
2432 OS << ")";
2436 raw_ostream &OS) {
2438 if (emitIfSimpleValue(Name, Vec[0].ArgMask, OS))
2442 OS << ".Case(\"" << Name << "\", ";
2444 emitSingleCondition(Vec[I], OS);
2451 OS << " ? " << SuccessValue << " : ";
2453 OS << 0;
2455 OS << ")\n";
2466 raw_ostream &OS) {
2467 OS << "#if defined(CLANG_ATTR_TYPE_ARG_LIST)\n";
2479 emitStringSwitchCases(FSIMap, OS);
2480 OS << "#endif // CLANG_ATTR_TYPE_ARG_LIST\n\n";
2486 raw_ostream &OS) {
2487 OS << "#if defined(CLANG_ATTR_ARG_CONTEXT_LIST)\n";
2497 emitStringSwitchCases(FSIMap, OS);
2498 OS << "#endif // CLANG_ATTR_ARG_CONTEXT_LIST\n\n";
2544 raw_ostream &OS) {
2545 OS << "#if defined(CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST)\n";
2554 emitStringSwitchCases(FSIMap, OS);
2555 OS << "#endif // CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST\n\n";
2562 raw_ostream &OS) {
2563 OS << "#if defined(CLANG_ATTR_STRING_LITERAL_ARG_LIST)\n";
2587 emitStringSwitchCases(FSIMap, OS);
2588 OS << "#endif // CLANG_ATTR_STRING_LITERAL_ARG_LIST\n\n";
2593 raw_ostream &OS) {
2594 OS << "#if defined(CLANG_ATTR_IDENTIFIER_ARG_LIST)\n";
2603 emitStringSwitchCases(FSIMap, OS);
2604 OS << "#endif // CLANG_ATTR_IDENTIFIER_ARG_LIST\n\n";
2609 raw_ostream &OS) {
2610 OS << "#if defined(CLANG_ATTR_STRICT_IDENTIFIER_ARG_LIST)\n";
2621 emitStringSwitchCases(FSIMap, OS);
2622 OS << "#endif // CLANG_ATTR_STRICT_IDENTIFIER_ARG_LIST\n\n";
2633 raw_ostream &OS) {
2634 OS << "#if defined(CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST)\n";
2643 emitStringSwitchCases(FSIMap, OS);
2644 OS << "#endif // CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST\n\n";
2648 raw_ostream &OS) {
2649 OS << "#if defined(CLANG_ATTR_ACCEPTS_EXPR_PACK)\n";
2659 emitStringSwitchCases(FSIMap, OS);
2660 OS << "#endif // CLANG_ATTR_ACCEPTS_EXPR_PACK\n\n";
2668 static void emitFormInitializer(raw_ostream &OS,
2673 OS << "{AttributeCommonInfo::AS_" << Spelling.variety() << ", "
2680 static void emitAttributes(const RecordKeeper &Records, raw_ostream &OS,
2687 OS << "static inline void DelimitAttributeArgument("
2688 << "raw_ostream& OS, bool& IsFirst) {\n"
2691 << " OS << \"(\";\n"
2693 << " OS << \", \";\n"
2726 OS << "class CLANG_ABI " << R.getName() << "Attr : public " << SuperName
2729 OS << "\n// " << R.getName() << "Attr implementation\n\n";
2759 Args.back()->writeDeclarations(OS);
2760 OS << "\n\n";
2776 DelayedArgs->writeDeclarations(OS);
2777 OS << "\n\n";
2782 OS << "public:\n";
2799 OS << SpellingEnum;
2809 OS << " static ";
2810 OS << R.getName() << "Attr *";
2812 OS << R.getName() << "Attr::";
2813 OS << "Create";
2815 OS << "Implicit";
2817 OS << "WithDelayedArgs";
2818 OS << "(";
2819 OS << "ASTContext &Ctx";
2824 OS << ", ";
2825 ai->writeCtorParameters(OS);
2828 OS << ", ";
2829 DelayedArgs->writeCtorParameters(OS);
2831 OS << ", const AttributeCommonInfo &CommonInfo";
2832 OS << ")";
2834 OS << ";\n";
2838 OS << " {\n";
2839 OS << " auto *A = new (Ctx) " << R.getName();
2840 OS << "Attr(Ctx, CommonInfo";
2846 OS << ", ";
2847 ai->writeImplicitCtorArgs(OS);
2850 OS << ");\n";
2852 OS << " A->setImplicit(true);\n";
2855 OS << " if (!A->isAttributeSpellingListCalculated() && "
2857 OS << " A->setAttributeSpellingListIndex(0);\n";
2860 OS << " A->setDelayedArgs(Ctx, ";
2861 DelayedArgs->writeImplicitCtorArgs(OS);
2862 OS << ");\n";
2864 OS << " return A;\n}\n\n";
2870 OS << " static ";
2871 OS << R.getName() << "Attr *";
2873 OS << R.getName() << "Attr::";
2874 OS << "Create";
2876 OS << "Implicit";
2878 OS << "WithDelayedArgs";
2879 OS << "(";
2880 OS << "ASTContext &Ctx";
2885 OS << ", ";
2886 ai->writeCtorParameters(OS);
2889 OS << ", ";
2890 DelayedArgs->writeCtorParameters(OS);
2892 OS << ", SourceRange Range";
2894 OS << " = {}";
2896 OS << ", Spelling S";
2898 OS << " = " << SemanticToSyntacticMap[0];
2900 OS << ")";
2902 OS << ";\n";
2906 OS << " {\n";
2907 OS << " AttributeCommonInfo I(Range, ";
2910 OS << "AT_" << ParsedAttrSpellingItr->first;
2912 OS << "NoSemaHandlerAttribute";
2915 OS << ", AttributeCommonInfo::Form::Implicit()";
2917 OS << ", ";
2918 emitFormInitializer(OS, Spellings[0], "0");
2920 OS << ", [&]() {\n";
2921 OS << " switch (S) {\n";
2929 OS << " case " << Name << ":\n";
2930 OS << " return AttributeCommonInfo::Form";
2931 emitFormInitializer(OS, S, Name);
2932 OS << ";\n";
2935 OS << " default:\n";
2936 OS << " llvm_unreachable(\"Unknown attribute spelling!\");\n"
2938 emitFormInitializer(OS, Spellings[0], "0");
2939 OS << ";\n"
2944 OS << ");\n";
2945 OS << " return Create";
2947 OS << "Implicit";
2949 OS << "WithDelayedArgs";
2950 OS << "(Ctx";
2955 OS << ", ";
2956 ai->writeImplicitCtorArgs(OS);
2959 OS << ", ";
2960 DelayedArgs->writeImplicitCtorArgs(OS);
2962 OS << ", I);\n";
2963 OS << "}\n\n";
2974 OS << " // Factory methods\n";
3000 OS << " ";
3002 OS << R.getName() << "Attr::";
3003 OS << R.getName()
3005 OS << '\n';
3009 OS << " , ";
3010 ai->writeCtorParameters(OS);
3011 OS << "\n";
3014 OS << " )";
3016 OS << ";\n";
3019 OS << "\n : " << SuperName << "(Ctx, CommonInfo, ";
3020 OS << "attr::" << R.getName() << ", ";
3023 OS << "/*IsLateParsed=*/";
3026 OS << "false";
3037 OS << "true";
3042 OS << ", "
3046 OS << ")\n";
3049 OS << " , ";
3051 ai->writeCtorDefaultInitializers(OS);
3053 ai->writeCtorInitializers(OS);
3055 OS << "\n";
3058 OS << " , ";
3059 DelayedArgs->writeCtorDefaultInitializers(OS);
3060 OS << "\n";
3063 OS << " {\n";
3068 ai->writeCtorBody(OS);
3070 OS << "}\n\n";
3074 OS << "\n // Constructors\n";
3098 OS << '\n';
3099 OS << " " << R.getName() << "Attr *clone(ASTContext &C) const;\n";
3100 OS << " void printPretty(raw_ostream &OS,\n"
3102 OS << " const char *getSpelling() const;\n";
3108 OS << " Spelling getSemanticSpelling() const;\n";
3110 OS << R.getName() << "Attr::Spelling " << R.getName()
3113 SemanticToSyntacticMap, OS);
3114 OS << "}\n";
3119 writeAttrAccessorDefinition(R, OS);
3123 ai->writeAccessors(OS);
3125 ai->writeAccessorDefinitions(OS);
3127 OS << "\n\n";
3133 static_cast<const EnumArgument *>(ai.get())->writeConversion(OS,
3137 OS, Header);
3142 DelayedArgs->writeAccessors(OS);
3143 DelayedArgs->writeSetter(OS);
3146 OS << R.getValueAsString("AdditionalMembers");
3147 OS << "\n\n";
3149 OS << " static bool classof(const Attr *A) { return A->getKind() == "
3152 OS << "};\n\n";
3155 DelayedArgs->writeAccessorDefinitions(OS);
3157 OS << R.getName() << "Attr *" << R.getName()
3159 OS << " auto *A = new (C) " << R.getName() << "Attr(C, *this";
3161 OS << ", ";
3162 ai->writeCloneArgs(OS);
3164 OS << ");\n";
3165 OS << " A->Inherited = Inherited;\n";
3166 OS << " A->IsPackExpansion = IsPackExpansion;\n";
3167 OS << " A->setImplicit(Implicit);\n";
3169 OS << " A->setDelayedArgs(C, ";
3170 DelayedArgs->writeCloneArgs(OS);
3171 OS << ");\n";
3173 OS << " return A;\n}\n\n";
3175 writePrettyPrintFunction(R, Args, OS);
3176 writeGetSpellingFunction(R, OS);
3181 void clang::EmitClangAttrClass(const RecordKeeper &Records, raw_ostream &OS) {
3182 emitSourceFileHeader("Attribute classes' definitions", OS, Records);
3184 OS << "#ifndef LLVM_CLANG_ATTR_CLASSES_INC\n";
3185 OS << "#define LLVM_CLANG_ATTR_CLASSES_INC\n";
3187 emitAttributes(Records, OS, true);
3189 OS << "#endif // LLVM_CLANG_ATTR_CLASSES_INC\n";
3193 void clang::EmitClangAttrImpl(const RecordKeeper &Records, raw_ostream &OS) {
3194 emitSourceFileHeader("Attribute classes' member function definitions", OS,
3197 emitAttributes(Records, OS, false);
3202 OS << " switch (getKind()) {\n";
3208 OS << " case attr::" << R.getName() << ":\n";
3209 OS << " return cast<" << R.getName() << "Attr>(this)->" << Method
3212 OS << " }\n";
3213 OS << " llvm_unreachable(\"Unexpected attribute kind!\");\n";
3214 OS << "}\n\n";
3217 OS << "const char *Attr::getSpelling() const {\n";
3220 OS << "Attr *Attr::clone(ASTContext &C) const {\n";
3223 OS << "void Attr::printPretty(raw_ostream &OS, "
3225 EmitFunc("printPretty(OS, Policy)");
3228 static void emitAttrList(raw_ostream &OS, StringRef Class,
3231 OS << Class << "(" << Cur->getName() << ")\n";
3264 static void emitDefaultDefine(raw_ostream &OS, StringRef name,
3266 OS << "#ifndef " << name << "\n";
3267 OS << "#define " << name << "(NAME) ";
3268 if (superName) OS << superName << "(NAME)";
3269 OS << "\n#endif\n\n";
3285 void emitDefaultDefines(raw_ostream &OS) const {
3288 emitDefaultDefine(OS, Descriptor.MacroName,
3293 void emitUndefs(raw_ostream &OS) const {
3294 OS << "#undef " << Descriptor.MacroName << "\n";
3297 void emitAttrList(raw_ostream &OS) const {
3299 SubClass->emitAttrList(OS);
3302 ::emitAttrList(OS, Descriptor.MacroName, Attrs);
3310 void emitAttrRange(raw_ostream &OS) const {
3311 OS << "ATTR_RANGE(" << Descriptor.TableGenName
3375 void emitDefaultDefines(raw_ostream &OS) const {
3377 Class->emitDefaultDefines(OS);
3381 void emitUndefs(raw_ostream &OS) const {
3383 Class->emitUndefs(OS);
3387 void emitAttrLists(raw_ostream &OS) const {
3389 Classes[0]->emitAttrList(OS);
3392 void emitAttrRanges(raw_ostream &OS) const {
3394 Class->emitAttrRange(OS);
3428 void EmitClangAttrList(const RecordKeeper &Records, raw_ostream &OS) {
3429 emitSourceFileHeader("List of all attributes that Clang recognizes", OS,
3435 Hierarchy.emitDefaultDefines(OS);
3436 emitDefaultDefine(OS, "PRAGMA_SPELLING_ATTR", nullptr);
3452 Hierarchy.emitAttrLists(OS);
3455 emitAttrList(OS, "PRAGMA_SPELLING_ATTR", PragmaAttrs);
3458 OS << "#ifdef ATTR_RANGE\n";
3459 Hierarchy.emitAttrRanges(OS);
3460 OS << "#undef ATTR_RANGE\n";
3461 OS << "#endif\n";
3463 Hierarchy.emitUndefs(OS);
3464 OS << "#undef PRAGMA_SPELLING_ATTR\n";
3469 raw_ostream &OS) {
3471 "List of all attribute subject matching rules that Clang recognizes", OS,
3475 emitDefaultDefine(OS, "ATTR_MATCH_RULE", nullptr);
3476 PragmaAttributeSupport.emitMatchRuleList(OS);
3477 OS << "#undef ATTR_MATCH_RULE\n";
3481 void EmitClangAttrPCHRead(const RecordKeeper &Records, raw_ostream &OS) {
3482 emitSourceFileHeader("Attribute deserialization code", OS, Records);
3489 OS << " switch (Kind) {\n";
3495 OS << " case attr::" << R.getName() << ": {\n";
3497 OS << " bool isInherited = Record.readInt();\n";
3498 OS << " bool isImplicit = Record.readInt();\n";
3499 OS << " bool isPackExpansion = Record.readInt();\n";
3504 DelayedArgs->writePCHReadDecls(OS);
3510 Args.back()->writePCHReadDecls(OS);
3512 OS << " New = new (Context) " << R.getName() << "Attr(Context, Info";
3514 OS << ", ";
3515 ri->writePCHReadArgs(OS);
3517 OS << ");\n";
3519 OS << " cast<InheritableAttr>(New)->setInherited(isInherited);\n";
3520 OS << " New->setImplicit(isImplicit);\n";
3521 OS << " New->setPackExpansion(isPackExpansion);\n";
3523 OS << " cast<" << R.getName()
3525 DelayedArgs->writePCHReadArgs(OS);
3526 OS << ");\n";
3528 OS << " break;\n";
3529 OS << " }\n";
3531 OS << " }\n";
3535 void EmitClangAttrPCHWrite(const RecordKeeper &Records, raw_ostream &OS) {
3536 emitSourceFileHeader("Attribute serialization code", OS, Records);
3539 OS << " switch (A->getKind()) {\n";
3544 OS << " case attr::" << R.getName() << ": {\n";
3547 OS << " const auto *SA = cast<" << R.getName()
3550 OS << " Record.push_back(SA->isInherited());\n";
3551 OS << " Record.push_back(A->isImplicit());\n";
3552 OS << " Record.push_back(A->isPackExpansion());\n";
3554 VariadicExprArgument("DelayedArgs", R.getName()).writePCHWrite(OS);
3557 createArgument(*Arg, R.getName())->writePCHWrite(OS);
3558 OS << " break;\n";
3559 OS << " }\n";
3561 OS << " }\n";
3650 raw_ostream &OS, StringRef Variety, StringRef Scope = "") {
3715 OS << " .Case(\"" << Spelling.name() << "\", " << TestStr << ")\n";
3717 OS << " .Default(0);\n";
3724 raw_ostream &OS) {
3728 OS);
3739 OS << "KEYWORD_ATTRIBUTE("
3743 OS << "#undef KEYWORD_ATTRIBUTE\n";
3746 void EmitCXX11AttributeInfo(const RecordKeeper &Records, raw_ostream &OS) {
3747 OS << "#if defined(CXX11_ATTR_ARGS_INFO)\n";
3762 OS << ".Case(\"" << SI.getSpellingRecord().getValueAsString("Name")
3773 OS << "#endif // CXX11_ATTR_ARGS_INFO\n";
3777 void EmitClangAttrHasAttrImpl(const RecordKeeper &Records, raw_ostream &OS) {
3778 emitSourceFileHeader("Code to implement the __has_attribute logic", OS,
3809 OS << "const llvm::Triple &T = Target.getTriple();\n";
3810 OS << "switch (Syntax) {\n";
3811 OS << "case AttributeCommonInfo::Syntax::AS_GNU:\n";
3812 OS << " return llvm::StringSwitch<int>(Name)\n";
3813 GenerateHasAttrSpellingStringSwitch(GNU, OS, "GNU");
3814 OS << "case AttributeCommonInfo::Syntax::AS_Declspec:\n";
3815 OS << " return llvm::StringSwitch<int>(Name)\n";
3816 GenerateHasAttrSpellingStringSwitch(Declspec, OS, "Declspec");
3817 OS << "case AttributeCommonInfo::Syntax::AS_Microsoft:\n";
3818 OS << " return llvm::StringSwitch<int>(Name)\n";
3819 GenerateHasAttrSpellingStringSwitch(Microsoft, OS, "Microsoft");
3820 OS << "case AttributeCommonInfo::Syntax::AS_Pragma:\n";
3821 OS << " return llvm::StringSwitch<int>(Name)\n";
3822 GenerateHasAttrSpellingStringSwitch(Pragma, OS, "Pragma");
3823 OS << "case AttributeCommonInfo::Syntax::AS_HLSLAnnotation:\n";
3824 OS << " return llvm::StringSwitch<int>(Name)\n";
3825 GenerateHasAttrSpellingStringSwitch(HLSLAnnotation, OS, "HLSLAnnotation");
3826 auto fn = [&OS](StringRef Spelling,
3828 OS << "case AttributeCommonInfo::Syntax::AS_" << Spelling << ": {\n";
3832 OS << LS;
3833 OS << "if (ScopeName == \"" << Scope << "\") {\n";
3834 OS << " return llvm::StringSwitch<int>(Name)\n";
3835 GenerateHasAttrSpellingStringSwitch(List, OS, Spelling, Scope);
3836 OS << "}";
3838 OS << "\n} break;\n";
3842 OS << "case AttributeCommonInfo::Syntax::AS_Keyword:\n";
3843 OS << "case AttributeCommonInfo::Syntax::AS_ContextSensitiveKeyword:\n";
3844 OS << " llvm_unreachable(\"hasAttribute not supported for keyword\");\n";
3845 OS << " return 0;\n";
3846 OS << "case AttributeCommonInfo::Syntax::AS_Implicit:\n";
3847 OS << " llvm_unreachable (\"hasAttribute not supported for "
3849 OS << " return 0;\n";
3851 OS << "}\n";
3855 raw_ostream &OS) {
3858 OS, Records);
3860 OS << " switch (getParsedKind()) {\n";
3861 OS << " case IgnoredAttribute:\n";
3862 OS << " case UnknownAttribute:\n";
3863 OS << " case NoSemaHandlerAttribute:\n";
3864 OS << " llvm_unreachable(\"Ignored/unknown shouldn't get here\");\n";
3870 OS << " case AT_" << I.first << ": {\n";
3875 OS << " return 0;\n"
3888 OS << " if (";
3897 OS << "Name.size() == " << FS.name().size() << " && ";
3903 OS << "Name == \"" << FS.name() << "\""
3908 OS << "getSyntax() == AttributeCommonInfo::AS_" << FS.variety()
3911 OS << "AttributeCommonInfo::Scope::NONE";
3913 OS << "AttributeCommonInfo::Scope::" + FS.nameSpace().upper();
3915 OS << ")\n"
3919 OS << " break;\n"
3923 OS << " }\n"
3928 void EmitClangAttrASTVisitor(const RecordKeeper &Records, raw_ostream &OS) {
3929 emitSourceFileHeader("Used by RecursiveASTVisitor to visit attributes.", OS,
3934 OS << "#ifdef ATTR_VISITOR_DECLS_ONLY\n\n";
3940 OS << " bool Traverse"
3942 OS << " bool Visit"
3947 OS << "\n#else // ATTR_VISITOR_DECLS_ONLY\n\n";
3955 OS << "template <typename Derived>\n"
3964 createArgument(*Arg, R.getName())->writeASTVisitorTraversal(OS);
3968 .writeASTVisitorTraversal(OS);
3970 OS << " return true;\n";
3971 OS << "}\n\n";
3975 OS << "template <typename Derived>\n"
3987 OS << " case attr::" << R.getName() << ":\n"
3991 OS << " }\n"; // end switch
3992 OS << " llvm_unreachable(\"bad attribute kind\");\n";
3993 OS << "}\n"; // end function
3994 OS << "#endif // ATTR_VISITOR_DECLS_ONLY\n";
3999 raw_ostream &OS, bool AppliesToDecl) {
4001 OS << " switch (At->getKind()) {\n";
4006 OS << " case attr::" << R.getName() << ": {\n";
4012 OS << " return nullptr;\n";
4013 OS << " }\n";
4017 OS << " const auto *A = cast<"
4022 OS << " return A->clone(C);\n";
4023 OS << " }\n";
4035 ai->writeTemplateInstantiation(OS);
4037 OS << " return new (C) " << R.getName() << "Attr(C, *A";
4039 OS << ", ";
4040 ai->writeTemplateInstantiationArgs(OS);
4042 OS << ");\n"
4045 OS << " } // end switch\n"
4052 raw_ostream &OS) {
4053 emitSourceFileHeader("Template instantiation code for attributes", OS,
4058 OS << "namespace clang {\n"
4063 EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/false);
4064 OS << "}\n\n"
4068 EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/true);
4069 OS << "}\n\n"
4075 void EmitClangAttrParsedAttrList(const RecordKeeper &Records, raw_ostream &OS) {
4076 emitSourceFileHeader("List of all attributes that Clang recognizes", OS,
4079 OS << "#ifndef PARSED_ATTR\n";
4080 OS << "#define PARSED_ATTR(NAME) NAME\n";
4081 OS << "#endif\n\n";
4085 OS << "PARSED_ATTR(" << I.first << ")\n";
4093 static void emitArgInfo(const Record &R, raw_ostream &OS) {
4112 OS << " /*NumArgs=*/" << ArgCount << ",\n";
4113 OS << " /*OptArgs=*/" << (HasVariadic ? 15 : OptCount) << ",\n";
4114 OS << " /*NumArgMembers=*/" << ArgMemberCount << ",\n";
4194 static void GenerateCustomAppertainsTo(const Record &Subject, raw_ostream &OS) {
4213 OS << "static bool " << FnName << "(const Decl *D) {\n";
4214 OS << " if (const auto *S = dyn_cast<";
4215 OS << GetSubjectWithSuffix(Base);
4216 OS << ">(D))\n";
4217 OS << " return " << Subject.getValueAsString("CheckCode") << ";\n";
4218 OS << " return false;\n";
4219 OS << "}\n\n";
4224 static void GenerateAppertainsTo(const Record &Attr, raw_ostream &OS) {
4260 OS << "bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, ";
4261 OS << "const Decl *D) const override {\n";
4262 OS << " S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)\n";
4263 OS << " << AL << AL.isRegularKeywordAttribute() << "
4265 OS << " return false;\n";
4266 OS << "}\n\n";
4271 OS << "bool diagAppertainsToDecl(Sema &S, ";
4272 OS << "const ParsedAttr &Attr, const Decl *D) const override {\n";
4273 OS << " if (";
4281 OS << "!" << functionNameForCustomAppertainsTo(**I) << "(D)";
4283 OS << "!isa<" << GetSubjectWithSuffix(*I) << ">(D)";
4286 OS << " && ";
4288 OS << ") {\n";
4289 OS << " S.Diag(Attr.getLoc(), diag::";
4290 OS << (Warn ? "warn_attribute_wrong_decl_type_str"
4292 OS << ")\n";
4293 OS << " << Attr << Attr.isRegularKeywordAttribute() << ";
4294 OS << CalculateDiagnostic(*SubjectObj) << ";\n";
4295 OS << " return false;\n";
4296 OS << " }\n";
4297 OS << " return true;\n";
4298 OS << "}\n\n";
4305 OS << "bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, ";
4306 OS << "const Stmt *St) const override {\n";
4307 OS << " S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)\n";
4308 OS << " << AL << AL.isRegularKeywordAttribute() << "
4310 OS << " return false;\n";
4311 OS << "}\n\n";
4315 OS << "bool diagAppertainsToStmt(Sema &S, ";
4316 OS << "const ParsedAttr &Attr, const Stmt *St) const override {\n";
4317 OS << " if (";
4319 OS << "!isa<" << (*I)->getName() << ">(St)";
4321 OS << " && ";
4323 OS << ") {\n";
4324 OS << " S.Diag(Attr.getLoc(), diag::";
4325 OS << (Warn ? "warn_attribute_wrong_decl_type_str"
4327 OS << ")\n";
4328 OS << " << Attr << Attr.isRegularKeywordAttribute() << ";
4329 OS << CalculateDiagnostic(*SubjectObj) << ";\n";
4330 OS << " return false;\n";
4331 OS << " }\n";
4332 OS << " return true;\n";
4333 OS << "}\n\n";
4338 // written into OS and the checks for merging declaration attributes are
4342 raw_ostream &OS,
4388 OS << " using ParsedAttrInfo::diagMutualExclusion;\n\n";
4394 OS << " bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, "
4397 OS << " if (const auto *A = D->getAttr<" << A << ">()) {\n";
4398 OS << " S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible)"
4401 OS << " S.Diag(A->getLocation(), diag::note_conflicting_attribute);";
4402 OS << " \nreturn false;\n";
4403 OS << " }\n";
4405 OS << " return true;\n";
4406 OS << " }\n\n";
4474 raw_ostream &OS) {
4475 OS << "static bool checkAttributeMatchRuleAppliesTo(const Decl *D, "
4477 OS << " switch (rule) {\n";
4480 OS << " case " << Rule.getEnumValue() << ":\n";
4481 OS << " assert(false && \"Abstract matcher rule isn't allowed\");\n";
4482 OS << " return false;\n";
4487 OS << " case " << Rule.getEnumValue() << ":\n";
4488 OS << " return ";
4494 OS << functionNameForCustomAppertainsTo(**I) << "(D)";
4496 OS << "isa<" << GetSubjectWithSuffix(*I) << ">(D)";
4499 OS << " || ";
4501 OS << ";\n";
4503 OS << " }\n";
4504 OS << " llvm_unreachable(\"Invalid match rule\");\nreturn false;\n";
4505 OS << "}\n\n";
4509 raw_ostream &OS) {
4516 OS << "bool acceptsLangOpts(const LangOptions &LangOpts) const override {\n";
4517 OS << " return " << GenerateTestExpression(LangOpts) << ";\n";
4518 OS << "}\n\n";
4523 raw_ostream &OS) {
4555 OS << "bool existsInTarget(const TargetInfo &Target) const override {\n";
4557 OS << " const llvm::Triple &T = Target.getTriple(); (void)T;\n";
4558 OS << " return " << Test << ";\n";
4559 OS << "}\n\n";
4565 raw_ostream &OS) {
4598 OS << "bool spellingExistsInTarget(const TargetInfo &Target,\n";
4599 OS << " const unsigned SpellingListIndex) const "
4602 OS << " const llvm::Triple &T = Target.getTriple(); (void)T;\n";
4603 OS << " return " << Test << ";\n", OS << "}\n\n";
4607 raw_ostream &OS) {
4624 OS << "unsigned spellingIndexToSemanticSpelling(";
4625 OS << "const ParsedAttr &Attr) const override {\n";
4626 OS << Enum;
4627 OS << " unsigned Idx = Attr.getAttributeSpellingListIndex();\n";
4628 WriteSemanticSpellingSwitch("Idx", SemanticToSyntacticMap, OS);
4629 OS << "}\n\n";
4632 static void GenerateHandleDeclAttribute(const Record &Attr, raw_ostream &OS) {
4638 OS << "AttrHandling handleDeclAttribute(Sema &S, Decl *D,";
4639 OS << "const ParsedAttr &Attr) const override {\n";
4640 OS << " D->addAttr(::new (S.Context) " << Attr.getName();
4641 OS << "Attr(S.Context, Attr));\n";
4642 OS << " return AttributeApplied;\n";
4643 OS << "}\n\n";
4654 static void GenerateIsParamExpr(const Record &Attr, raw_ostream &OS) {
4655 OS << "bool isParamExpr(size_t N) const override {\n";
4656 OS << " return ";
4660 OS << "(N == " << I << ") || ";
4661 OS << "false;\n";
4662 OS << "}\n\n";
4666 raw_ostream &OS) {
4667 OS << "static void handleAttrWithDelayedArgs(Sema &S, Decl *D, ";
4668 OS << "const ParsedAttr &Attr) {\n";
4669 OS << " SmallVector<Expr *, 4> ArgExprs;\n";
4670 OS << " ArgExprs.reserve(Attr.getNumArgs());\n";
4671 OS << " for (unsigned I = 0; I < Attr.getNumArgs(); ++I) {\n";
4672 OS << " assert(!Attr.isArgIdent(I));\n";
4673 OS << " ArgExprs.push_back(Attr.getArgAsExpr(I));\n";
4674 OS << " }\n";
4675 OS << " clang::Attr *CreatedAttr = nullptr;\n";
4676 OS << " switch (Attr.getKind()) {\n";
4677 OS << " default:\n";
4678 OS << " llvm_unreachable(\"Attribute cannot hold delayed arguments.\");\n";
4684 OS << " case ParsedAttr::AT_" << I.first << ": {\n";
4685 OS << " CreatedAttr = " << R.getName() << "Attr::CreateWithDelayedArgs";
4686 OS << "(S.Context, ArgExprs.data(), ArgExprs.size(), Attr);\n";
4687 OS << " break;\n";
4688 OS << " }\n";
4690 OS << " }\n";
4691 OS << " D->addAttr(CreatedAttr);\n";
4692 OS << "}\n\n";
4703 void EmitClangAttrParsedAttrImpl(const RecordKeeper &Records, raw_ostream &OS) {
4704 emitSourceFileHeader("Parsed attribute helpers", OS, Records);
4706 OS << "#if !defined(WANT_DECL_MERGE_LOGIC) && "
4725 GenerateCustomAppertainsTo(*Subject, OS);
4748 OS << "static constexpr ParsedAttrInfo::Spelling " << I->first
4759 OS << " {AttributeCommonInfo::AS_" << S.variety();
4760 OS << ", \"" << Spelling << "\"},\n";
4762 OS << "};\n";
4779 OS << "static constexpr const char *" << I->first << "ArgNames[] = {\n";
4781 OS << '"' << N << "\",";
4782 OS << "};\n";
4785 OS << "struct ParsedAttrInfo" << I->first
4787 OS << " constexpr ParsedAttrInfo" << I->first << "() : ParsedAttrInfo(\n";
4788 OS << " /*AttrKind=*/ParsedAttr::AT_" << AttrName << ",\n";
4789 emitArgInfo(Attr, OS);
4790 OS << " /*HasCustomParsing=*/";
4791 OS << Attr.getValueAsBit("HasCustomParsing") << ",\n";
4792 OS << " /*AcceptsExprPack=*/";
4793 OS << Attr.getValueAsBit("AcceptsExprPack") << ",\n";
4794 OS << " /*IsTargetSpecific=*/";
4795 OS << Attr.isSubClassOf("TargetSpecificAttr") << ",\n";
4796 OS << " /*IsType=*/";
4797 OS << (Attr.isSubClassOf("TypeAttr") || Attr.isSubClassOf("DeclOrTypeAttr"))
4799 OS << " /*IsStmt=*/";
4800 OS << (Attr.isSubClassOf("StmtAttr") || Attr.isSubClassOf("DeclOrStmtAttr"))
4802 OS << " /*IsKnownToGCC=*/";
4803 OS << IsKnownToGCC(Attr) << ",\n";
4804 OS << " /*IsSupportedByPragmaAttribute=*/";
4805 OS << PragmaAttributeSupport.isAttributedSupported(*I->second) << ",\n";
4807 OS << " /*Spellings=*/" << I->first << "Spellings,\n";
4809 OS << " /*Spellings=*/{},\n";
4811 OS << " /*ArgNames=*/" << I->first << "ArgNames";
4813 OS << " /*ArgNames=*/{}";
4814 OS << ") {}\n";
4815 GenerateAppertainsTo(Attr, OS);
4816 GenerateMutualExclusionsChecks(Attr, Records, OS, MergeDeclOS, MergeStmtOS);
4817 GenerateLangOptRequirements(Attr, OS);
4818 GenerateTargetRequirements(Attr, Dupes, OS);
4820 Attr, Attr.getValueAsListOfDefs("TargetSpecificSpellings"), OS);
4821 GenerateSpellingIndexToSemanticSpelling(Attr, OS);
4822 PragmaAttributeSupport.generateStrictConformsTo(*I->second, OS);
4823 GenerateHandleDeclAttribute(Attr, OS);
4824 GenerateIsParamExpr(Attr, OS);
4825 OS << "static const ParsedAttrInfo" << I->first << " Instance;\n";
4826 OS << "};\n";
4827 OS << "const ParsedAttrInfo" << I->first << " ParsedAttrInfo" << I->first
4831 OS << "static const ParsedAttrInfo *AttrInfoMap[] = {\n";
4833 OS << "&ParsedAttrInfo" << I->first << "::Instance,\n";
4835 OS << "};\n\n";
4838 GenerateHandleAttrWithDelayedArgs(Records, OS);
4841 emitAttributeMatchRules(PragmaAttributeSupport, OS);
4843 OS << "#elif defined(WANT_DECL_MERGE_LOGIC)\n\n";
4846 OS << "static bool DiagnoseMutualExclusions(Sema &S, const NamedDecl *D, "
4848 OS << DeclMergeChecks;
4849 OS << " return true;\n";
4850 OS << "}\n\n";
4852 OS << "#elif defined(WANT_STMT_MERGE_LOGIC)\n\n";
4855 OS << "static bool DiagnoseMutualExclusions(Sema &S, "
4857 OS << " for (const Attr *A : C) {\n";
4858 OS << StmtMergeChecks;
4859 OS << " }\n";
4860 OS << " return true;\n";
4861 OS << "}\n\n";
4863 OS << "#endif\n";
4868 raw_ostream &OS) {
4869 emitSourceFileHeader("Attribute name matcher", OS, Records);
4946 OS << "static AttributeCommonInfo::Kind getAttrKind(StringRef Name, ";
4947 OS << "AttributeCommonInfo::Syntax Syntax) {\n";
4948 OS << " if (AttributeCommonInfo::AS_GNU == Syntax) {\n";
4949 StringMatcher("Name", GNU, OS).Emit();
4950 OS << " } else if (AttributeCommonInfo::AS_Declspec == Syntax) {\n";
4951 StringMatcher("Name", Declspec, OS).Emit();
4952 OS << " } else if (AttributeCommonInfo::AS_Microsoft == Syntax) {\n";
4953 StringMatcher("Name", Microsoft, OS).Emit();
4954 OS << " } else if (AttributeCommonInfo::AS_CXX11 == Syntax) {\n";
4955 StringMatcher("Name", CXX11, OS).Emit();
4956 OS << " } else if (AttributeCommonInfo::AS_C23 == Syntax) {\n";
4957 StringMatcher("Name", C23, OS).Emit();
4958 OS << " } else if (AttributeCommonInfo::AS_Keyword == Syntax || ";
4959 OS << "AttributeCommonInfo::AS_ContextSensitiveKeyword == Syntax) {\n";
4960 StringMatcher("Name", Keywords, OS).Emit();
4961 OS << " } else if (AttributeCommonInfo::AS_Pragma == Syntax) {\n";
4962 StringMatcher("Name", Pragma, OS).Emit();
4963 OS << " } else if (AttributeCommonInfo::AS_HLSLAnnotation == Syntax) {\n";
4964 StringMatcher("Name", HLSLAnnotation, OS).Emit();
4965 OS << " }\n";
4966 OS << " return AttributeCommonInfo::UnknownAttribute;\n"
4971 void EmitClangAttrTextNodeDump(const RecordKeeper &Records, raw_ostream &OS) {
4972 emitSourceFileHeader("Attribute text node dumper", OS, Records);
4988 SS << " OS << \" \" << A->getSpelling();\n";
4995 VariadicExprArgument("DelayedArgs", R.getName()).writeDump(OS);
4998 OS << " void Visit" << R.getName() << "Attr(const " << R.getName()
5001 OS << " const auto *SA = cast<" << R.getName()
5003 OS << FunctionContent;
5004 OS << " }\n";
5009 void EmitClangAttrNodeTraverse(const RecordKeeper &Records, raw_ostream &OS) {
5010 emitSourceFileHeader("Attribute text node traverser", OS, Records);
5026 OS << " void Visit" << R.getName() << "Attr(const " << R.getName()
5029 OS << " const auto *SA = cast<" << R.getName()
5031 OS << FunctionContent;
5032 OS << " }\n";
5038 raw_ostream &OS) {
5040 emitSourceFileHeader("Parser-related llvm::StringSwitch cases", OS, Records);
5041 emitClangAttrArgContextList(Records, OS);
5042 emitClangAttrIdentifierArgList(Records, OS);
5043 emitClangAttrUnevaluatedStringLiteralList(Records, OS);
5044 emitClangAttrVariadicIdentifierArgList(Records, OS);
5045 emitClangAttrThisIsaIdentifierArgList(Records, OS);
5046 emitClangAttrAcceptsExprPack(Records, OS);
5047 emitClangAttrTypeArgList(Records, OS);
5048 emitClangAttrLateParsedList(Records, OS);
5049 emitClangAttrLateParsedExperimentalList(Records, OS);
5050 emitClangAttrStrictIdentifierArgList(Records, OS);
5054 const RecordKeeper &Records, raw_ostream &OS) {
5055 getPragmaAttributeSupport(Records).generateParsingHelpers(OS);
5058 void EmitClangAttrDocTable(const RecordKeeper &Records, raw_ostream &OS) {
5059 emitSourceFileHeader("Clang attribute documentation", OS, Records);
5070 OS << "\nstatic const char AttrDoc_" << A->getName() << "[] = "
5144 raw_ostream &OS) {
5146 OS << Name << "\n" << std::string(Name.size(), '=') << "\n";
5151 OS << ContentStr.trim();
5153 OS << "\n\n";
5209 const DocumentationData &Doc, raw_ostream &OS) {
5212 OS << ".. _" << Label << ":\n\n";
5213 OS << Doc.Heading << "\n" << std::string(Doc.Heading.length(), '-') << "\n";
5218 OS << ".. csv-table:: Supported Syntaxes\n";
5219 OS << " :header: \"GNU\", \"C++11\", \"C23\", \"``__declspec``\",";
5220 OS << " \"Keyword\", \"``#pragma``\", \"HLSL Annotation\", \"``#pragma "
5222 OS << "attribute``\"\n\n \"";
5233 OS << " |br| ";
5234 OS << "``" << Spelling << "``";
5238 OS << "\",\"";
5243 OS << "Yes";
5244 OS << "\"\n\n";
5249 OS << "This attribute has been deprecated, and may be removed in a future "
5254 OS << " This attribute has been superseded by ``" << Replacement
5256 OS << "\n\n";
5261 OS << ContentStr.trim();
5263 OS << "\n\n\n";
5266 void EmitClangAttrDocs(const RecordKeeper &Records, raw_ostream &OS) {
5275 OS << Documentation->getValueAsString("Intro") << "\n";
5312 WriteCategoryHeader(I.first, OS);
5322 WriteDocumentation(Records, Doc, OS);
5327 raw_ostream &OS) {
5330 OS << "#pragma clang attribute supports the following attributes:\n";
5334 OS << I.first;
5336 OS << " ()\n";
5340 OS << " (";
5347 OS << ", ";
5352 OS << RuleSet.getRule().getEnumValueName();
5355 OS << "(";
5358 OS << ", ";
5359 OS << Rule.value().getEnumValueName();
5361 OS << ")";
5363 OS << ")\n";
5365 OS << "End of supported attributes.\n";