1 //===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains the main function for Clang's TableGen. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "TableGenBackends.h" // Declares all backends. 14 #include "ASTTableGen.h" 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 GenClangAttrTextNodeDump, 44 GenClangAttrNodeTraverse, 45 GenClangBasicReader, 46 GenClangBasicWriter, 47 GenClangDiagsDefs, 48 GenClangDiagGroups, 49 GenClangDiagsIndexName, 50 GenClangCommentNodes, 51 GenClangDeclNodes, 52 GenClangStmtNodes, 53 GenClangTypeNodes, 54 GenClangTypeReader, 55 GenClangTypeWriter, 56 GenClangOpcodes, 57 GenClangSACheckers, 58 GenClangCommentHTMLTags, 59 GenClangCommentHTMLTagsProperties, 60 GenClangCommentHTMLNamedCharacterReferences, 61 GenClangCommentCommandInfo, 62 GenClangCommentCommandList, 63 GenClangOpenCLBuiltins, 64 GenArmNeon, 65 GenArmFP16, 66 GenArmNeonSema, 67 GenArmNeonTest, 68 GenArmMveHeader, 69 GenArmMveBuiltinDef, 70 GenArmMveBuiltinSema, 71 GenArmMveBuiltinCG, 72 GenArmMveBuiltinAliases, 73 GenArmSveHeader, 74 GenArmSveBuiltins, 75 GenArmSveBuiltinCG, 76 GenArmSveTypeFlags, 77 GenArmCdeHeader, 78 GenArmCdeBuiltinDef, 79 GenArmCdeBuiltinSema, 80 GenArmCdeBuiltinCG, 81 GenArmCdeBuiltinAliases, 82 GenAttrDocs, 83 GenDiagDocs, 84 GenOptDocs, 85 GenDataCollectors, 86 GenTestPragmaAttributeSupportedAttributes 87 }; 88 89 namespace { 90 cl::opt<ActionType> Action( 91 cl::desc("Action to perform:"), 92 cl::values( 93 clEnumValN(PrintRecords, "print-records", 94 "Print all records to stdout (default)"), 95 clEnumValN(DumpJSON, "dump-json", 96 "Dump all records as machine-readable JSON"), 97 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 98 "Generate clang attribute clases"), 99 clEnumValN(GenClangAttrParserStringSwitches, 100 "gen-clang-attr-parser-string-switches", 101 "Generate all parser-related attribute string switches"), 102 clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches, 103 "gen-clang-attr-subject-match-rules-parser-string-switches", 104 "Generate all parser-related attribute subject match rule" 105 "string switches"), 106 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 107 "Generate clang attribute implementations"), 108 clEnumValN(GenClangAttrList, "gen-clang-attr-list", 109 "Generate a clang attribute list"), 110 clEnumValN(GenClangAttrSubjectMatchRuleList, 111 "gen-clang-attr-subject-match-rule-list", 112 "Generate a clang attribute subject match rule list"), 113 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 114 "Generate clang PCH attribute reader"), 115 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 116 "Generate clang PCH attribute writer"), 117 clEnumValN(GenClangAttrHasAttributeImpl, 118 "gen-clang-attr-has-attribute-impl", 119 "Generate a clang attribute spelling list"), 120 clEnumValN(GenClangAttrSpellingListIndex, 121 "gen-clang-attr-spelling-index", 122 "Generate a clang attribute spelling index"), 123 clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor", 124 "Generate a recursive AST visitor for clang attributes"), 125 clEnumValN(GenClangAttrTemplateInstantiate, 126 "gen-clang-attr-template-instantiate", 127 "Generate a clang template instantiate code"), 128 clEnumValN(GenClangAttrParsedAttrList, 129 "gen-clang-attr-parsed-attr-list", 130 "Generate a clang parsed attribute list"), 131 clEnumValN(GenClangAttrParsedAttrImpl, 132 "gen-clang-attr-parsed-attr-impl", 133 "Generate the clang parsed attribute helpers"), 134 clEnumValN(GenClangAttrParsedAttrKinds, 135 "gen-clang-attr-parsed-attr-kinds", 136 "Generate a clang parsed attribute kinds"), 137 clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump", 138 "Generate clang attribute text node dumper"), 139 clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse", 140 "Generate clang attribute traverser"), 141 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 142 "Generate Clang diagnostics definitions"), 143 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 144 "Generate Clang diagnostic groups"), 145 clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name", 146 "Generate Clang diagnostic name index"), 147 clEnumValN(GenClangBasicReader, "gen-clang-basic-reader", 148 "Generate Clang BasicReader classes"), 149 clEnumValN(GenClangBasicWriter, "gen-clang-basic-writer", 150 "Generate Clang BasicWriter classes"), 151 clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes", 152 "Generate Clang AST comment nodes"), 153 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 154 "Generate Clang AST declaration nodes"), 155 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 156 "Generate Clang AST statement nodes"), 157 clEnumValN(GenClangTypeNodes, "gen-clang-type-nodes", 158 "Generate Clang AST type nodes"), 159 clEnumValN(GenClangTypeReader, "gen-clang-type-reader", 160 "Generate Clang AbstractTypeReader class"), 161 clEnumValN(GenClangTypeWriter, "gen-clang-type-writer", 162 "Generate Clang AbstractTypeWriter class"), 163 clEnumValN(GenClangOpcodes, "gen-clang-opcodes", 164 "Generate Clang constexpr interpreter opcodes"), 165 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 166 "Generate Clang Static Analyzer checkers"), 167 clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags", 168 "Generate efficient matchers for HTML tag " 169 "names that are used in documentation comments"), 170 clEnumValN(GenClangCommentHTMLTagsProperties, 171 "gen-clang-comment-html-tags-properties", 172 "Generate efficient matchers for HTML tag " 173 "properties"), 174 clEnumValN(GenClangCommentHTMLNamedCharacterReferences, 175 "gen-clang-comment-html-named-character-references", 176 "Generate function to translate named character " 177 "references to UTF-8 sequences"), 178 clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info", 179 "Generate command properties for commands that " 180 "are used in documentation comments"), 181 clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list", 182 "Generate list of commands that are used in " 183 "documentation comments"), 184 clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins", 185 "Generate OpenCL builtin declaration handlers"), 186 clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"), 187 clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"), 188 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 189 "Generate ARM NEON sema support for clang"), 190 clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 191 "Generate ARM NEON tests for clang"), 192 clEnumValN(GenArmSveHeader, "gen-arm-sve-header", 193 "Generate arm_sve.h for clang"), 194 clEnumValN(GenArmSveBuiltins, "gen-arm-sve-builtins", 195 "Generate arm_sve_builtins.inc for clang"), 196 clEnumValN(GenArmSveBuiltinCG, "gen-arm-sve-builtin-codegen", 197 "Generate arm_sve_builtin_cg_map.inc for clang"), 198 clEnumValN(GenArmSveTypeFlags, "gen-arm-sve-typeflags", 199 "Generate arm_sve_typeflags.inc for clang"), 200 clEnumValN(GenArmMveHeader, "gen-arm-mve-header", 201 "Generate arm_mve.h for clang"), 202 clEnumValN(GenArmMveBuiltinDef, "gen-arm-mve-builtin-def", 203 "Generate ARM MVE builtin definitions for clang"), 204 clEnumValN(GenArmMveBuiltinSema, "gen-arm-mve-builtin-sema", 205 "Generate ARM MVE builtin sema checks for clang"), 206 clEnumValN(GenArmMveBuiltinCG, "gen-arm-mve-builtin-codegen", 207 "Generate ARM MVE builtin code-generator for clang"), 208 clEnumValN(GenArmMveBuiltinAliases, "gen-arm-mve-builtin-aliases", 209 "Generate list of valid ARM MVE builtin aliases for clang"), 210 clEnumValN(GenArmCdeHeader, "gen-arm-cde-header", 211 "Generate arm_cde.h for clang"), 212 clEnumValN(GenArmCdeBuiltinDef, "gen-arm-cde-builtin-def", 213 "Generate ARM CDE builtin definitions for clang"), 214 clEnumValN(GenArmCdeBuiltinSema, "gen-arm-cde-builtin-sema", 215 "Generate ARM CDE builtin sema checks for clang"), 216 clEnumValN(GenArmCdeBuiltinCG, "gen-arm-cde-builtin-codegen", 217 "Generate ARM CDE builtin code-generator for clang"), 218 clEnumValN(GenArmCdeBuiltinAliases, "gen-arm-cde-builtin-aliases", 219 "Generate list of valid ARM CDE builtin aliases for clang"), 220 clEnumValN(GenAttrDocs, "gen-attr-docs", 221 "Generate attribute documentation"), 222 clEnumValN(GenDiagDocs, "gen-diag-docs", 223 "Generate diagnostic documentation"), 224 clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"), 225 clEnumValN(GenDataCollectors, "gen-clang-data-collectors", 226 "Generate data collectors for AST nodes"), 227 clEnumValN(GenTestPragmaAttributeSupportedAttributes, 228 "gen-clang-test-pragma-attribute-supported-attributes", 229 "Generate a list of attributes supported by #pragma clang " 230 "attribute for testing purposes"))); 231 232 cl::opt<std::string> 233 ClangComponent("clang-component", 234 cl::desc("Only use warnings from specified component"), 235 cl::value_desc("component"), cl::Hidden); 236 237 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 238 switch (Action) { 239 case PrintRecords: 240 OS << Records; // No argument, dump all contents 241 break; 242 case DumpJSON: 243 EmitJSON(Records, OS); 244 break; 245 case GenClangAttrClasses: 246 EmitClangAttrClass(Records, OS); 247 break; 248 case GenClangAttrParserStringSwitches: 249 EmitClangAttrParserStringSwitches(Records, OS); 250 break; 251 case GenClangAttrSubjectMatchRulesParserStringSwitches: 252 EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS); 253 break; 254 case GenClangAttrImpl: 255 EmitClangAttrImpl(Records, OS); 256 break; 257 case GenClangAttrList: 258 EmitClangAttrList(Records, OS); 259 break; 260 case GenClangAttrSubjectMatchRuleList: 261 EmitClangAttrSubjectMatchRuleList(Records, OS); 262 break; 263 case GenClangAttrPCHRead: 264 EmitClangAttrPCHRead(Records, OS); 265 break; 266 case GenClangAttrPCHWrite: 267 EmitClangAttrPCHWrite(Records, OS); 268 break; 269 case GenClangAttrHasAttributeImpl: 270 EmitClangAttrHasAttrImpl(Records, OS); 271 break; 272 case GenClangAttrSpellingListIndex: 273 EmitClangAttrSpellingListIndex(Records, OS); 274 break; 275 case GenClangAttrASTVisitor: 276 EmitClangAttrASTVisitor(Records, OS); 277 break; 278 case GenClangAttrTemplateInstantiate: 279 EmitClangAttrTemplateInstantiate(Records, OS); 280 break; 281 case GenClangAttrParsedAttrList: 282 EmitClangAttrParsedAttrList(Records, OS); 283 break; 284 case GenClangAttrParsedAttrImpl: 285 EmitClangAttrParsedAttrImpl(Records, OS); 286 break; 287 case GenClangAttrParsedAttrKinds: 288 EmitClangAttrParsedAttrKinds(Records, OS); 289 break; 290 case GenClangAttrTextNodeDump: 291 EmitClangAttrTextNodeDump(Records, OS); 292 break; 293 case GenClangAttrNodeTraverse: 294 EmitClangAttrNodeTraverse(Records, OS); 295 break; 296 case GenClangDiagsDefs: 297 EmitClangDiagsDefs(Records, OS, ClangComponent); 298 break; 299 case GenClangDiagGroups: 300 EmitClangDiagGroups(Records, OS); 301 break; 302 case GenClangDiagsIndexName: 303 EmitClangDiagsIndexName(Records, OS); 304 break; 305 case GenClangCommentNodes: 306 EmitClangASTNodes(Records, OS, CommentNodeClassName, ""); 307 break; 308 case GenClangDeclNodes: 309 EmitClangASTNodes(Records, OS, DeclNodeClassName, "Decl"); 310 EmitClangDeclContext(Records, OS); 311 break; 312 case GenClangStmtNodes: 313 EmitClangASTNodes(Records, OS, StmtNodeClassName, ""); 314 break; 315 case GenClangTypeNodes: 316 EmitClangTypeNodes(Records, OS); 317 break; 318 case GenClangTypeReader: 319 EmitClangTypeReader(Records, OS); 320 break; 321 case GenClangTypeWriter: 322 EmitClangTypeWriter(Records, OS); 323 break; 324 case GenClangBasicReader: 325 EmitClangBasicReader(Records, OS); 326 break; 327 case GenClangBasicWriter: 328 EmitClangBasicWriter(Records, OS); 329 break; 330 case GenClangOpcodes: 331 EmitClangOpcodes(Records, OS); 332 break; 333 case GenClangSACheckers: 334 EmitClangSACheckers(Records, OS); 335 break; 336 case GenClangCommentHTMLTags: 337 EmitClangCommentHTMLTags(Records, OS); 338 break; 339 case GenClangCommentHTMLTagsProperties: 340 EmitClangCommentHTMLTagsProperties(Records, OS); 341 break; 342 case GenClangCommentHTMLNamedCharacterReferences: 343 EmitClangCommentHTMLNamedCharacterReferences(Records, OS); 344 break; 345 case GenClangCommentCommandInfo: 346 EmitClangCommentCommandInfo(Records, OS); 347 break; 348 case GenClangCommentCommandList: 349 EmitClangCommentCommandList(Records, OS); 350 break; 351 case GenClangOpenCLBuiltins: 352 EmitClangOpenCLBuiltins(Records, OS); 353 break; 354 case GenArmNeon: 355 EmitNeon(Records, OS); 356 break; 357 case GenArmFP16: 358 EmitFP16(Records, OS); 359 break; 360 case GenArmNeonSema: 361 EmitNeonSema(Records, OS); 362 break; 363 case GenArmNeonTest: 364 EmitNeonTest(Records, OS); 365 break; 366 case GenArmMveHeader: 367 EmitMveHeader(Records, OS); 368 break; 369 case GenArmMveBuiltinDef: 370 EmitMveBuiltinDef(Records, OS); 371 break; 372 case GenArmMveBuiltinSema: 373 EmitMveBuiltinSema(Records, OS); 374 break; 375 case GenArmMveBuiltinCG: 376 EmitMveBuiltinCG(Records, OS); 377 break; 378 case GenArmMveBuiltinAliases: 379 EmitMveBuiltinAliases(Records, OS); 380 break; 381 case GenArmSveHeader: 382 EmitSveHeader(Records, OS); 383 break; 384 case GenArmSveBuiltins: 385 EmitSveBuiltins(Records, OS); 386 break; 387 case GenArmSveBuiltinCG: 388 EmitSveBuiltinCG(Records, OS); 389 break; 390 case GenArmSveTypeFlags: 391 EmitSveTypeFlags(Records, OS); 392 break; 393 case GenArmCdeHeader: 394 EmitCdeHeader(Records, OS); 395 break; 396 case GenArmCdeBuiltinDef: 397 EmitCdeBuiltinDef(Records, OS); 398 break; 399 case GenArmCdeBuiltinSema: 400 EmitCdeBuiltinSema(Records, OS); 401 break; 402 case GenArmCdeBuiltinCG: 403 EmitCdeBuiltinCG(Records, OS); 404 break; 405 case GenArmCdeBuiltinAliases: 406 EmitCdeBuiltinAliases(Records, OS); 407 break; 408 case GenAttrDocs: 409 EmitClangAttrDocs(Records, OS); 410 break; 411 case GenDiagDocs: 412 EmitClangDiagDocs(Records, OS); 413 break; 414 case GenOptDocs: 415 EmitClangOptDocs(Records, OS); 416 break; 417 case GenDataCollectors: 418 EmitClangDataCollectors(Records, OS); 419 break; 420 case GenTestPragmaAttributeSupportedAttributes: 421 EmitTestPragmaAttributeSupportedAttributes(Records, OS); 422 break; 423 } 424 425 return false; 426 } 427 } 428 429 int main(int argc, char **argv) { 430 sys::PrintStackTraceOnErrorSignal(argv[0]); 431 PrettyStackTraceProgram X(argc, argv); 432 cl::ParseCommandLineOptions(argc, argv); 433 434 llvm_shutdown_obj Y; 435 436 return TableGenMain(argv[0], &ClangTableGenMain); 437 } 438 439 #ifdef __has_feature 440 #if __has_feature(address_sanitizer) 441 #include <sanitizer/lsan_interface.h> 442 // Disable LeakSanitizer for this binary as it has too many leaks that are not 443 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h . 444 int __lsan_is_turned_off() { return 1; } 445 #endif // __has_feature(address_sanitizer) 446 #endif // defined(__has_feature) 447