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