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