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 PrintRecords, 27 DumpJSON, 28 GenClangAttrClasses, 29 GenClangAttrParserStringSwitches, 30 GenClangAttrSubjectMatchRulesParserStringSwitches, 31 GenClangAttrImpl, 32 GenClangAttrList, 33 GenClangAttrSubjectMatchRuleList, 34 GenClangAttrPCHRead, 35 GenClangAttrPCHWrite, 36 GenClangAttrHasAttributeImpl, 37 GenClangAttrSpellingListIndex, 38 GenClangAttrASTVisitor, 39 GenClangAttrTemplateInstantiate, 40 GenClangAttrParsedAttrList, 41 GenClangAttrParsedAttrImpl, 42 GenClangAttrParsedAttrKinds, 43 GenClangAttrDump, 44 GenClangDiagsDefs, 45 GenClangDiagGroups, 46 GenClangDiagsIndexName, 47 GenClangCommentNodes, 48 GenClangDeclNodes, 49 GenClangStmtNodes, 50 GenClangSACheckers, 51 GenClangCommentHTMLTags, 52 GenClangCommentHTMLTagsProperties, 53 GenClangCommentHTMLNamedCharacterReferences, 54 GenClangCommentCommandInfo, 55 GenClangCommentCommandList, 56 GenArmNeon, 57 GenArmFP16, 58 GenArmNeonSema, 59 GenArmNeonTest, 60 GenAttrDocs, 61 GenDiagDocs, 62 GenOptDocs, 63 GenDataCollectors, 64 GenTestPragmaAttributeSupportedAttributes 65 }; 66 67 namespace { 68 cl::opt<ActionType> Action( 69 cl::desc("Action to perform:"), 70 cl::values( 71 clEnumValN(PrintRecords, "print-records", 72 "Print all records to stdout (default)"), 73 clEnumValN(DumpJSON, "dump-json", 74 "Dump all records as machine-readable JSON"), 75 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 76 "Generate clang attribute clases"), 77 clEnumValN(GenClangAttrParserStringSwitches, 78 "gen-clang-attr-parser-string-switches", 79 "Generate all parser-related attribute string switches"), 80 clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches, 81 "gen-clang-attr-subject-match-rules-parser-string-switches", 82 "Generate all parser-related attribute subject match rule" 83 "string switches"), 84 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 85 "Generate clang attribute implementations"), 86 clEnumValN(GenClangAttrList, "gen-clang-attr-list", 87 "Generate a clang attribute list"), 88 clEnumValN(GenClangAttrSubjectMatchRuleList, 89 "gen-clang-attr-subject-match-rule-list", 90 "Generate a clang attribute subject match rule list"), 91 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 92 "Generate clang PCH attribute reader"), 93 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 94 "Generate clang PCH attribute writer"), 95 clEnumValN(GenClangAttrHasAttributeImpl, 96 "gen-clang-attr-has-attribute-impl", 97 "Generate a clang attribute spelling list"), 98 clEnumValN(GenClangAttrSpellingListIndex, 99 "gen-clang-attr-spelling-index", 100 "Generate a clang attribute spelling index"), 101 clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor", 102 "Generate a recursive AST visitor for clang attributes"), 103 clEnumValN(GenClangAttrTemplateInstantiate, 104 "gen-clang-attr-template-instantiate", 105 "Generate a clang template instantiate code"), 106 clEnumValN(GenClangAttrParsedAttrList, 107 "gen-clang-attr-parsed-attr-list", 108 "Generate a clang parsed attribute list"), 109 clEnumValN(GenClangAttrParsedAttrImpl, 110 "gen-clang-attr-parsed-attr-impl", 111 "Generate the clang parsed attribute helpers"), 112 clEnumValN(GenClangAttrParsedAttrKinds, 113 "gen-clang-attr-parsed-attr-kinds", 114 "Generate a clang parsed attribute kinds"), 115 clEnumValN(GenClangAttrDump, "gen-clang-attr-dump", 116 "Generate clang attribute dumper"), 117 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 118 "Generate Clang diagnostics definitions"), 119 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 120 "Generate Clang diagnostic groups"), 121 clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name", 122 "Generate Clang diagnostic name index"), 123 clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes", 124 "Generate Clang AST comment nodes"), 125 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 126 "Generate Clang AST declaration nodes"), 127 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 128 "Generate Clang AST statement nodes"), 129 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 130 "Generate Clang Static Analyzer checkers"), 131 clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags", 132 "Generate efficient matchers for HTML tag " 133 "names that are used in documentation comments"), 134 clEnumValN(GenClangCommentHTMLTagsProperties, 135 "gen-clang-comment-html-tags-properties", 136 "Generate efficient matchers for HTML tag " 137 "properties"), 138 clEnumValN(GenClangCommentHTMLNamedCharacterReferences, 139 "gen-clang-comment-html-named-character-references", 140 "Generate function to translate named character " 141 "references to UTF-8 sequences"), 142 clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info", 143 "Generate command properties for commands that " 144 "are used in documentation comments"), 145 clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list", 146 "Generate list of commands that are used in " 147 "documentation comments"), 148 clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"), 149 clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"), 150 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 151 "Generate ARM NEON sema support for clang"), 152 clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 153 "Generate ARM NEON tests for clang"), 154 clEnumValN(GenAttrDocs, "gen-attr-docs", 155 "Generate attribute documentation"), 156 clEnumValN(GenDiagDocs, "gen-diag-docs", 157 "Generate diagnostic documentation"), 158 clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"), 159 clEnumValN(GenDataCollectors, "gen-clang-data-collectors", 160 "Generate data collectors for AST nodes"), 161 clEnumValN(GenTestPragmaAttributeSupportedAttributes, 162 "gen-clang-test-pragma-attribute-supported-attributes", 163 "Generate a list of attributes supported by #pragma clang " 164 "attribute for testing purposes"))); 165 166 cl::opt<std::string> 167 ClangComponent("clang-component", 168 cl::desc("Only use warnings from specified component"), 169 cl::value_desc("component"), cl::Hidden); 170 171 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 172 switch (Action) { 173 case PrintRecords: 174 OS << Records; // No argument, dump all contents 175 break; 176 case DumpJSON: 177 EmitJSON(Records, OS); 178 break; 179 case GenClangAttrClasses: 180 EmitClangAttrClass(Records, OS); 181 break; 182 case GenClangAttrParserStringSwitches: 183 EmitClangAttrParserStringSwitches(Records, OS); 184 break; 185 case GenClangAttrSubjectMatchRulesParserStringSwitches: 186 EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS); 187 break; 188 case GenClangAttrImpl: 189 EmitClangAttrImpl(Records, OS); 190 break; 191 case GenClangAttrList: 192 EmitClangAttrList(Records, OS); 193 break; 194 case GenClangAttrSubjectMatchRuleList: 195 EmitClangAttrSubjectMatchRuleList(Records, OS); 196 break; 197 case GenClangAttrPCHRead: 198 EmitClangAttrPCHRead(Records, OS); 199 break; 200 case GenClangAttrPCHWrite: 201 EmitClangAttrPCHWrite(Records, OS); 202 break; 203 case GenClangAttrHasAttributeImpl: 204 EmitClangAttrHasAttrImpl(Records, OS); 205 break; 206 case GenClangAttrSpellingListIndex: 207 EmitClangAttrSpellingListIndex(Records, OS); 208 break; 209 case GenClangAttrASTVisitor: 210 EmitClangAttrASTVisitor(Records, OS); 211 break; 212 case GenClangAttrTemplateInstantiate: 213 EmitClangAttrTemplateInstantiate(Records, OS); 214 break; 215 case GenClangAttrParsedAttrList: 216 EmitClangAttrParsedAttrList(Records, OS); 217 break; 218 case GenClangAttrParsedAttrImpl: 219 EmitClangAttrParsedAttrImpl(Records, OS); 220 break; 221 case GenClangAttrParsedAttrKinds: 222 EmitClangAttrParsedAttrKinds(Records, OS); 223 break; 224 case GenClangAttrDump: 225 EmitClangAttrDump(Records, OS); 226 break; 227 case GenClangDiagsDefs: 228 EmitClangDiagsDefs(Records, OS, ClangComponent); 229 break; 230 case GenClangDiagGroups: 231 EmitClangDiagGroups(Records, OS); 232 break; 233 case GenClangDiagsIndexName: 234 EmitClangDiagsIndexName(Records, OS); 235 break; 236 case GenClangCommentNodes: 237 EmitClangASTNodes(Records, OS, "Comment", ""); 238 break; 239 case GenClangDeclNodes: 240 EmitClangASTNodes(Records, OS, "Decl", "Decl"); 241 EmitClangDeclContext(Records, OS); 242 break; 243 case GenClangStmtNodes: 244 EmitClangASTNodes(Records, OS, "Stmt", ""); 245 break; 246 case GenClangSACheckers: 247 EmitClangSACheckers(Records, OS); 248 break; 249 case GenClangCommentHTMLTags: 250 EmitClangCommentHTMLTags(Records, OS); 251 break; 252 case GenClangCommentHTMLTagsProperties: 253 EmitClangCommentHTMLTagsProperties(Records, OS); 254 break; 255 case GenClangCommentHTMLNamedCharacterReferences: 256 EmitClangCommentHTMLNamedCharacterReferences(Records, OS); 257 break; 258 case GenClangCommentCommandInfo: 259 EmitClangCommentCommandInfo(Records, OS); 260 break; 261 case GenClangCommentCommandList: 262 EmitClangCommentCommandList(Records, OS); 263 break; 264 case GenArmNeon: 265 EmitNeon(Records, OS); 266 break; 267 case GenArmFP16: 268 EmitFP16(Records, OS); 269 break; 270 case GenArmNeonSema: 271 EmitNeonSema(Records, OS); 272 break; 273 case GenArmNeonTest: 274 EmitNeonTest(Records, OS); 275 break; 276 case GenAttrDocs: 277 EmitClangAttrDocs(Records, OS); 278 break; 279 case GenDiagDocs: 280 EmitClangDiagDocs(Records, OS); 281 break; 282 case GenOptDocs: 283 EmitClangOptDocs(Records, OS); 284 break; 285 case GenDataCollectors: 286 EmitClangDataCollectors(Records, OS); 287 break; 288 case GenTestPragmaAttributeSupportedAttributes: 289 EmitTestPragmaAttributeSupportedAttributes(Records, OS); 290 break; 291 } 292 293 return false; 294 } 295 } 296 297 int main(int argc, char **argv) { 298 sys::PrintStackTraceOnErrorSignal(argv[0]); 299 PrettyStackTraceProgram X(argc, argv); 300 cl::ParseCommandLineOptions(argc, argv); 301 302 llvm_shutdown_obj Y; 303 304 return TableGenMain(argv[0], &ClangTableGenMain); 305 } 306 307 #ifdef __has_feature 308 #if __has_feature(address_sanitizer) 309 #include <sanitizer/lsan_interface.h> 310 // Disable LeakSanitizer for this binary as it has too many leaks that are not 311 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h . 312 int __lsan_is_turned_off() { return 1; } 313 #endif // __has_feature(address_sanitizer) 314 #endif // defined(__has_feature) 315