|  | //===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file contains the main function for Clang's TableGen. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "TableGenBackends.h" // Declares all backends. | 
|  | #include "llvm/Support/CommandLine.h" | 
|  | #include "llvm/Support/PrettyStackTrace.h" | 
|  | #include "llvm/Support/Signals.h" | 
|  | #include "llvm/TableGen/Error.h" | 
|  | #include "llvm/TableGen/Main.h" | 
|  | #include "llvm/TableGen/Record.h" | 
|  |  | 
|  | using namespace llvm; | 
|  | using namespace clang; | 
|  |  | 
|  | enum ActionType { | 
|  | PrintRecords, | 
|  | DumpJSON, | 
|  | GenClangAttrClasses, | 
|  | GenClangAttrParserStringSwitches, | 
|  | GenClangAttrSubjectMatchRulesParserStringSwitches, | 
|  | GenClangAttrImpl, | 
|  | GenClangAttrList, | 
|  | GenClangAttrSubjectMatchRuleList, | 
|  | GenClangAttrPCHRead, | 
|  | GenClangAttrPCHWrite, | 
|  | GenClangAttrHasAttributeImpl, | 
|  | GenClangAttrSpellingListIndex, | 
|  | GenClangAttrASTVisitor, | 
|  | GenClangAttrTemplateInstantiate, | 
|  | GenClangAttrParsedAttrList, | 
|  | GenClangAttrParsedAttrImpl, | 
|  | GenClangAttrParsedAttrKinds, | 
|  | GenClangAttrTextNodeDump, | 
|  | GenClangAttrNodeTraverse, | 
|  | GenClangDiagsDefs, | 
|  | GenClangDiagGroups, | 
|  | GenClangDiagsIndexName, | 
|  | GenClangCommentNodes, | 
|  | GenClangDeclNodes, | 
|  | GenClangStmtNodes, | 
|  | GenClangTypeNodes, | 
|  | GenClangOpcodes, | 
|  | GenClangSACheckers, | 
|  | GenClangCommentHTMLTags, | 
|  | GenClangCommentHTMLTagsProperties, | 
|  | GenClangCommentHTMLNamedCharacterReferences, | 
|  | GenClangCommentCommandInfo, | 
|  | GenClangCommentCommandList, | 
|  | GenClangOpenCLBuiltins, | 
|  | GenArmNeon, | 
|  | GenArmFP16, | 
|  | GenArmNeonSema, | 
|  | GenArmNeonTest, | 
|  | GenAttrDocs, | 
|  | GenDiagDocs, | 
|  | GenOptDocs, | 
|  | GenDataCollectors, | 
|  | GenTestPragmaAttributeSupportedAttributes | 
|  | }; | 
|  |  | 
|  | namespace { | 
|  | cl::opt<ActionType> Action( | 
|  | cl::desc("Action to perform:"), | 
|  | cl::values( | 
|  | clEnumValN(PrintRecords, "print-records", | 
|  | "Print all records to stdout (default)"), | 
|  | clEnumValN(DumpJSON, "dump-json", | 
|  | "Dump all records as machine-readable JSON"), | 
|  | clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", | 
|  | "Generate clang attribute clases"), | 
|  | clEnumValN(GenClangAttrParserStringSwitches, | 
|  | "gen-clang-attr-parser-string-switches", | 
|  | "Generate all parser-related attribute string switches"), | 
|  | clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches, | 
|  | "gen-clang-attr-subject-match-rules-parser-string-switches", | 
|  | "Generate all parser-related attribute subject match rule" | 
|  | "string switches"), | 
|  | clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", | 
|  | "Generate clang attribute implementations"), | 
|  | clEnumValN(GenClangAttrList, "gen-clang-attr-list", | 
|  | "Generate a clang attribute list"), | 
|  | clEnumValN(GenClangAttrSubjectMatchRuleList, | 
|  | "gen-clang-attr-subject-match-rule-list", | 
|  | "Generate a clang attribute subject match rule list"), | 
|  | clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", | 
|  | "Generate clang PCH attribute reader"), | 
|  | clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", | 
|  | "Generate clang PCH attribute writer"), | 
|  | clEnumValN(GenClangAttrHasAttributeImpl, | 
|  | "gen-clang-attr-has-attribute-impl", | 
|  | "Generate a clang attribute spelling list"), | 
|  | clEnumValN(GenClangAttrSpellingListIndex, | 
|  | "gen-clang-attr-spelling-index", | 
|  | "Generate a clang attribute spelling index"), | 
|  | clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor", | 
|  | "Generate a recursive AST visitor for clang attributes"), | 
|  | clEnumValN(GenClangAttrTemplateInstantiate, | 
|  | "gen-clang-attr-template-instantiate", | 
|  | "Generate a clang template instantiate code"), | 
|  | clEnumValN(GenClangAttrParsedAttrList, | 
|  | "gen-clang-attr-parsed-attr-list", | 
|  | "Generate a clang parsed attribute list"), | 
|  | clEnumValN(GenClangAttrParsedAttrImpl, | 
|  | "gen-clang-attr-parsed-attr-impl", | 
|  | "Generate the clang parsed attribute helpers"), | 
|  | clEnumValN(GenClangAttrParsedAttrKinds, | 
|  | "gen-clang-attr-parsed-attr-kinds", | 
|  | "Generate a clang parsed attribute kinds"), | 
|  | clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump", | 
|  | "Generate clang attribute text node dumper"), | 
|  | clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse", | 
|  | "Generate clang attribute traverser"), | 
|  | clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", | 
|  | "Generate Clang diagnostics definitions"), | 
|  | clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", | 
|  | "Generate Clang diagnostic groups"), | 
|  | clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name", | 
|  | "Generate Clang diagnostic name index"), | 
|  | clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes", | 
|  | "Generate Clang AST comment nodes"), | 
|  | clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", | 
|  | "Generate Clang AST declaration nodes"), | 
|  | clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", | 
|  | "Generate Clang AST statement nodes"), | 
|  | clEnumValN(GenClangTypeNodes, "gen-clang-type-nodes", | 
|  | "Generate Clang AST type nodes"), | 
|  | clEnumValN(GenClangOpcodes, "gen-clang-opcodes", | 
|  | "Generate Clang constexpr interpreter opcodes"), | 
|  | clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", | 
|  | "Generate Clang Static Analyzer checkers"), | 
|  | clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags", | 
|  | "Generate efficient matchers for HTML tag " | 
|  | "names that are used in documentation comments"), | 
|  | clEnumValN(GenClangCommentHTMLTagsProperties, | 
|  | "gen-clang-comment-html-tags-properties", | 
|  | "Generate efficient matchers for HTML tag " | 
|  | "properties"), | 
|  | clEnumValN(GenClangCommentHTMLNamedCharacterReferences, | 
|  | "gen-clang-comment-html-named-character-references", | 
|  | "Generate function to translate named character " | 
|  | "references to UTF-8 sequences"), | 
|  | clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info", | 
|  | "Generate command properties for commands that " | 
|  | "are used in documentation comments"), | 
|  | clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list", | 
|  | "Generate list of commands that are used in " | 
|  | "documentation comments"), | 
|  | clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins", | 
|  | "Generate OpenCL builtin declaration handlers"), | 
|  | clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"), | 
|  | clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"), | 
|  | clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", | 
|  | "Generate ARM NEON sema support for clang"), | 
|  | clEnumValN(GenArmNeonTest, "gen-arm-neon-test", | 
|  | "Generate ARM NEON tests for clang"), | 
|  | clEnumValN(GenAttrDocs, "gen-attr-docs", | 
|  | "Generate attribute documentation"), | 
|  | clEnumValN(GenDiagDocs, "gen-diag-docs", | 
|  | "Generate diagnostic documentation"), | 
|  | clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"), | 
|  | clEnumValN(GenDataCollectors, "gen-clang-data-collectors", | 
|  | "Generate data collectors for AST nodes"), | 
|  | clEnumValN(GenTestPragmaAttributeSupportedAttributes, | 
|  | "gen-clang-test-pragma-attribute-supported-attributes", | 
|  | "Generate a list of attributes supported by #pragma clang " | 
|  | "attribute for testing purposes"))); | 
|  |  | 
|  | cl::opt<std::string> | 
|  | ClangComponent("clang-component", | 
|  | cl::desc("Only use warnings from specified component"), | 
|  | cl::value_desc("component"), cl::Hidden); | 
|  |  | 
|  | bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { | 
|  | switch (Action) { | 
|  | case PrintRecords: | 
|  | OS << Records;           // No argument, dump all contents | 
|  | break; | 
|  | case DumpJSON: | 
|  | EmitJSON(Records, OS); | 
|  | break; | 
|  | case GenClangAttrClasses: | 
|  | EmitClangAttrClass(Records, OS); | 
|  | break; | 
|  | case GenClangAttrParserStringSwitches: | 
|  | EmitClangAttrParserStringSwitches(Records, OS); | 
|  | break; | 
|  | case GenClangAttrSubjectMatchRulesParserStringSwitches: | 
|  | EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS); | 
|  | break; | 
|  | case GenClangAttrImpl: | 
|  | EmitClangAttrImpl(Records, OS); | 
|  | break; | 
|  | case GenClangAttrList: | 
|  | EmitClangAttrList(Records, OS); | 
|  | break; | 
|  | case GenClangAttrSubjectMatchRuleList: | 
|  | EmitClangAttrSubjectMatchRuleList(Records, OS); | 
|  | break; | 
|  | case GenClangAttrPCHRead: | 
|  | EmitClangAttrPCHRead(Records, OS); | 
|  | break; | 
|  | case GenClangAttrPCHWrite: | 
|  | EmitClangAttrPCHWrite(Records, OS); | 
|  | break; | 
|  | case GenClangAttrHasAttributeImpl: | 
|  | EmitClangAttrHasAttrImpl(Records, OS); | 
|  | break; | 
|  | case GenClangAttrSpellingListIndex: | 
|  | EmitClangAttrSpellingListIndex(Records, OS); | 
|  | break; | 
|  | case GenClangAttrASTVisitor: | 
|  | EmitClangAttrASTVisitor(Records, OS); | 
|  | break; | 
|  | case GenClangAttrTemplateInstantiate: | 
|  | EmitClangAttrTemplateInstantiate(Records, OS); | 
|  | break; | 
|  | case GenClangAttrParsedAttrList: | 
|  | EmitClangAttrParsedAttrList(Records, OS); | 
|  | break; | 
|  | case GenClangAttrParsedAttrImpl: | 
|  | EmitClangAttrParsedAttrImpl(Records, OS); | 
|  | break; | 
|  | case GenClangAttrParsedAttrKinds: | 
|  | EmitClangAttrParsedAttrKinds(Records, OS); | 
|  | break; | 
|  | case GenClangAttrTextNodeDump: | 
|  | EmitClangAttrTextNodeDump(Records, OS); | 
|  | break; | 
|  | case GenClangAttrNodeTraverse: | 
|  | EmitClangAttrNodeTraverse(Records, OS); | 
|  | break; | 
|  | case GenClangDiagsDefs: | 
|  | EmitClangDiagsDefs(Records, OS, ClangComponent); | 
|  | break; | 
|  | case GenClangDiagGroups: | 
|  | EmitClangDiagGroups(Records, OS); | 
|  | break; | 
|  | case GenClangDiagsIndexName: | 
|  | EmitClangDiagsIndexName(Records, OS); | 
|  | break; | 
|  | case GenClangCommentNodes: | 
|  | EmitClangASTNodes(Records, OS, "Comment", ""); | 
|  | break; | 
|  | case GenClangDeclNodes: | 
|  | EmitClangASTNodes(Records, OS, "Decl", "Decl"); | 
|  | EmitClangDeclContext(Records, OS); | 
|  | break; | 
|  | case GenClangStmtNodes: | 
|  | EmitClangASTNodes(Records, OS, "Stmt", ""); | 
|  | break; | 
|  | case GenClangTypeNodes: | 
|  | EmitClangTypeNodes(Records, OS); | 
|  | break; | 
|  | case GenClangOpcodes: | 
|  | EmitClangOpcodes(Records, OS); | 
|  | break; | 
|  | case GenClangSACheckers: | 
|  | EmitClangSACheckers(Records, OS); | 
|  | break; | 
|  | case GenClangCommentHTMLTags: | 
|  | EmitClangCommentHTMLTags(Records, OS); | 
|  | break; | 
|  | case GenClangCommentHTMLTagsProperties: | 
|  | EmitClangCommentHTMLTagsProperties(Records, OS); | 
|  | break; | 
|  | case GenClangCommentHTMLNamedCharacterReferences: | 
|  | EmitClangCommentHTMLNamedCharacterReferences(Records, OS); | 
|  | break; | 
|  | case GenClangCommentCommandInfo: | 
|  | EmitClangCommentCommandInfo(Records, OS); | 
|  | break; | 
|  | case GenClangCommentCommandList: | 
|  | EmitClangCommentCommandList(Records, OS); | 
|  | break; | 
|  | case GenClangOpenCLBuiltins: | 
|  | EmitClangOpenCLBuiltins(Records, OS); | 
|  | break; | 
|  | case GenArmNeon: | 
|  | EmitNeon(Records, OS); | 
|  | break; | 
|  | case GenArmFP16: | 
|  | EmitFP16(Records, OS); | 
|  | break; | 
|  | case GenArmNeonSema: | 
|  | EmitNeonSema(Records, OS); | 
|  | break; | 
|  | case GenArmNeonTest: | 
|  | EmitNeonTest(Records, OS); | 
|  | break; | 
|  | case GenAttrDocs: | 
|  | EmitClangAttrDocs(Records, OS); | 
|  | break; | 
|  | case GenDiagDocs: | 
|  | EmitClangDiagDocs(Records, OS); | 
|  | break; | 
|  | case GenOptDocs: | 
|  | EmitClangOptDocs(Records, OS); | 
|  | break; | 
|  | case GenDataCollectors: | 
|  | EmitClangDataCollectors(Records, OS); | 
|  | break; | 
|  | case GenTestPragmaAttributeSupportedAttributes: | 
|  | EmitTestPragmaAttributeSupportedAttributes(Records, OS); | 
|  | break; | 
|  | } | 
|  |  | 
|  | return false; | 
|  | } | 
|  | } | 
|  |  | 
|  | int main(int argc, char **argv) { | 
|  | sys::PrintStackTraceOnErrorSignal(argv[0]); | 
|  | PrettyStackTraceProgram X(argc, argv); | 
|  | cl::ParseCommandLineOptions(argc, argv); | 
|  |  | 
|  | llvm_shutdown_obj Y; | 
|  |  | 
|  | return TableGenMain(argv[0], &ClangTableGenMain); | 
|  | } | 
|  |  | 
|  | #ifdef __has_feature | 
|  | #if __has_feature(address_sanitizer) | 
|  | #include <sanitizer/lsan_interface.h> | 
|  | // Disable LeakSanitizer for this binary as it has too many leaks that are not | 
|  | // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h . | 
|  | int __lsan_is_turned_off() { return 1; } | 
|  | #endif  // __has_feature(address_sanitizer) | 
|  | #endif  // defined(__has_feature) |