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