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 #include "llvm/Support/CommandLine.h" 16 #include "llvm/Support/PrettyStackTrace.h" 17 #include "llvm/Support/Signals.h" 18 #include "llvm/TableGen/Error.h" 19 #include "llvm/TableGen/Main.h" 20 #include "llvm/TableGen/Record.h" 21 22 using namespace llvm; 23 using namespace clang; 24 25 enum ActionType { 26 GenClangAttrClasses, 27 GenClangAttrImpl, 28 GenClangAttrList, 29 GenClangAttrPCHRead, 30 GenClangAttrPCHWrite, 31 GenClangAttrSpellingList, 32 GenClangAttrSpellingListIndex, 33 GenClangAttrLateParsedList, 34 GenClangAttrTemplateInstantiate, 35 GenClangAttrParsedAttrList, 36 GenClangAttrParsedAttrKinds, 37 GenClangAttrDump, 38 GenClangDiagsDefs, 39 GenClangDiagGroups, 40 GenClangDiagsIndexName, 41 GenClangCommentNodes, 42 GenClangDeclNodes, 43 GenClangStmtNodes, 44 GenClangSACheckers, 45 GenClangCommentHTMLTags, 46 GenClangCommentHTMLTagsProperties, 47 GenClangCommentHTMLNamedCharacterReferences, 48 GenClangCommentCommandInfo, 49 GenClangCommentCommandList, 50 GenOptParserDefs, GenOptParserImpl, 51 GenArmNeon, 52 GenArmNeonSema, 53 GenArmNeonTest 54 }; 55 56 namespace { 57 cl::opt<ActionType> 58 Action(cl::desc("Action to perform:"), 59 cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 60 "Generate option definitions"), 61 clEnumValN(GenOptParserImpl, "gen-opt-parser-impl", 62 "Generate option parser implementation"), 63 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 64 "Generate clang attribute clases"), 65 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 66 "Generate clang attribute implementations"), 67 clEnumValN(GenClangAttrList, "gen-clang-attr-list", 68 "Generate a clang attribute list"), 69 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 70 "Generate clang PCH attribute reader"), 71 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 72 "Generate clang PCH attribute writer"), 73 clEnumValN(GenClangAttrSpellingList, 74 "gen-clang-attr-spelling-list", 75 "Generate a clang attribute spelling list"), 76 clEnumValN(GenClangAttrSpellingListIndex, 77 "gen-clang-attr-spelling-index", 78 "Generate a clang attribute spelling index"), 79 clEnumValN(GenClangAttrLateParsedList, 80 "gen-clang-attr-late-parsed-list", 81 "Generate a clang attribute LateParsed list"), 82 clEnumValN(GenClangAttrTemplateInstantiate, 83 "gen-clang-attr-template-instantiate", 84 "Generate a clang template instantiate code"), 85 clEnumValN(GenClangAttrParsedAttrList, 86 "gen-clang-attr-parsed-attr-list", 87 "Generate a clang parsed attribute list"), 88 clEnumValN(GenClangAttrParsedAttrKinds, 89 "gen-clang-attr-parsed-attr-kinds", 90 "Generate a clang parsed attribute kinds"), 91 clEnumValN(GenClangAttrDump, "gen-clang-attr-dump", 92 "Generate clang attribute dumper"), 93 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 94 "Generate Clang diagnostics definitions"), 95 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 96 "Generate Clang diagnostic groups"), 97 clEnumValN(GenClangDiagsIndexName, 98 "gen-clang-diags-index-name", 99 "Generate Clang diagnostic name index"), 100 clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes", 101 "Generate Clang AST comment nodes"), 102 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 103 "Generate Clang AST declaration nodes"), 104 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 105 "Generate Clang AST statement nodes"), 106 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 107 "Generate Clang Static Analyzer checkers"), 108 clEnumValN(GenClangCommentHTMLTags, 109 "gen-clang-comment-html-tags", 110 "Generate efficient matchers for HTML tag " 111 "names that are used in documentation comments"), 112 clEnumValN(GenClangCommentHTMLTagsProperties, 113 "gen-clang-comment-html-tags-properties", 114 "Generate efficient matchers for HTML tag " 115 "properties"), 116 clEnumValN(GenClangCommentHTMLNamedCharacterReferences, 117 "gen-clang-comment-html-named-character-references", 118 "Generate function to translate named character " 119 "references to UTF-8 sequences"), 120 clEnumValN(GenClangCommentCommandInfo, 121 "gen-clang-comment-command-info", 122 "Generate command properties for commands that " 123 "are used in documentation comments"), 124 clEnumValN(GenClangCommentCommandList, 125 "gen-clang-comment-command-list", 126 "Generate list of commands that are used in " 127 "documentation comments"), 128 clEnumValN(GenArmNeon, "gen-arm-neon", 129 "Generate arm_neon.h for clang"), 130 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 131 "Generate ARM NEON sema support for clang"), 132 clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 133 "Generate ARM NEON tests for clang"), 134 clEnumValEnd)); 135 136 cl::opt<std::string> 137 ClangComponent("clang-component", 138 cl::desc("Only use warnings from specified component"), 139 cl::value_desc("component"), cl::Hidden); 140 141 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 142 switch (Action) { 143 case GenClangAttrClasses: 144 EmitClangAttrClass(Records, OS); 145 break; 146 case GenClangAttrImpl: 147 EmitClangAttrImpl(Records, OS); 148 break; 149 case GenClangAttrList: 150 EmitClangAttrList(Records, OS); 151 break; 152 case GenClangAttrPCHRead: 153 EmitClangAttrPCHRead(Records, OS); 154 break; 155 case GenClangAttrPCHWrite: 156 EmitClangAttrPCHWrite(Records, OS); 157 break; 158 case GenClangAttrSpellingList: 159 EmitClangAttrSpellingList(Records, OS); 160 break; 161 case GenClangAttrSpellingListIndex: 162 EmitClangAttrSpellingListIndex(Records, OS); 163 break; 164 case GenClangAttrLateParsedList: 165 EmitClangAttrLateParsedList(Records, OS); 166 break; 167 case GenClangAttrTemplateInstantiate: 168 EmitClangAttrTemplateInstantiate(Records, OS); 169 break; 170 case GenClangAttrParsedAttrList: 171 EmitClangAttrParsedAttrList(Records, OS); 172 break; 173 case GenClangAttrParsedAttrKinds: 174 EmitClangAttrParsedAttrKinds(Records, OS); 175 break; 176 case GenClangAttrDump: 177 EmitClangAttrDump(Records, OS); 178 break; 179 case GenClangDiagsDefs: 180 EmitClangDiagsDefs(Records, OS, ClangComponent); 181 break; 182 case GenClangDiagGroups: 183 EmitClangDiagGroups(Records, OS); 184 break; 185 case GenClangDiagsIndexName: 186 EmitClangDiagsIndexName(Records, OS); 187 break; 188 case GenClangCommentNodes: 189 EmitClangASTNodes(Records, OS, "Comment", ""); 190 break; 191 case GenClangDeclNodes: 192 EmitClangASTNodes(Records, OS, "Decl", "Decl"); 193 EmitClangDeclContext(Records, OS); 194 break; 195 case GenClangStmtNodes: 196 EmitClangASTNodes(Records, OS, "Stmt", ""); 197 break; 198 case GenClangSACheckers: 199 EmitClangSACheckers(Records, OS); 200 break; 201 case GenClangCommentHTMLTags: 202 EmitClangCommentHTMLTags(Records, OS); 203 break; 204 case GenClangCommentHTMLTagsProperties: 205 EmitClangCommentHTMLTagsProperties(Records, OS); 206 break; 207 case GenClangCommentHTMLNamedCharacterReferences: 208 EmitClangCommentHTMLNamedCharacterReferences(Records, OS); 209 break; 210 case GenClangCommentCommandInfo: 211 EmitClangCommentCommandInfo(Records, OS); 212 break; 213 case GenClangCommentCommandList: 214 EmitClangCommentCommandList(Records, OS); 215 break; 216 case GenOptParserDefs: 217 EmitOptParser(Records, OS, true); 218 break; 219 case GenOptParserImpl: 220 EmitOptParser(Records, OS, false); 221 break; 222 case GenArmNeon: 223 EmitNeon(Records, OS); 224 break; 225 case GenArmNeonSema: 226 EmitNeonSema(Records, OS); 227 break; 228 case GenArmNeonTest: 229 EmitNeonTest(Records, OS); 230 break; 231 } 232 233 return false; 234 } 235 } 236 237 int main(int argc, char **argv) { 238 sys::PrintStackTraceOnErrorSignal(); 239 PrettyStackTraceProgram X(argc, argv); 240 cl::ParseCommandLineOptions(argc, argv); 241 242 return TableGenMain(argv[0], &ClangTableGenMain); 243 } 244