1 //===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains the main function for Clang's TableGen. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "ClangASTNodesEmitter.h" 15 #include "ClangAttrEmitter.h" 16 #include "ClangDiagnosticsEmitter.h" 17 #include "ClangSACheckersEmitter.h" 18 #include "NeonEmitter.h" 19 #include "OptParserEmitter.h" 20 21 #include "llvm/Support/CommandLine.h" 22 #include "llvm/Support/PrettyStackTrace.h" 23 #include "llvm/Support/Signals.h" 24 #include "llvm/TableGen/Error.h" 25 #include "llvm/TableGen/Main.h" 26 #include "llvm/TableGen/Record.h" 27 #include "llvm/TableGen/TableGenAction.h" 28 29 using namespace llvm; 30 31 enum ActionType { 32 GenClangAttrClasses, 33 GenClangAttrImpl, 34 GenClangAttrList, 35 GenClangAttrPCHRead, 36 GenClangAttrPCHWrite, 37 GenClangAttrSpellingList, 38 GenClangAttrLateParsedList, 39 GenClangAttrTemplateInstantiate, 40 GenClangDiagsDefs, 41 GenClangDiagGroups, 42 GenClangDiagsIndexName, 43 GenClangDeclNodes, 44 GenClangStmtNodes, 45 GenClangSACheckers, 46 GenOptParserDefs, GenOptParserImpl, 47 GenArmNeon, 48 GenArmNeonSema, 49 GenArmNeonTest 50 }; 51 52 namespace { 53 cl::opt<ActionType> 54 Action(cl::desc("Action to perform:"), 55 cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 56 "Generate option definitions"), 57 clEnumValN(GenOptParserImpl, "gen-opt-parser-impl", 58 "Generate option parser implementation"), 59 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 60 "Generate clang attribute clases"), 61 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 62 "Generate clang attribute implementations"), 63 clEnumValN(GenClangAttrList, "gen-clang-attr-list", 64 "Generate a clang attribute list"), 65 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 66 "Generate clang PCH attribute reader"), 67 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 68 "Generate clang PCH attribute writer"), 69 clEnumValN(GenClangAttrSpellingList, 70 "gen-clang-attr-spelling-list", 71 "Generate a clang attribute spelling list"), 72 clEnumValN(GenClangAttrLateParsedList, 73 "gen-clang-attr-late-parsed-list", 74 "Generate a clang attribute LateParsed list"), 75 clEnumValN(GenClangAttrTemplateInstantiate, 76 "gen-clang-attr-template-instantiate", 77 "Generate a clang template instantiate code"), 78 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 79 "Generate Clang diagnostics definitions"), 80 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 81 "Generate Clang diagnostic groups"), 82 clEnumValN(GenClangDiagsIndexName, 83 "gen-clang-diags-index-name", 84 "Generate Clang diagnostic name index"), 85 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 86 "Generate Clang AST declaration nodes"), 87 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 88 "Generate Clang AST statement nodes"), 89 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 90 "Generate Clang Static Analyzer checkers"), 91 clEnumValN(GenArmNeon, "gen-arm-neon", 92 "Generate arm_neon.h for clang"), 93 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 94 "Generate ARM NEON sema support for clang"), 95 clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 96 "Generate ARM NEON tests for clang"), 97 clEnumValEnd)); 98 99 cl::opt<std::string> 100 ClangComponent("clang-component", 101 cl::desc("Only use warnings from specified component"), 102 cl::value_desc("component"), cl::Hidden); 103 104 class ClangTableGenAction : public TableGenAction { 105 public: 106 bool operator()(raw_ostream &OS, RecordKeeper &Records) { 107 switch (Action) { 108 case GenClangAttrClasses: 109 ClangAttrClassEmitter(Records).run(OS); 110 break; 111 case GenClangAttrImpl: 112 ClangAttrImplEmitter(Records).run(OS); 113 break; 114 case GenClangAttrList: 115 ClangAttrListEmitter(Records).run(OS); 116 break; 117 case GenClangAttrPCHRead: 118 ClangAttrPCHReadEmitter(Records).run(OS); 119 break; 120 case GenClangAttrPCHWrite: 121 ClangAttrPCHWriteEmitter(Records).run(OS); 122 break; 123 case GenClangAttrSpellingList: 124 ClangAttrSpellingListEmitter(Records).run(OS); 125 break; 126 case GenClangAttrLateParsedList: 127 ClangAttrLateParsedListEmitter(Records).run(OS); 128 break; 129 case GenClangAttrTemplateInstantiate: 130 ClangAttrTemplateInstantiateEmitter(Records).run(OS); 131 break; 132 case GenClangDiagsDefs: 133 ClangDiagsDefsEmitter(Records, ClangComponent).run(OS); 134 break; 135 case GenClangDiagGroups: 136 ClangDiagGroupsEmitter(Records).run(OS); 137 break; 138 case GenClangDiagsIndexName: 139 ClangDiagsIndexNameEmitter(Records).run(OS); 140 break; 141 case GenClangDeclNodes: 142 ClangASTNodesEmitter(Records, "Decl", "Decl").run(OS); 143 ClangDeclContextEmitter(Records).run(OS); 144 break; 145 case GenClangStmtNodes: 146 ClangASTNodesEmitter(Records, "Stmt", "").run(OS); 147 break; 148 case GenClangSACheckers: 149 ClangSACheckersEmitter(Records).run(OS); 150 break; 151 case GenOptParserDefs: 152 OptParserEmitter(Records, true).run(OS); 153 break; 154 case GenOptParserImpl: 155 OptParserEmitter(Records, false).run(OS); 156 break; 157 case GenArmNeon: 158 NeonEmitter(Records).run(OS); 159 break; 160 case GenArmNeonSema: 161 NeonEmitter(Records).runHeader(OS); 162 break; 163 case GenArmNeonTest: 164 NeonEmitter(Records).runTests(OS); 165 break; 166 } 167 168 return false; 169 } 170 }; 171 } 172 173 int main(int argc, char **argv) { 174 sys::PrintStackTraceOnErrorSignal(); 175 PrettyStackTraceProgram X(argc, argv); 176 cl::ParseCommandLineOptions(argc, argv); 177 178 ClangTableGenAction Action; 179 return TableGenMain(argv[0], Action); 180 } 181