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