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