Lines Matching full:os

34   IfDefScope(StringRef Name, raw_ostream &OS) : Name(Name), OS(OS) {
35 OS << "#ifdef " << Name << "\n"
39 ~IfDefScope() { OS << "\n#endif // " << Name << "\n\n"; }
43 raw_ostream &OS;
50 raw_ostream &OS, StringRef Enum, StringRef Prefix,
53 OS << "\n";
54 OS << "enum class " << Enum << " {\n";
57 OS << " " << Prefix << Rec.getFormattedName() << ",\n";
59 OS << "};\n";
60 OS << "\n";
61 OS << "static constexpr std::size_t " << Enum
70 OS << "\n";
73 OS << "constexpr auto " << Prefix << Rec.getFormattedName() << " = "
83 raw_ostream &OS,
99 OS << "\n";
100 OS << "enum class " << EnumName << " {\n";
103 OS << " " << CV->getName() << "=" << CVal.getValue() << ",\n";
105 OS << "};\n";
108 OS << "\n";
110 OS << "constexpr auto " << CV->getName() << " = "
196 static void EmitDirectivesDecl(RecordKeeper &Records, raw_ostream &OS) {
201 OS << "#ifndef LLVM_" << DirLang.getName() << "_INC\n";
202 OS << "#define LLVM_" << DirLang.getName() << "_INC\n";
203 OS << "\n#include \"llvm/ADT/ArrayRef.h\"\n";
206 OS << "#include \"llvm/ADT/BitmaskEnum.h\"\n";
208 OS << "#include <cstddef>\n"; // for size_t
209 OS << "\n";
210 OS << "namespace llvm {\n";
211 OS << "class StringRef;\n";
217 OS << "namespace " << Ns << " {\n";
220 OS << "\nLLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();\n";
228 GenerateEnumClass(associations, OS, "Association",
231 GenerateEnumClass(DirLang.getCategories(), OS, "Category", /*Prefix=*/"",
235 GenerateEnumClass(DirLang.getDirectives(), OS, "Directive",
240 GenerateEnumClass(DirLang.getClauses(), OS, "Clause",
246 GenerateEnumClauseVal(DirLang.getClauses(), OS, DirLang, EnumHelperFuncs);
249 OS << "\n";
250 OS << "// Enumeration helper functions\n";
251 OS << "Directive get" << DirLang.getName()
253 OS << "\n";
254 OS << "llvm::StringRef get" << DirLang.getName()
256 OS << "\n";
257 OS << "Clause get" << DirLang.getName()
259 OS << "\n";
260 OS << "llvm::StringRef get" << DirLang.getName() << "ClauseName(Clause C);\n";
261 OS << "\n";
262 OS << "/// Return true if \\p C is a valid clause for \\p D in version \\p "
264 OS << "bool isAllowedClauseForDirective(Directive D, "
266 OS << "\n";
267 OS << "constexpr std::size_t getMaxLeafCount() { return "
269 OS << "Association getDirectiveAssociation(Directive D);\n";
270 OS << "Category getDirectiveCategory(Directive D);\n";
272 OS << EnumHelperFuncs;
273 OS << "\n";
278 OS << "} // namespace " << Ns << "\n";
280 OS << "} // namespace llvm\n";
282 OS << "#endif // LLVM_" << DirLang.getName() << "_INC\n";
287 raw_ostream &OS, StringRef Enum,
290 OS << "\n";
291 OS << "llvm::StringRef llvm::" << DirLang.getCppNamespace() << "::get"
293 OS << " switch (Kind) {\n";
296 OS << " case " << Prefix << Rec.getFormattedName() << ":\n";
297 OS << " return \"";
299 OS << Rec.getName();
301 OS << Rec.getAlternativeName();
302 OS << "\";\n";
304 OS << " }\n"; // switch
305 OS << " llvm_unreachable(\"Invalid " << DirLang.getName() << " " << Enum
307 OS << "}\n";
312 raw_ostream &OS, StringRef Enum,
326 OS << "\n";
327 OS << Enum << " llvm::" << DirLang.getCppNamespace() << "::get"
329 OS << " return llvm::StringSwitch<" << Enum << ">(Str)\n";
334 OS << " .Case(\"" << Rec.getName() << "\"," << Prefix
337 OS << " .Case(\"" << Rec.getName() << "\"," << Prefix
341 OS << " .Default(" << Prefix << DefaultRec.getFormattedName() << ");\n";
342 OS << "}\n";
347 raw_ostream &OS) {
372 OS << "\n";
373 OS << EnumName << " llvm::" << DirLang.getCppNamespace() << "::get"
375 OS << " return llvm::StringSwitch<" << EnumName << ">(Str)\n";
378 OS << " .Case(\"" << CVal.getFormattedName() << "\"," << CV->getName()
381 OS << " .Default(" << DefaultName << ");\n";
382 OS << "}\n";
384 OS << "\n";
385 OS << "llvm::StringRef llvm::" << DirLang.getCppNamespace() << "::get"
389 OS << " switch (x) {\n";
392 OS << " case " << CV->getName() << ":\n";
393 OS << " return \"" << CVal.getFormattedName() << "\";\n";
395 OS << " }\n"; // switch
396 OS << " llvm_unreachable(\"Invalid " << DirLang.getName() << " "
398 OS << "}\n";
404 raw_ostream &OS, StringRef DirectiveName,
413 OS << " case " << DirLang.getClausePrefix() << ClauseFormattedName
415 OS << " return " << VerClause.getMinVersion()
436 raw_ostream &OS) {
437 OS << "\n";
438 OS << "bool llvm::" << DirLang.getCppNamespace()
441 OS << " assert(unsigned(D) <= llvm::" << DirLang.getCppNamespace()
443 OS << " assert(unsigned(C) <= llvm::" << DirLang.getCppNamespace()
446 OS << " switch (D) {\n";
451 OS << " case " << DirLang.getDirectivePrefix() << Dir.getFormattedName()
457 OS << " return false;\n";
459 OS << " switch (C) {\n";
463 GenerateCaseForVersionedClauses(Dir.getAllowedClauses(), OS,
466 GenerateCaseForVersionedClauses(Dir.getAllowedOnceClauses(), OS,
469 GenerateCaseForVersionedClauses(Dir.getAllowedExclusiveClauses(), OS,
472 GenerateCaseForVersionedClauses(Dir.getRequiredClauses(), OS,
475 OS << " default:\n";
476 OS << " return false;\n";
477 OS << " }\n"; // End of clauses switch
479 OS << " break;\n";
482 OS << " }\n"; // End of directives switch
483 OS << " llvm_unreachable(\"Invalid " << DirLang.getName()
485 OS << "}\n"; // End of function isAllowedClauseForDirective
488 static void EmitLeafTable(const DirectiveLanguage &DirLang, raw_ostream &OS,
579 OS << "\nstatic_assert(sizeof(" << DirectiveType << ") == sizeof(int));\n";
581 OS << "[[maybe_unused]] static const " << DirectiveType << ' ' << TableName
585 OS << " {" << GetDirectiveName(DirLang, Directives[Leaves[0]]);
586 OS << ", static_cast<" << DirectiveType << ">(" << Leaves[1] << "),";
590 OS << ' ' << GetDirectiveName(DirLang, Directives[Leaves[I]]) << ',';
592 OS << " static_cast<" << DirectiveType << ">(-1),";
594 OS << "},\n";
596 OS << "};\n\n";
602 OS << "[[maybe_unused]] static auto " << TableName
608 OS << "[[maybe_unused]] static const int " << TableName << "Ordering[] = {\n";
609 OS << " ";
614 OS << ' ' << Idx << ',';
615 OS << "\n};\n";
619 raw_ostream &OS) {
726 OS << '\n';
739 OS << AssociationTypeName << " llvm::" << DirLang.getCppNamespace()
741 OS << " switch (Dir) {\n";
745 OS << " case " << getQualifiedName(Dir.getFormattedName()) << ":\n";
746 OS << " return " << AssociationTypeName
750 OS << " } // switch (Dir)\n";
751 OS << " llvm_unreachable(\"Unexpected directive\");\n";
752 OS << "}\n";
756 raw_ostream &OS) {
761 OS << '\n';
762 OS << CategoryTypeName << ' ' << LangNamespace << "::getDirectiveCategory("
764 OS << " switch (Dir) {\n";
768 OS << " case " << GetDirectiveName(DirLang, R) << ":\n";
769 OS << " return " << CategoryNamespace
772 OS << " } // switch (Dir)\n";
773 OS << " llvm_unreachable(\"Unexpected directive\");\n";
774 OS << "}\n";
779 raw_ostream &OS, StringRef ClauseSetPrefix,
783 OS << "\n";
784 OS << " static " << DirLang.getClauseEnumSetClass() << " " << ClauseSetPrefix
789 OS << " llvm::" << DirLang.getCppNamespace()
793 OS << " };\n";
798 raw_ostream &OS) {
800 IfDefScope Scope("GEN_FLANG_DIRECTIVE_CLAUSE_SETS", OS);
802 OS << "\n";
803 OS << "namespace llvm {\n";
809 OS << "namespace " << Ns << " {\n";
814 OS << "\n";
815 OS << " // Sets for " << Dir.getName() << "\n";
817 GenerateClauseSet(Dir.getAllowedClauses(), OS, "allowedClauses_", Dir,
819 GenerateClauseSet(Dir.getAllowedOnceClauses(), OS, "allowedOnceClauses_",
821 GenerateClauseSet(Dir.getAllowedExclusiveClauses(), OS,
823 GenerateClauseSet(Dir.getRequiredClauses(), OS, "requiredClauses_", Dir,
829 OS << "} // namespace " << Ns << "\n";
831 OS << "} // namespace llvm\n";
838 raw_ostream &OS) {
840 IfDefScope Scope("GEN_FLANG_DIRECTIVE_CLAUSE_MAP", OS);
842 OS << "\n";
843 OS << "{\n";
847 OS << " {llvm::" << DirLang.getCppNamespace()
850 OS << " {\n";
851 OS << " llvm::" << DirLang.getCppNamespace() << "::allowedClauses_"
853 OS << " llvm::" << DirLang.getCppNamespace() << "::allowedOnceClauses_"
855 OS << " llvm::" << DirLang.getCppNamespace()
858 OS << " llvm::" << DirLang.getCppNamespace() << "::requiredClauses_"
860 OS << " }\n";
861 OS << " },\n";
864 OS << "}\n";
873 raw_ostream &OS) {
875 IfDefScope Scope("GEN_FLANG_CLAUSE_PARSER_CLASSES", OS);
877 OS << "\n";
882 OS << "WRAPPER_CLASS(" << Clause.getFormattedParserClassName() << ", ";
884 OS << "std::optional<std::list<" << Clause.getFlangClass() << ">>";
886 OS << "std::optional<" << Clause.getFlangClass() << ">";
888 OS << "std::list<" << Clause.getFlangClass() << ">";
890 OS << Clause.getFlangClass();
893 OS << "EMPTY_CLASS(" << Clause.getFormattedParserClassName();
895 OS << ");\n";
901 raw_ostream &OS) {
903 IfDefScope Scope("GEN_FLANG_CLAUSE_PARSER_CLASSES_LIST", OS);
905 OS << "\n";
906 llvm::interleaveComma(DirLang.getClauses(), OS, [&](Record *C) {
908 OS << Clause.getFormattedParserClassName() << "\n";
914 raw_ostream &OS) {
916 IfDefScope Scope("GEN_FLANG_DUMP_PARSE_TREE_CLAUSES", OS);
918 OS << "\n";
921 OS << "NODE(" << DirLang.getFlangClauseBaseClass() << ", "
929 raw_ostream &OS) {
931 IfDefScope Scope("GEN_FLANG_CLAUSE_UNPARSE", OS);
933 OS << "\n";
939 OS << "void Unparse(const " << DirLang.getFlangClauseBaseClass()
941 OS << " Word(\"" << Clause.getName().upper() << "\");\n";
943 OS << " Walk(\"(\", x.v, \")\");\n";
944 OS << "}\n";
946 OS << "void Unparse(const " << DirLang.getFlangClauseBaseClass()
948 OS << " Word(\"" << Clause.getName().upper() << "\");\n";
949 OS << " Put(\"(\");\n";
950 OS << " if (x.v.has_value())\n";
952 OS << " Walk(x.v, \",\");\n";
954 OS << " Walk(x.v);\n";
955 OS << " else\n";
956 OS << " Put(\"" << Clause.getDefaultValue() << "\");\n";
957 OS << " Put(\")\");\n";
958 OS << "}\n";
960 OS << "void Unparse(const " << DirLang.getFlangClauseBaseClass()
962 OS << " Word(\"" << Clause.getName().upper() << "\");\n";
963 OS << " Put(\"(\");\n";
965 OS << " Walk(x.v, \",\");\n";
967 OS << " Walk(x.v);\n";
968 OS << " Put(\")\");\n";
969 OS << "}\n";
972 OS << "void Before(const " << DirLang.getFlangClauseBaseClass()
981 raw_ostream &OS) {
983 IfDefScope Scope("GEN_FLANG_CLAUSE_CHECK_ENTER", OS);
985 OS << "\n";
988 OS << "void Enter(const parser::" << DirLang.getFlangClauseBaseClass()
996 raw_ostream &OS) {
998 IfDefScope Scope("GEN_FLANG_CLAUSE_PARSER_KIND_MAP", OS);
1000 OS << "\n";
1003 OS << "if constexpr (std::is_same_v<A, parser::"
1006 OS << ">)\n";
1007 OS << " return llvm::" << DirLang.getCppNamespace()
1012 OS << "llvm_unreachable(\"Invalid " << DirLang.getName()
1024 raw_ostream &OS) {
1029 IfDefScope Scope("GEN_FLANG_CLAUSES_PARSER", OS);
1030 OS << "\n";
1033 OS << "TYPE_PARSER(\n";
1037 OS << " \"" << Clause.getName() << "\"";
1039 OS << " ("
1042 OS << " || \"" << alias << "\"_tok";
1044 OS << ")";
1047 OS << " >> construct<" << DirLang.getFlangClauseBaseClass()
1051 OS << "))";
1053 OS << " ||";
1054 OS << "\n";
1060 OS << "maybe(";
1061 OS << "parenthesized(";
1063 OS << "nonemptyList(";
1066 OS << "\"" << Clause.getPrefix() << ":\" >> ";
1082 OS << Parser;
1084 OS << " || " << Parser;
1086 OS << ")";
1087 OS << ")"; // close parenthesized(.
1090 OS << ")";
1091 OS << "))";
1093 OS << " ||";
1094 OS << "\n";
1097 OS << ")\n";
1103 raw_ostream &OS) {
1105 GenerateDirectiveClauseSets(DirLang, OS);
1107 GenerateDirectiveClauseMap(DirLang, OS);
1109 GenerateFlangClauseParserClass(DirLang, OS);
1111 GenerateFlangClauseParserClassList(DirLang, OS);
1113 GenerateFlangClauseDump(DirLang, OS);
1115 GenerateFlangClauseUnparse(DirLang, OS);
1117 GenerateFlangClauseCheckPrototypes(DirLang, OS);
1119 GenerateFlangClauseParserKindMap(DirLang, OS);
1121 GenerateFlangClausesParser(DirLang, OS);
1125 raw_ostream &OS) {
1127 IfDefScope Scope("GEN_CLANG_CLAUSE_CLASS", OS);
1129 OS << "\n";
1131 OS << "#ifndef CLAUSE\n";
1132 OS << "#define CLAUSE(Enum, Str, Implicit)\n";
1133 OS << "#endif\n";
1134 OS << "#ifndef CLAUSE_CLASS\n";
1135 OS << "#define CLAUSE_CLASS(Enum, Str, Class)\n";
1136 OS << "#endif\n";
1137 OS << "#ifndef CLAUSE_NO_CLASS\n";
1138 OS << "#define CLAUSE_NO_CLASS(Enum, Str)\n";
1139 OS << "#endif\n";
1140 OS << "\n";
1141 OS << "#define __CLAUSE(Name, Class) \\\n";
1142 OS << " CLAUSE(" << DirLang.getClausePrefix()
1144 OS << " CLAUSE_CLASS(" << DirLang.getClausePrefix()
1146 OS << "#define __CLAUSE_NO_CLASS(Name) \\\n";
1147 OS << " CLAUSE(" << DirLang.getClausePrefix()
1149 OS << " CLAUSE_NO_CLASS(" << DirLang.getClausePrefix() << "##Name, #Name)\n";
1150 OS << "#define __IMPLICIT_CLAUSE_CLASS(Name, Str, Class) \\\n";
1151 OS << " CLAUSE(" << DirLang.getClausePrefix()
1153 OS << " CLAUSE_CLASS(" << DirLang.getClausePrefix()
1155 OS << "#define __IMPLICIT_CLAUSE_NO_CLASS(Name, Str) \\\n";
1156 OS << " CLAUSE(" << DirLang.getClausePrefix()
1158 OS << " CLAUSE_NO_CLASS(" << DirLang.getClausePrefix() << "##Name, Str)\n";
1159 OS << "\n";
1165 OS << "__IMPLICIT_CLAUSE_NO_CLASS(" << C.getFormattedName() << ", \""
1168 OS << "__CLAUSE_NO_CLASS(" << C.getFormattedName() << ")\n";
1172 OS << "__IMPLICIT_CLAUSE_CLASS(" << C.getFormattedName() << ", \""
1175 OS << "__CLAUSE(" << C.getFormattedName() << ", " << C.getClangClass()
1181 OS << "\n";
1182 OS << "#undef __IMPLICIT_CLAUSE_NO_CLASS\n";
1183 OS << "#undef __IMPLICIT_CLAUSE_CLASS\n";
1184 OS << "#undef __CLAUSE_NO_CLASS\n";
1185 OS << "#undef __CLAUSE\n";
1186 OS << "#undef CLAUSE_NO_CLASS\n";
1187 OS << "#undef CLAUSE_CLASS\n";
1188 OS << "#undef CLAUSE\n";
1194 raw_ostream &OS) {
1195 IfDefScope Scope("GEN_DIRECTIVES_IMPL", OS);
1197 OS << "\n#include \"llvm/Support/ErrorHandling.h\"\n";
1200 GenerateGetKind(DirLang.getDirectives(), OS, "Directive", DirLang,
1204 GenerateGetName(DirLang.getDirectives(), OS, "Directive", DirLang,
1208 GenerateGetKind(DirLang.getClauses(), OS, "Clause", DirLang,
1213 GenerateGetName(DirLang.getClauses(), OS, "Clause", DirLang,
1217 GenerateGetKindClauseVal(DirLang, OS);
1220 GenerateIsAllowedClause(DirLang, OS);
1223 GenerateGetDirectiveAssociation(DirLang, OS);
1226 GenerateGetDirectiveCategory(DirLang, OS);
1229 EmitLeafTable(DirLang, OS, "LeafConstructTable");
1234 static void EmitDirectivesImpl(RecordKeeper &Records, raw_ostream &OS) {
1239 EmitDirectivesFlangImpl(DirLang, OS);
1241 GenerateClauseClassMacro(DirLang, OS);
1243 EmitDirectivesBasicImpl(DirLang, OS);