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