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 "TableGenBackends.h" // Declares all backends. 15 16 #include "llvm/Support/CommandLine.h" 17 #include "llvm/Support/PrettyStackTrace.h" 18 #include "llvm/Support/Signals.h" 19 #include "llvm/TableGen/Error.h" 20 #include "llvm/TableGen/Main.h" 21 #include "llvm/TableGen/Record.h" 22 #include "llvm/TableGen/TableGenAction.h" 23 24 using namespace llvm; 25 using namespace clang; 26 27 enum ActionType { 28 GenClangAttrClasses, 29 GenClangAttrImpl, 30 GenClangAttrList, 31 GenClangAttrPCHRead, 32 GenClangAttrPCHWrite, 33 GenClangAttrSpellingList, 34 GenClangAttrLateParsedList, 35 GenClangAttrTemplateInstantiate, 36 GenClangAttrParsedAttrList, 37 GenClangAttrParsedAttrKinds, 38 GenClangDiagsDefs, 39 GenClangDiagGroups, 40 GenClangDiagsIndexName, 41 GenClangDeclNodes, 42 GenClangStmtNodes, 43 GenClangSACheckers, 44 GenOptParserDefs, GenOptParserImpl, 45 GenArmNeon, 46 GenArmNeonSema, 47 GenArmNeonTest 48 }; 49 50 namespace { 51 cl::opt<ActionType> 52 Action(cl::desc("Action to perform:"), 53 cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 54 "Generate option definitions"), 55 clEnumValN(GenOptParserImpl, "gen-opt-parser-impl", 56 "Generate option parser implementation"), 57 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 58 "Generate clang attribute clases"), 59 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 60 "Generate clang attribute implementations"), 61 clEnumValN(GenClangAttrList, "gen-clang-attr-list", 62 "Generate a clang attribute list"), 63 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 64 "Generate clang PCH attribute reader"), 65 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 66 "Generate clang PCH attribute writer"), 67 clEnumValN(GenClangAttrSpellingList, 68 "gen-clang-attr-spelling-list", 69 "Generate a clang attribute spelling list"), 70 clEnumValN(GenClangAttrLateParsedList, 71 "gen-clang-attr-late-parsed-list", 72 "Generate a clang attribute LateParsed list"), 73 clEnumValN(GenClangAttrTemplateInstantiate, 74 "gen-clang-attr-template-instantiate", 75 "Generate a clang template instantiate code"), 76 clEnumValN(GenClangAttrParsedAttrList, 77 "gen-clang-attr-parsed-attr-list", 78 "Generate a clang parsed attribute list"), 79 clEnumValN(GenClangAttrParsedAttrKinds, 80 "gen-clang-attr-parsed-attr-kinds", 81 "Generate a clang parsed attribute kinds"), 82 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 83 "Generate Clang diagnostics definitions"), 84 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 85 "Generate Clang diagnostic groups"), 86 clEnumValN(GenClangDiagsIndexName, 87 "gen-clang-diags-index-name", 88 "Generate Clang diagnostic name index"), 89 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 90 "Generate Clang AST declaration nodes"), 91 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 92 "Generate Clang AST statement nodes"), 93 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 94 "Generate Clang Static Analyzer checkers"), 95 clEnumValN(GenArmNeon, "gen-arm-neon", 96 "Generate arm_neon.h for clang"), 97 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 98 "Generate ARM NEON sema support for clang"), 99 clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 100 "Generate ARM NEON tests for clang"), 101 clEnumValEnd)); 102 103 cl::opt<std::string> 104 ClangComponent("clang-component", 105 cl::desc("Only use warnings from specified component"), 106 cl::value_desc("component"), cl::Hidden); 107 108 class ClangTableGenAction : public TableGenAction { 109 public: 110 bool operator()(raw_ostream &OS, RecordKeeper &Records) { 111 switch (Action) { 112 case GenClangAttrClasses: 113 EmitClangAttrClass(Records, OS); 114 break; 115 case GenClangAttrImpl: 116 EmitClangAttrImpl(Records, OS); 117 break; 118 case GenClangAttrList: 119 EmitClangAttrList(Records, OS); 120 break; 121 case GenClangAttrPCHRead: 122 EmitClangAttrPCHRead(Records, OS); 123 break; 124 case GenClangAttrPCHWrite: 125 EmitClangAttrPCHWrite(Records, OS); 126 break; 127 case GenClangAttrSpellingList: 128 EmitClangAttrSpellingList(Records, OS); 129 break; 130 case GenClangAttrLateParsedList: 131 EmitClangAttrLateParsedList(Records, OS); 132 break; 133 case GenClangAttrTemplateInstantiate: 134 EmitClangAttrTemplateInstantiate(Records, OS); 135 break; 136 case GenClangAttrParsedAttrList: 137 EmitClangAttrParsedAttrList(Records, OS); 138 break; 139 case GenClangAttrParsedAttrKinds: 140 EmitClangAttrParsedAttrKinds(Records, OS); 141 break; 142 case GenClangDiagsDefs: 143 EmitClangDiagsDefs(Records, OS, ClangComponent); 144 break; 145 case GenClangDiagGroups: 146 EmitClangDiagGroups(Records, OS); 147 break; 148 case GenClangDiagsIndexName: 149 EmitClangDiagsIndexName(Records, OS); 150 break; 151 case GenClangDeclNodes: 152 EmitClangASTNodes(Records, OS, "Decl", "Decl"); 153 EmitClangDeclContext(Records, OS); 154 break; 155 case GenClangStmtNodes: 156 EmitClangASTNodes(Records, OS, "Stmt", ""); 157 break; 158 case GenClangSACheckers: 159 EmitClangSACheckers(Records, OS); 160 break; 161 case GenOptParserDefs: 162 EmitOptParser(Records, OS, true); 163 break; 164 case GenOptParserImpl: 165 EmitOptParser(Records, OS, false); 166 break; 167 case GenArmNeon: 168 EmitNeon(Records, OS); 169 break; 170 case GenArmNeonSema: 171 EmitNeonSema(Records, OS); 172 break; 173 case GenArmNeonTest: 174 EmitNeonTest(Records, OS); 175 break; 176 } 177 178 return false; 179 } 180 }; 181 } 182 183 int main(int argc, char **argv) { 184 sys::PrintStackTraceOnErrorSignal(); 185 PrettyStackTraceProgram X(argc, argv); 186 cl::ParseCommandLineOptions(argc, argv); 187 188 ClangTableGenAction Action; 189 return TableGenMain(argv[0], Action); 190 } 191