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