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 GenClangAttrLateParsedList, 33 GenClangAttrTemplateInstantiate, 34 GenClangAttrParsedAttrList, 35 GenClangAttrParsedAttrKinds, 36 GenClangDiagsDefs, 37 GenClangDiagGroups, 38 GenClangDiagsIndexName, 39 GenClangCommentNodes, 40 GenClangDeclNodes, 41 GenClangStmtNodes, 42 GenClangSACheckers, 43 GenClangCommentHTMLTags, 44 GenClangCommentHTMLTagsProperties, 45 GenClangCommentCommandInfo, 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(GenClangAttrParsedAttrList, 79 "gen-clang-attr-parsed-attr-list", 80 "Generate a clang parsed attribute list"), 81 clEnumValN(GenClangAttrParsedAttrKinds, 82 "gen-clang-attr-parsed-attr-kinds", 83 "Generate a clang parsed attribute kinds"), 84 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 85 "Generate Clang diagnostics definitions"), 86 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 87 "Generate Clang diagnostic groups"), 88 clEnumValN(GenClangDiagsIndexName, 89 "gen-clang-diags-index-name", 90 "Generate Clang diagnostic name index"), 91 clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes", 92 "Generate Clang AST comment nodes"), 93 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 94 "Generate Clang AST declaration nodes"), 95 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 96 "Generate Clang AST statement nodes"), 97 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 98 "Generate Clang Static Analyzer checkers"), 99 clEnumValN(GenClangCommentHTMLTags, 100 "gen-clang-comment-html-tags", 101 "Generate efficient matchers for HTML tag " 102 "names that are used in documentation comments"), 103 clEnumValN(GenClangCommentHTMLTagsProperties, 104 "gen-clang-comment-html-tags-properties", 105 "Generate efficient matchers for HTML tag " 106 "properties"), 107 clEnumValN(GenClangCommentCommandInfo, 108 "gen-clang-comment-command-info", 109 "Generate list of commands that are used in " 110 "documentation comments"), 111 clEnumValN(GenArmNeon, "gen-arm-neon", 112 "Generate arm_neon.h for clang"), 113 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 114 "Generate ARM NEON sema support for clang"), 115 clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 116 "Generate ARM NEON tests for clang"), 117 clEnumValEnd)); 118 119 cl::opt<std::string> 120 ClangComponent("clang-component", 121 cl::desc("Only use warnings from specified component"), 122 cl::value_desc("component"), cl::Hidden); 123 124 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 125 switch (Action) { 126 case GenClangAttrClasses: 127 EmitClangAttrClass(Records, OS); 128 break; 129 case GenClangAttrImpl: 130 EmitClangAttrImpl(Records, OS); 131 break; 132 case GenClangAttrList: 133 EmitClangAttrList(Records, OS); 134 break; 135 case GenClangAttrPCHRead: 136 EmitClangAttrPCHRead(Records, OS); 137 break; 138 case GenClangAttrPCHWrite: 139 EmitClangAttrPCHWrite(Records, OS); 140 break; 141 case GenClangAttrSpellingList: 142 EmitClangAttrSpellingList(Records, OS); 143 break; 144 case GenClangAttrLateParsedList: 145 EmitClangAttrLateParsedList(Records, OS); 146 break; 147 case GenClangAttrTemplateInstantiate: 148 EmitClangAttrTemplateInstantiate(Records, OS); 149 break; 150 case GenClangAttrParsedAttrList: 151 EmitClangAttrParsedAttrList(Records, OS); 152 break; 153 case GenClangAttrParsedAttrKinds: 154 EmitClangAttrParsedAttrKinds(Records, OS); 155 break; 156 case GenClangDiagsDefs: 157 EmitClangDiagsDefs(Records, OS, ClangComponent); 158 break; 159 case GenClangDiagGroups: 160 EmitClangDiagGroups(Records, OS); 161 break; 162 case GenClangDiagsIndexName: 163 EmitClangDiagsIndexName(Records, OS); 164 break; 165 case GenClangCommentNodes: 166 EmitClangASTNodes(Records, OS, "Comment", ""); 167 break; 168 case GenClangDeclNodes: 169 EmitClangASTNodes(Records, OS, "Decl", "Decl"); 170 EmitClangDeclContext(Records, OS); 171 break; 172 case GenClangStmtNodes: 173 EmitClangASTNodes(Records, OS, "Stmt", ""); 174 break; 175 case GenClangSACheckers: 176 EmitClangSACheckers(Records, OS); 177 break; 178 case GenClangCommentHTMLTags: 179 EmitClangCommentHTMLTags(Records, OS); 180 break; 181 case GenClangCommentHTMLTagsProperties: 182 EmitClangCommentHTMLTagsProperties(Records, OS); 183 break; 184 case GenClangCommentCommandInfo: 185 EmitClangCommentCommandInfo(Records, OS); 186 break; 187 case GenOptParserDefs: 188 EmitOptParser(Records, OS, true); 189 break; 190 case GenOptParserImpl: 191 EmitOptParser(Records, OS, false); 192 break; 193 case GenArmNeon: 194 EmitNeon(Records, OS); 195 break; 196 case GenArmNeonSema: 197 EmitNeonSema(Records, OS); 198 break; 199 case GenArmNeonTest: 200 EmitNeonTest(Records, OS); 201 break; 202 } 203 204 return false; 205 } 206 } 207 208 int main(int argc, char **argv) { 209 sys::PrintStackTraceOnErrorSignal(); 210 PrettyStackTraceProgram X(argc, argv); 211 cl::ParseCommandLineOptions(argc, argv); 212 213 return TableGenMain(argv[0], &ClangTableGenMain); 214 } 215