xref: /freebsd-src/contrib/llvm-project/clang/utils/TableGen/TableGen.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file contains the main function for Clang's TableGen.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "TableGenBackends.h" // Declares all backends.
14480093f4SDimitry Andric #include "ASTTableGen.h"
150b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h"
16bdd1243dSDimitry Andric #include "llvm/Support/ManagedStatic.h"
170b57cec5SDimitry Andric #include "llvm/Support/PrettyStackTrace.h"
180b57cec5SDimitry Andric #include "llvm/Support/Signals.h"
190b57cec5SDimitry Andric #include "llvm/TableGen/Error.h"
200b57cec5SDimitry Andric #include "llvm/TableGen/Main.h"
210b57cec5SDimitry Andric #include "llvm/TableGen/Record.h"
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric using namespace llvm;
240b57cec5SDimitry Andric using namespace clang;
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric enum ActionType {
270b57cec5SDimitry Andric   PrintRecords,
280b57cec5SDimitry Andric   DumpJSON,
290b57cec5SDimitry Andric   GenClangAttrClasses,
300b57cec5SDimitry Andric   GenClangAttrParserStringSwitches,
310b57cec5SDimitry Andric   GenClangAttrSubjectMatchRulesParserStringSwitches,
320b57cec5SDimitry Andric   GenClangAttrImpl,
330b57cec5SDimitry Andric   GenClangAttrList,
34349cc55cSDimitry Andric   GenClangAttrDocTable,
350b57cec5SDimitry Andric   GenClangAttrSubjectMatchRuleList,
360b57cec5SDimitry Andric   GenClangAttrPCHRead,
370b57cec5SDimitry Andric   GenClangAttrPCHWrite,
387a6dacacSDimitry Andric   GenClangRegularKeywordAttributeInfo,
390b57cec5SDimitry Andric   GenClangAttrHasAttributeImpl,
400b57cec5SDimitry Andric   GenClangAttrSpellingListIndex,
410b57cec5SDimitry Andric   GenClangAttrASTVisitor,
420b57cec5SDimitry Andric   GenClangAttrTemplateInstantiate,
430b57cec5SDimitry Andric   GenClangAttrParsedAttrList,
440b57cec5SDimitry Andric   GenClangAttrParsedAttrImpl,
450b57cec5SDimitry Andric   GenClangAttrParsedAttrKinds,
460b57cec5SDimitry Andric   GenClangAttrTextNodeDump,
470b57cec5SDimitry Andric   GenClangAttrNodeTraverse,
48480093f4SDimitry Andric   GenClangBasicReader,
49480093f4SDimitry Andric   GenClangBasicWriter,
50*0fca6ea1SDimitry Andric   GenClangBuiltins,
510b57cec5SDimitry Andric   GenClangDiagsDefs,
520b57cec5SDimitry Andric   GenClangDiagGroups,
530b57cec5SDimitry Andric   GenClangDiagsIndexName,
540b57cec5SDimitry Andric   GenClangCommentNodes,
550b57cec5SDimitry Andric   GenClangDeclNodes,
560b57cec5SDimitry Andric   GenClangStmtNodes,
57a7dea167SDimitry Andric   GenClangTypeNodes,
58480093f4SDimitry Andric   GenClangTypeReader,
59480093f4SDimitry Andric   GenClangTypeWriter,
60a7dea167SDimitry Andric   GenClangOpcodes,
610b57cec5SDimitry Andric   GenClangSACheckers,
62e8d8bef9SDimitry Andric   GenClangSyntaxNodeList,
63e8d8bef9SDimitry Andric   GenClangSyntaxNodeClasses,
640b57cec5SDimitry Andric   GenClangCommentHTMLTags,
650b57cec5SDimitry Andric   GenClangCommentHTMLTagsProperties,
660b57cec5SDimitry Andric   GenClangCommentHTMLNamedCharacterReferences,
670b57cec5SDimitry Andric   GenClangCommentCommandInfo,
680b57cec5SDimitry Andric   GenClangCommentCommandList,
690b57cec5SDimitry Andric   GenClangOpenCLBuiltins,
7006c3fb27SDimitry Andric   GenClangOpenCLBuiltinHeader,
71fe6060f1SDimitry Andric   GenClangOpenCLBuiltinTests,
720b57cec5SDimitry Andric   GenArmNeon,
730b57cec5SDimitry Andric   GenArmFP16,
745ffd83dbSDimitry Andric   GenArmBF16,
755f757f3fSDimitry Andric   GenArmVectorType,
760b57cec5SDimitry Andric   GenArmNeonSema,
770b57cec5SDimitry Andric   GenArmNeonTest,
78480093f4SDimitry Andric   GenArmMveHeader,
79480093f4SDimitry Andric   GenArmMveBuiltinDef,
80480093f4SDimitry Andric   GenArmMveBuiltinSema,
81480093f4SDimitry Andric   GenArmMveBuiltinCG,
82480093f4SDimitry Andric   GenArmMveBuiltinAliases,
835ffd83dbSDimitry Andric   GenArmSveHeader,
845ffd83dbSDimitry Andric   GenArmSveBuiltins,
855ffd83dbSDimitry Andric   GenArmSveBuiltinCG,
865ffd83dbSDimitry Andric   GenArmSveTypeFlags,
875ffd83dbSDimitry Andric   GenArmSveRangeChecks,
88cb14a3feSDimitry Andric   GenArmSveStreamingAttrs,
8906c3fb27SDimitry Andric   GenArmSmeHeader,
9006c3fb27SDimitry Andric   GenArmSmeBuiltins,
9106c3fb27SDimitry Andric   GenArmSmeBuiltinCG,
9206c3fb27SDimitry Andric   GenArmSmeRangeChecks,
93cb14a3feSDimitry Andric   GenArmSmeStreamingAttrs,
94cb14a3feSDimitry Andric   GenArmSmeBuiltinZAState,
955ffd83dbSDimitry Andric   GenArmCdeHeader,
965ffd83dbSDimitry Andric   GenArmCdeBuiltinDef,
975ffd83dbSDimitry Andric   GenArmCdeBuiltinSema,
985ffd83dbSDimitry Andric   GenArmCdeBuiltinCG,
995ffd83dbSDimitry Andric   GenArmCdeBuiltinAliases,
100fe6060f1SDimitry Andric   GenRISCVVectorHeader,
101fe6060f1SDimitry Andric   GenRISCVVectorBuiltins,
102fe6060f1SDimitry Andric   GenRISCVVectorBuiltinCG,
103972a253aSDimitry Andric   GenRISCVVectorBuiltinSema,
10406c3fb27SDimitry Andric   GenRISCVSiFiveVectorBuiltins,
10506c3fb27SDimitry Andric   GenRISCVSiFiveVectorBuiltinCG,
10606c3fb27SDimitry Andric   GenRISCVSiFiveVectorBuiltinSema,
1070b57cec5SDimitry Andric   GenAttrDocs,
1080b57cec5SDimitry Andric   GenDiagDocs,
1090b57cec5SDimitry Andric   GenOptDocs,
1100b57cec5SDimitry Andric   GenDataCollectors,
1110b57cec5SDimitry Andric   GenTestPragmaAttributeSupportedAttributes
1120b57cec5SDimitry Andric };
1130b57cec5SDimitry Andric 
1140b57cec5SDimitry Andric namespace {
1150b57cec5SDimitry Andric cl::opt<ActionType> Action(
1160b57cec5SDimitry Andric     cl::desc("Action to perform:"),
1170b57cec5SDimitry Andric     cl::values(
1180b57cec5SDimitry Andric         clEnumValN(PrintRecords, "print-records",
1190b57cec5SDimitry Andric                    "Print all records to stdout (default)"),
1200b57cec5SDimitry Andric         clEnumValN(DumpJSON, "dump-json",
1210b57cec5SDimitry Andric                    "Dump all records as machine-readable JSON"),
1220b57cec5SDimitry Andric         clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
1230b57cec5SDimitry Andric                    "Generate clang attribute clases"),
1240b57cec5SDimitry Andric         clEnumValN(GenClangAttrParserStringSwitches,
1250b57cec5SDimitry Andric                    "gen-clang-attr-parser-string-switches",
1260b57cec5SDimitry Andric                    "Generate all parser-related attribute string switches"),
1270b57cec5SDimitry Andric         clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches,
1280b57cec5SDimitry Andric                    "gen-clang-attr-subject-match-rules-parser-string-switches",
1290b57cec5SDimitry Andric                    "Generate all parser-related attribute subject match rule"
1300b57cec5SDimitry Andric                    "string switches"),
1310b57cec5SDimitry Andric         clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
1320b57cec5SDimitry Andric                    "Generate clang attribute implementations"),
1330b57cec5SDimitry Andric         clEnumValN(GenClangAttrList, "gen-clang-attr-list",
1340b57cec5SDimitry Andric                    "Generate a clang attribute list"),
135349cc55cSDimitry Andric         clEnumValN(GenClangAttrDocTable, "gen-clang-attr-doc-table",
136349cc55cSDimitry Andric                    "Generate a table of attribute documentation"),
1370b57cec5SDimitry Andric         clEnumValN(GenClangAttrSubjectMatchRuleList,
1380b57cec5SDimitry Andric                    "gen-clang-attr-subject-match-rule-list",
1390b57cec5SDimitry Andric                    "Generate a clang attribute subject match rule list"),
1400b57cec5SDimitry Andric         clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
1410b57cec5SDimitry Andric                    "Generate clang PCH attribute reader"),
1420b57cec5SDimitry Andric         clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
1430b57cec5SDimitry Andric                    "Generate clang PCH attribute writer"),
1447a6dacacSDimitry Andric         clEnumValN(GenClangRegularKeywordAttributeInfo,
1457a6dacacSDimitry Andric                    "gen-clang-regular-keyword-attr-info",
1467a6dacacSDimitry Andric                    "Generate a list of regular keyword attributes with info "
1477a6dacacSDimitry Andric                    "about their arguments"),
1480b57cec5SDimitry Andric         clEnumValN(GenClangAttrHasAttributeImpl,
1490b57cec5SDimitry Andric                    "gen-clang-attr-has-attribute-impl",
1500b57cec5SDimitry Andric                    "Generate a clang attribute spelling list"),
1510b57cec5SDimitry Andric         clEnumValN(GenClangAttrSpellingListIndex,
1520b57cec5SDimitry Andric                    "gen-clang-attr-spelling-index",
1530b57cec5SDimitry Andric                    "Generate a clang attribute spelling index"),
1540b57cec5SDimitry Andric         clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor",
1550b57cec5SDimitry Andric                    "Generate a recursive AST visitor for clang attributes"),
1560b57cec5SDimitry Andric         clEnumValN(GenClangAttrTemplateInstantiate,
1570b57cec5SDimitry Andric                    "gen-clang-attr-template-instantiate",
1580b57cec5SDimitry Andric                    "Generate a clang template instantiate code"),
1590b57cec5SDimitry Andric         clEnumValN(GenClangAttrParsedAttrList,
1600b57cec5SDimitry Andric                    "gen-clang-attr-parsed-attr-list",
1610b57cec5SDimitry Andric                    "Generate a clang parsed attribute list"),
1620b57cec5SDimitry Andric         clEnumValN(GenClangAttrParsedAttrImpl,
1630b57cec5SDimitry Andric                    "gen-clang-attr-parsed-attr-impl",
1640b57cec5SDimitry Andric                    "Generate the clang parsed attribute helpers"),
1650b57cec5SDimitry Andric         clEnumValN(GenClangAttrParsedAttrKinds,
1660b57cec5SDimitry Andric                    "gen-clang-attr-parsed-attr-kinds",
1670b57cec5SDimitry Andric                    "Generate a clang parsed attribute kinds"),
1680b57cec5SDimitry Andric         clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump",
1690b57cec5SDimitry Andric                    "Generate clang attribute text node dumper"),
1700b57cec5SDimitry Andric         clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse",
1710b57cec5SDimitry Andric                    "Generate clang attribute traverser"),
172*0fca6ea1SDimitry Andric         clEnumValN(GenClangBuiltins, "gen-clang-builtins",
173*0fca6ea1SDimitry Andric                    "Generate clang builtins list"),
1740b57cec5SDimitry Andric         clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
1750b57cec5SDimitry Andric                    "Generate Clang diagnostics definitions"),
1760b57cec5SDimitry Andric         clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
1770b57cec5SDimitry Andric                    "Generate Clang diagnostic groups"),
1780b57cec5SDimitry Andric         clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
1790b57cec5SDimitry Andric                    "Generate Clang diagnostic name index"),
180480093f4SDimitry Andric         clEnumValN(GenClangBasicReader, "gen-clang-basic-reader",
181480093f4SDimitry Andric                    "Generate Clang BasicReader classes"),
182480093f4SDimitry Andric         clEnumValN(GenClangBasicWriter, "gen-clang-basic-writer",
183480093f4SDimitry Andric                    "Generate Clang BasicWriter classes"),
1840b57cec5SDimitry Andric         clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
1850b57cec5SDimitry Andric                    "Generate Clang AST comment nodes"),
1860b57cec5SDimitry Andric         clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
1870b57cec5SDimitry Andric                    "Generate Clang AST declaration nodes"),
1880b57cec5SDimitry Andric         clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
1890b57cec5SDimitry Andric                    "Generate Clang AST statement nodes"),
190a7dea167SDimitry Andric         clEnumValN(GenClangTypeNodes, "gen-clang-type-nodes",
191a7dea167SDimitry Andric                    "Generate Clang AST type nodes"),
192480093f4SDimitry Andric         clEnumValN(GenClangTypeReader, "gen-clang-type-reader",
193480093f4SDimitry Andric                    "Generate Clang AbstractTypeReader class"),
194480093f4SDimitry Andric         clEnumValN(GenClangTypeWriter, "gen-clang-type-writer",
195480093f4SDimitry Andric                    "Generate Clang AbstractTypeWriter class"),
196a7dea167SDimitry Andric         clEnumValN(GenClangOpcodes, "gen-clang-opcodes",
197a7dea167SDimitry Andric                    "Generate Clang constexpr interpreter opcodes"),
1980b57cec5SDimitry Andric         clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
1990b57cec5SDimitry Andric                    "Generate Clang Static Analyzer checkers"),
200e8d8bef9SDimitry Andric         clEnumValN(GenClangSyntaxNodeList, "gen-clang-syntax-node-list",
201e8d8bef9SDimitry Andric                    "Generate list of Clang Syntax Tree node types"),
202e8d8bef9SDimitry Andric         clEnumValN(GenClangSyntaxNodeClasses, "gen-clang-syntax-node-classes",
203e8d8bef9SDimitry Andric                    "Generate definitions of Clang Syntax Tree node clasess"),
2040b57cec5SDimitry Andric         clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
2050b57cec5SDimitry Andric                    "Generate efficient matchers for HTML tag "
2060b57cec5SDimitry Andric                    "names that are used in documentation comments"),
2070b57cec5SDimitry Andric         clEnumValN(GenClangCommentHTMLTagsProperties,
2080b57cec5SDimitry Andric                    "gen-clang-comment-html-tags-properties",
2090b57cec5SDimitry Andric                    "Generate efficient matchers for HTML tag "
2100b57cec5SDimitry Andric                    "properties"),
2110b57cec5SDimitry Andric         clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
2120b57cec5SDimitry Andric                    "gen-clang-comment-html-named-character-references",
2130b57cec5SDimitry Andric                    "Generate function to translate named character "
2140b57cec5SDimitry Andric                    "references to UTF-8 sequences"),
2150b57cec5SDimitry Andric         clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
2160b57cec5SDimitry Andric                    "Generate command properties for commands that "
2170b57cec5SDimitry Andric                    "are used in documentation comments"),
2180b57cec5SDimitry Andric         clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
2190b57cec5SDimitry Andric                    "Generate list of commands that are used in "
2200b57cec5SDimitry Andric                    "documentation comments"),
2210b57cec5SDimitry Andric         clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins",
2220b57cec5SDimitry Andric                    "Generate OpenCL builtin declaration handlers"),
22306c3fb27SDimitry Andric         clEnumValN(GenClangOpenCLBuiltinHeader,
22406c3fb27SDimitry Andric                    "gen-clang-opencl-builtin-header",
22506c3fb27SDimitry Andric                    "Generate OpenCL builtin header"),
226fe6060f1SDimitry Andric         clEnumValN(GenClangOpenCLBuiltinTests, "gen-clang-opencl-builtin-tests",
227fe6060f1SDimitry Andric                    "Generate OpenCL builtin declaration tests"),
2280b57cec5SDimitry Andric         clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
2290b57cec5SDimitry Andric         clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"),
2305ffd83dbSDimitry Andric         clEnumValN(GenArmBF16, "gen-arm-bf16", "Generate arm_bf16.h for clang"),
2315f757f3fSDimitry Andric         clEnumValN(GenArmVectorType, "gen-arm-vector-type",
2325f757f3fSDimitry Andric                    "Generate arm_vector_types.h for clang"),
2330b57cec5SDimitry Andric         clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
2340b57cec5SDimitry Andric                    "Generate ARM NEON sema support for clang"),
2350b57cec5SDimitry Andric         clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
2360b57cec5SDimitry Andric                    "Generate ARM NEON tests for clang"),
2375ffd83dbSDimitry Andric         clEnumValN(GenArmSveHeader, "gen-arm-sve-header",
2385ffd83dbSDimitry Andric                    "Generate arm_sve.h for clang"),
2395ffd83dbSDimitry Andric         clEnumValN(GenArmSveBuiltins, "gen-arm-sve-builtins",
2405ffd83dbSDimitry Andric                    "Generate arm_sve_builtins.inc for clang"),
2415ffd83dbSDimitry Andric         clEnumValN(GenArmSveBuiltinCG, "gen-arm-sve-builtin-codegen",
2425ffd83dbSDimitry Andric                    "Generate arm_sve_builtin_cg_map.inc for clang"),
2435ffd83dbSDimitry Andric         clEnumValN(GenArmSveTypeFlags, "gen-arm-sve-typeflags",
2445ffd83dbSDimitry Andric                    "Generate arm_sve_typeflags.inc for clang"),
2455ffd83dbSDimitry Andric         clEnumValN(GenArmSveRangeChecks, "gen-arm-sve-sema-rangechecks",
2465ffd83dbSDimitry Andric                    "Generate arm_sve_sema_rangechecks.inc for clang"),
247cb14a3feSDimitry Andric         clEnumValN(GenArmSveStreamingAttrs, "gen-arm-sve-streaming-attrs",
248cb14a3feSDimitry Andric                    "Generate arm_sve_streaming_attrs.inc for clang"),
24906c3fb27SDimitry Andric         clEnumValN(GenArmSmeHeader, "gen-arm-sme-header",
25006c3fb27SDimitry Andric                    "Generate arm_sme.h for clang"),
25106c3fb27SDimitry Andric         clEnumValN(GenArmSmeBuiltins, "gen-arm-sme-builtins",
25206c3fb27SDimitry Andric                    "Generate arm_sme_builtins.inc for clang"),
25306c3fb27SDimitry Andric         clEnumValN(GenArmSmeBuiltinCG, "gen-arm-sme-builtin-codegen",
25406c3fb27SDimitry Andric                    "Generate arm_sme_builtin_cg_map.inc for clang"),
25506c3fb27SDimitry Andric         clEnumValN(GenArmSmeRangeChecks, "gen-arm-sme-sema-rangechecks",
25606c3fb27SDimitry Andric                    "Generate arm_sme_sema_rangechecks.inc for clang"),
257cb14a3feSDimitry Andric         clEnumValN(GenArmSmeStreamingAttrs, "gen-arm-sme-streaming-attrs",
258cb14a3feSDimitry Andric                    "Generate arm_sme_streaming_attrs.inc for clang"),
259cb14a3feSDimitry Andric         clEnumValN(GenArmSmeBuiltinZAState, "gen-arm-sme-builtin-za-state",
260cb14a3feSDimitry Andric                    "Generate arm_sme_builtins_za_state.inc for clang"),
261480093f4SDimitry Andric         clEnumValN(GenArmMveHeader, "gen-arm-mve-header",
262480093f4SDimitry Andric                    "Generate arm_mve.h for clang"),
263480093f4SDimitry Andric         clEnumValN(GenArmMveBuiltinDef, "gen-arm-mve-builtin-def",
264480093f4SDimitry Andric                    "Generate ARM MVE builtin definitions for clang"),
265480093f4SDimitry Andric         clEnumValN(GenArmMveBuiltinSema, "gen-arm-mve-builtin-sema",
266480093f4SDimitry Andric                    "Generate ARM MVE builtin sema checks for clang"),
267480093f4SDimitry Andric         clEnumValN(GenArmMveBuiltinCG, "gen-arm-mve-builtin-codegen",
268480093f4SDimitry Andric                    "Generate ARM MVE builtin code-generator for clang"),
269480093f4SDimitry Andric         clEnumValN(GenArmMveBuiltinAliases, "gen-arm-mve-builtin-aliases",
270480093f4SDimitry Andric                    "Generate list of valid ARM MVE builtin aliases for clang"),
2715ffd83dbSDimitry Andric         clEnumValN(GenArmCdeHeader, "gen-arm-cde-header",
2725ffd83dbSDimitry Andric                    "Generate arm_cde.h for clang"),
2735ffd83dbSDimitry Andric         clEnumValN(GenArmCdeBuiltinDef, "gen-arm-cde-builtin-def",
2745ffd83dbSDimitry Andric                    "Generate ARM CDE builtin definitions for clang"),
2755ffd83dbSDimitry Andric         clEnumValN(GenArmCdeBuiltinSema, "gen-arm-cde-builtin-sema",
2765ffd83dbSDimitry Andric                    "Generate ARM CDE builtin sema checks for clang"),
2775ffd83dbSDimitry Andric         clEnumValN(GenArmCdeBuiltinCG, "gen-arm-cde-builtin-codegen",
2785ffd83dbSDimitry Andric                    "Generate ARM CDE builtin code-generator for clang"),
2795ffd83dbSDimitry Andric         clEnumValN(GenArmCdeBuiltinAliases, "gen-arm-cde-builtin-aliases",
2805ffd83dbSDimitry Andric                    "Generate list of valid ARM CDE builtin aliases for clang"),
281fe6060f1SDimitry Andric         clEnumValN(GenRISCVVectorHeader, "gen-riscv-vector-header",
282fe6060f1SDimitry Andric                    "Generate riscv_vector.h for clang"),
283fe6060f1SDimitry Andric         clEnumValN(GenRISCVVectorBuiltins, "gen-riscv-vector-builtins",
284fe6060f1SDimitry Andric                    "Generate riscv_vector_builtins.inc for clang"),
285fe6060f1SDimitry Andric         clEnumValN(GenRISCVVectorBuiltinCG, "gen-riscv-vector-builtin-codegen",
286fe6060f1SDimitry Andric                    "Generate riscv_vector_builtin_cg.inc for clang"),
287972a253aSDimitry Andric         clEnumValN(GenRISCVVectorBuiltinSema, "gen-riscv-vector-builtin-sema",
288972a253aSDimitry Andric                    "Generate riscv_vector_builtin_sema.inc for clang"),
2897a6dacacSDimitry Andric         clEnumValN(GenRISCVSiFiveVectorBuiltins,
2907a6dacacSDimitry Andric                    "gen-riscv-sifive-vector-builtins",
29106c3fb27SDimitry Andric                    "Generate riscv_sifive_vector_builtins.inc for clang"),
2927a6dacacSDimitry Andric         clEnumValN(GenRISCVSiFiveVectorBuiltinCG,
2937a6dacacSDimitry Andric                    "gen-riscv-sifive-vector-builtin-codegen",
29406c3fb27SDimitry Andric                    "Generate riscv_sifive_vector_builtin_cg.inc for clang"),
2957a6dacacSDimitry Andric         clEnumValN(GenRISCVSiFiveVectorBuiltinSema,
2967a6dacacSDimitry Andric                    "gen-riscv-sifive-vector-builtin-sema",
29706c3fb27SDimitry Andric                    "Generate riscv_sifive_vector_builtin_sema.inc for clang"),
2980b57cec5SDimitry Andric         clEnumValN(GenAttrDocs, "gen-attr-docs",
2990b57cec5SDimitry Andric                    "Generate attribute documentation"),
3000b57cec5SDimitry Andric         clEnumValN(GenDiagDocs, "gen-diag-docs",
3010b57cec5SDimitry Andric                    "Generate diagnostic documentation"),
3020b57cec5SDimitry Andric         clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"),
3030b57cec5SDimitry Andric         clEnumValN(GenDataCollectors, "gen-clang-data-collectors",
3040b57cec5SDimitry Andric                    "Generate data collectors for AST nodes"),
3050b57cec5SDimitry Andric         clEnumValN(GenTestPragmaAttributeSupportedAttributes,
3060b57cec5SDimitry Andric                    "gen-clang-test-pragma-attribute-supported-attributes",
3070b57cec5SDimitry Andric                    "Generate a list of attributes supported by #pragma clang "
3080b57cec5SDimitry Andric                    "attribute for testing purposes")));
3090b57cec5SDimitry Andric 
3100b57cec5SDimitry Andric cl::opt<std::string>
3110b57cec5SDimitry Andric ClangComponent("clang-component",
3120b57cec5SDimitry Andric                cl::desc("Only use warnings from specified component"),
3130b57cec5SDimitry Andric                cl::value_desc("component"), cl::Hidden);
3140b57cec5SDimitry Andric 
3150b57cec5SDimitry Andric bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
3160b57cec5SDimitry Andric   switch (Action) {
3170b57cec5SDimitry Andric   case PrintRecords:
3180b57cec5SDimitry Andric     OS << Records;           // No argument, dump all contents
3190b57cec5SDimitry Andric     break;
3200b57cec5SDimitry Andric   case DumpJSON:
3210b57cec5SDimitry Andric     EmitJSON(Records, OS);
3220b57cec5SDimitry Andric     break;
3230b57cec5SDimitry Andric   case GenClangAttrClasses:
3240b57cec5SDimitry Andric     EmitClangAttrClass(Records, OS);
3250b57cec5SDimitry Andric     break;
3260b57cec5SDimitry Andric   case GenClangAttrParserStringSwitches:
3270b57cec5SDimitry Andric     EmitClangAttrParserStringSwitches(Records, OS);
3280b57cec5SDimitry Andric     break;
3290b57cec5SDimitry Andric   case GenClangAttrSubjectMatchRulesParserStringSwitches:
3300b57cec5SDimitry Andric     EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS);
3310b57cec5SDimitry Andric     break;
3320b57cec5SDimitry Andric   case GenClangAttrImpl:
3330b57cec5SDimitry Andric     EmitClangAttrImpl(Records, OS);
3340b57cec5SDimitry Andric     break;
3350b57cec5SDimitry Andric   case GenClangAttrList:
3360b57cec5SDimitry Andric     EmitClangAttrList(Records, OS);
3370b57cec5SDimitry Andric     break;
338349cc55cSDimitry Andric   case GenClangAttrDocTable:
339349cc55cSDimitry Andric     EmitClangAttrDocTable(Records, OS);
340349cc55cSDimitry Andric     break;
3410b57cec5SDimitry Andric   case GenClangAttrSubjectMatchRuleList:
3420b57cec5SDimitry Andric     EmitClangAttrSubjectMatchRuleList(Records, OS);
3430b57cec5SDimitry Andric     break;
3440b57cec5SDimitry Andric   case GenClangAttrPCHRead:
3450b57cec5SDimitry Andric     EmitClangAttrPCHRead(Records, OS);
3460b57cec5SDimitry Andric     break;
3470b57cec5SDimitry Andric   case GenClangAttrPCHWrite:
3480b57cec5SDimitry Andric     EmitClangAttrPCHWrite(Records, OS);
3490b57cec5SDimitry Andric     break;
3507a6dacacSDimitry Andric   case GenClangRegularKeywordAttributeInfo:
3517a6dacacSDimitry Andric     EmitClangRegularKeywordAttributeInfo(Records, OS);
35206c3fb27SDimitry Andric     break;
3530b57cec5SDimitry Andric   case GenClangAttrHasAttributeImpl:
3540b57cec5SDimitry Andric     EmitClangAttrHasAttrImpl(Records, OS);
3550b57cec5SDimitry Andric     break;
3560b57cec5SDimitry Andric   case GenClangAttrSpellingListIndex:
3570b57cec5SDimitry Andric     EmitClangAttrSpellingListIndex(Records, OS);
3580b57cec5SDimitry Andric     break;
3590b57cec5SDimitry Andric   case GenClangAttrASTVisitor:
3600b57cec5SDimitry Andric     EmitClangAttrASTVisitor(Records, OS);
3610b57cec5SDimitry Andric     break;
3620b57cec5SDimitry Andric   case GenClangAttrTemplateInstantiate:
3630b57cec5SDimitry Andric     EmitClangAttrTemplateInstantiate(Records, OS);
3640b57cec5SDimitry Andric     break;
3650b57cec5SDimitry Andric   case GenClangAttrParsedAttrList:
3660b57cec5SDimitry Andric     EmitClangAttrParsedAttrList(Records, OS);
3670b57cec5SDimitry Andric     break;
3680b57cec5SDimitry Andric   case GenClangAttrParsedAttrImpl:
3690b57cec5SDimitry Andric     EmitClangAttrParsedAttrImpl(Records, OS);
3700b57cec5SDimitry Andric     break;
3710b57cec5SDimitry Andric   case GenClangAttrParsedAttrKinds:
3720b57cec5SDimitry Andric     EmitClangAttrParsedAttrKinds(Records, OS);
3730b57cec5SDimitry Andric     break;
3740b57cec5SDimitry Andric   case GenClangAttrTextNodeDump:
3750b57cec5SDimitry Andric     EmitClangAttrTextNodeDump(Records, OS);
3760b57cec5SDimitry Andric     break;
3770b57cec5SDimitry Andric   case GenClangAttrNodeTraverse:
3780b57cec5SDimitry Andric     EmitClangAttrNodeTraverse(Records, OS);
3790b57cec5SDimitry Andric     break;
380*0fca6ea1SDimitry Andric   case GenClangBuiltins:
381*0fca6ea1SDimitry Andric     EmitClangBuiltins(Records, OS);
382*0fca6ea1SDimitry Andric     break;
3830b57cec5SDimitry Andric   case GenClangDiagsDefs:
3840b57cec5SDimitry Andric     EmitClangDiagsDefs(Records, OS, ClangComponent);
3850b57cec5SDimitry Andric     break;
3860b57cec5SDimitry Andric   case GenClangDiagGroups:
3870b57cec5SDimitry Andric     EmitClangDiagGroups(Records, OS);
3880b57cec5SDimitry Andric     break;
3890b57cec5SDimitry Andric   case GenClangDiagsIndexName:
3900b57cec5SDimitry Andric     EmitClangDiagsIndexName(Records, OS);
3910b57cec5SDimitry Andric     break;
3920b57cec5SDimitry Andric   case GenClangCommentNodes:
393480093f4SDimitry Andric     EmitClangASTNodes(Records, OS, CommentNodeClassName, "");
3940b57cec5SDimitry Andric     break;
3950b57cec5SDimitry Andric   case GenClangDeclNodes:
3961db9f3b2SDimitry Andric     EmitClangASTNodes(Records, OS, DeclNodeClassName, "Decl",
3971db9f3b2SDimitry Andric                       DeclContextNodeClassName);
3980b57cec5SDimitry Andric     EmitClangDeclContext(Records, OS);
3990b57cec5SDimitry Andric     break;
4000b57cec5SDimitry Andric   case GenClangStmtNodes:
401480093f4SDimitry Andric     EmitClangASTNodes(Records, OS, StmtNodeClassName, "");
4020b57cec5SDimitry Andric     break;
403a7dea167SDimitry Andric   case GenClangTypeNodes:
404a7dea167SDimitry Andric     EmitClangTypeNodes(Records, OS);
405a7dea167SDimitry Andric     break;
406480093f4SDimitry Andric   case GenClangTypeReader:
407480093f4SDimitry Andric     EmitClangTypeReader(Records, OS);
408480093f4SDimitry Andric     break;
409480093f4SDimitry Andric   case GenClangTypeWriter:
410480093f4SDimitry Andric     EmitClangTypeWriter(Records, OS);
411480093f4SDimitry Andric     break;
412480093f4SDimitry Andric   case GenClangBasicReader:
413480093f4SDimitry Andric     EmitClangBasicReader(Records, OS);
414480093f4SDimitry Andric     break;
415480093f4SDimitry Andric   case GenClangBasicWriter:
416480093f4SDimitry Andric     EmitClangBasicWriter(Records, OS);
417480093f4SDimitry Andric     break;
418a7dea167SDimitry Andric   case GenClangOpcodes:
419a7dea167SDimitry Andric     EmitClangOpcodes(Records, OS);
420a7dea167SDimitry Andric     break;
4210b57cec5SDimitry Andric   case GenClangSACheckers:
4220b57cec5SDimitry Andric     EmitClangSACheckers(Records, OS);
4230b57cec5SDimitry Andric     break;
4240b57cec5SDimitry Andric   case GenClangCommentHTMLTags:
4250b57cec5SDimitry Andric     EmitClangCommentHTMLTags(Records, OS);
4260b57cec5SDimitry Andric     break;
4270b57cec5SDimitry Andric   case GenClangCommentHTMLTagsProperties:
4280b57cec5SDimitry Andric     EmitClangCommentHTMLTagsProperties(Records, OS);
4290b57cec5SDimitry Andric     break;
4300b57cec5SDimitry Andric   case GenClangCommentHTMLNamedCharacterReferences:
4310b57cec5SDimitry Andric     EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
4320b57cec5SDimitry Andric     break;
4330b57cec5SDimitry Andric   case GenClangCommentCommandInfo:
4340b57cec5SDimitry Andric     EmitClangCommentCommandInfo(Records, OS);
4350b57cec5SDimitry Andric     break;
4360b57cec5SDimitry Andric   case GenClangCommentCommandList:
4370b57cec5SDimitry Andric     EmitClangCommentCommandList(Records, OS);
4380b57cec5SDimitry Andric     break;
4390b57cec5SDimitry Andric   case GenClangOpenCLBuiltins:
4400b57cec5SDimitry Andric     EmitClangOpenCLBuiltins(Records, OS);
4410b57cec5SDimitry Andric     break;
44206c3fb27SDimitry Andric   case GenClangOpenCLBuiltinHeader:
44306c3fb27SDimitry Andric     EmitClangOpenCLBuiltinHeader(Records, OS);
44406c3fb27SDimitry Andric     break;
445fe6060f1SDimitry Andric   case GenClangOpenCLBuiltinTests:
446fe6060f1SDimitry Andric     EmitClangOpenCLBuiltinTests(Records, OS);
447fe6060f1SDimitry Andric     break;
448e8d8bef9SDimitry Andric   case GenClangSyntaxNodeList:
449e8d8bef9SDimitry Andric     EmitClangSyntaxNodeList(Records, OS);
450e8d8bef9SDimitry Andric     break;
451e8d8bef9SDimitry Andric   case GenClangSyntaxNodeClasses:
452e8d8bef9SDimitry Andric     EmitClangSyntaxNodeClasses(Records, OS);
453e8d8bef9SDimitry Andric     break;
4540b57cec5SDimitry Andric   case GenArmNeon:
4550b57cec5SDimitry Andric     EmitNeon(Records, OS);
4560b57cec5SDimitry Andric     break;
4570b57cec5SDimitry Andric   case GenArmFP16:
4580b57cec5SDimitry Andric     EmitFP16(Records, OS);
4590b57cec5SDimitry Andric     break;
4605f757f3fSDimitry Andric   case GenArmVectorType:
4615f757f3fSDimitry Andric     EmitVectorTypes(Records, OS);
4625f757f3fSDimitry Andric     break;
4635ffd83dbSDimitry Andric   case GenArmBF16:
4645ffd83dbSDimitry Andric     EmitBF16(Records, OS);
4655ffd83dbSDimitry Andric     break;
4660b57cec5SDimitry Andric   case GenArmNeonSema:
4670b57cec5SDimitry Andric     EmitNeonSema(Records, OS);
4680b57cec5SDimitry Andric     break;
4690b57cec5SDimitry Andric   case GenArmNeonTest:
4700b57cec5SDimitry Andric     EmitNeonTest(Records, OS);
4710b57cec5SDimitry Andric     break;
472480093f4SDimitry Andric   case GenArmMveHeader:
473480093f4SDimitry Andric     EmitMveHeader(Records, OS);
474480093f4SDimitry Andric     break;
475480093f4SDimitry Andric   case GenArmMveBuiltinDef:
476480093f4SDimitry Andric     EmitMveBuiltinDef(Records, OS);
477480093f4SDimitry Andric     break;
478480093f4SDimitry Andric   case GenArmMveBuiltinSema:
479480093f4SDimitry Andric     EmitMveBuiltinSema(Records, OS);
480480093f4SDimitry Andric     break;
481480093f4SDimitry Andric   case GenArmMveBuiltinCG:
482480093f4SDimitry Andric     EmitMveBuiltinCG(Records, OS);
483480093f4SDimitry Andric     break;
484480093f4SDimitry Andric   case GenArmMveBuiltinAliases:
485480093f4SDimitry Andric     EmitMveBuiltinAliases(Records, OS);
486480093f4SDimitry Andric     break;
4875ffd83dbSDimitry Andric   case GenArmSveHeader:
4885ffd83dbSDimitry Andric     EmitSveHeader(Records, OS);
4895ffd83dbSDimitry Andric     break;
4905ffd83dbSDimitry Andric   case GenArmSveBuiltins:
4915ffd83dbSDimitry Andric     EmitSveBuiltins(Records, OS);
4925ffd83dbSDimitry Andric     break;
4935ffd83dbSDimitry Andric   case GenArmSveBuiltinCG:
4945ffd83dbSDimitry Andric     EmitSveBuiltinCG(Records, OS);
4955ffd83dbSDimitry Andric     break;
4965ffd83dbSDimitry Andric   case GenArmSveTypeFlags:
4975ffd83dbSDimitry Andric     EmitSveTypeFlags(Records, OS);
4985ffd83dbSDimitry Andric     break;
4995ffd83dbSDimitry Andric   case GenArmSveRangeChecks:
5005ffd83dbSDimitry Andric     EmitSveRangeChecks(Records, OS);
5015ffd83dbSDimitry Andric     break;
502cb14a3feSDimitry Andric   case GenArmSveStreamingAttrs:
503cb14a3feSDimitry Andric     EmitSveStreamingAttrs(Records, OS);
504cb14a3feSDimitry Andric     break;
50506c3fb27SDimitry Andric   case GenArmSmeHeader:
50606c3fb27SDimitry Andric     EmitSmeHeader(Records, OS);
50706c3fb27SDimitry Andric     break;
50806c3fb27SDimitry Andric   case GenArmSmeBuiltins:
50906c3fb27SDimitry Andric     EmitSmeBuiltins(Records, OS);
51006c3fb27SDimitry Andric     break;
51106c3fb27SDimitry Andric   case GenArmSmeBuiltinCG:
51206c3fb27SDimitry Andric     EmitSmeBuiltinCG(Records, OS);
51306c3fb27SDimitry Andric     break;
51406c3fb27SDimitry Andric   case GenArmSmeRangeChecks:
51506c3fb27SDimitry Andric     EmitSmeRangeChecks(Records, OS);
51606c3fb27SDimitry Andric     break;
517cb14a3feSDimitry Andric   case GenArmSmeStreamingAttrs:
518cb14a3feSDimitry Andric     EmitSmeStreamingAttrs(Records, OS);
519cb14a3feSDimitry Andric     break;
520cb14a3feSDimitry Andric   case GenArmSmeBuiltinZAState:
521cb14a3feSDimitry Andric     EmitSmeBuiltinZAState(Records, OS);
522cb14a3feSDimitry Andric     break;
5235ffd83dbSDimitry Andric   case GenArmCdeHeader:
5245ffd83dbSDimitry Andric     EmitCdeHeader(Records, OS);
5255ffd83dbSDimitry Andric     break;
5265ffd83dbSDimitry Andric   case GenArmCdeBuiltinDef:
5275ffd83dbSDimitry Andric     EmitCdeBuiltinDef(Records, OS);
5285ffd83dbSDimitry Andric     break;
5295ffd83dbSDimitry Andric   case GenArmCdeBuiltinSema:
5305ffd83dbSDimitry Andric     EmitCdeBuiltinSema(Records, OS);
5315ffd83dbSDimitry Andric     break;
5325ffd83dbSDimitry Andric   case GenArmCdeBuiltinCG:
5335ffd83dbSDimitry Andric     EmitCdeBuiltinCG(Records, OS);
5345ffd83dbSDimitry Andric     break;
5355ffd83dbSDimitry Andric   case GenArmCdeBuiltinAliases:
5365ffd83dbSDimitry Andric     EmitCdeBuiltinAliases(Records, OS);
5375ffd83dbSDimitry Andric     break;
538fe6060f1SDimitry Andric   case GenRISCVVectorHeader:
539fe6060f1SDimitry Andric     EmitRVVHeader(Records, OS);
540fe6060f1SDimitry Andric     break;
541fe6060f1SDimitry Andric   case GenRISCVVectorBuiltins:
542fe6060f1SDimitry Andric     EmitRVVBuiltins(Records, OS);
543fe6060f1SDimitry Andric     break;
544fe6060f1SDimitry Andric   case GenRISCVVectorBuiltinCG:
545fe6060f1SDimitry Andric     EmitRVVBuiltinCG(Records, OS);
546fe6060f1SDimitry Andric     break;
547972a253aSDimitry Andric   case GenRISCVVectorBuiltinSema:
548972a253aSDimitry Andric     EmitRVVBuiltinSema(Records, OS);
549972a253aSDimitry Andric     break;
55006c3fb27SDimitry Andric   case GenRISCVSiFiveVectorBuiltins:
55106c3fb27SDimitry Andric     EmitRVVBuiltins(Records, OS);
55206c3fb27SDimitry Andric     break;
55306c3fb27SDimitry Andric   case GenRISCVSiFiveVectorBuiltinCG:
55406c3fb27SDimitry Andric     EmitRVVBuiltinCG(Records, OS);
55506c3fb27SDimitry Andric     break;
55606c3fb27SDimitry Andric   case GenRISCVSiFiveVectorBuiltinSema:
55706c3fb27SDimitry Andric     EmitRVVBuiltinSema(Records, OS);
55806c3fb27SDimitry Andric     break;
5590b57cec5SDimitry Andric   case GenAttrDocs:
5600b57cec5SDimitry Andric     EmitClangAttrDocs(Records, OS);
5610b57cec5SDimitry Andric     break;
5620b57cec5SDimitry Andric   case GenDiagDocs:
5630b57cec5SDimitry Andric     EmitClangDiagDocs(Records, OS);
5640b57cec5SDimitry Andric     break;
5650b57cec5SDimitry Andric   case GenOptDocs:
5660b57cec5SDimitry Andric     EmitClangOptDocs(Records, OS);
5670b57cec5SDimitry Andric     break;
5680b57cec5SDimitry Andric   case GenDataCollectors:
5690b57cec5SDimitry Andric     EmitClangDataCollectors(Records, OS);
5700b57cec5SDimitry Andric     break;
5710b57cec5SDimitry Andric   case GenTestPragmaAttributeSupportedAttributes:
5720b57cec5SDimitry Andric     EmitTestPragmaAttributeSupportedAttributes(Records, OS);
5730b57cec5SDimitry Andric     break;
5740b57cec5SDimitry Andric   }
5750b57cec5SDimitry Andric 
5760b57cec5SDimitry Andric   return false;
5770b57cec5SDimitry Andric }
5780b57cec5SDimitry Andric }
5790b57cec5SDimitry Andric 
5800b57cec5SDimitry Andric int main(int argc, char **argv) {
5810b57cec5SDimitry Andric   sys::PrintStackTraceOnErrorSignal(argv[0]);
5820b57cec5SDimitry Andric   PrettyStackTraceProgram X(argc, argv);
5830b57cec5SDimitry Andric   cl::ParseCommandLineOptions(argc, argv);
5840b57cec5SDimitry Andric 
5850b57cec5SDimitry Andric   llvm_shutdown_obj Y;
5860b57cec5SDimitry Andric 
5870b57cec5SDimitry Andric   return TableGenMain(argv[0], &ClangTableGenMain);
5880b57cec5SDimitry Andric }
5890b57cec5SDimitry Andric 
5900b57cec5SDimitry Andric #ifdef __has_feature
5910b57cec5SDimitry Andric #if __has_feature(address_sanitizer)
5920b57cec5SDimitry Andric #include <sanitizer/lsan_interface.h>
5930b57cec5SDimitry Andric // Disable LeakSanitizer for this binary as it has too many leaks that are not
5940b57cec5SDimitry Andric // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
5950b57cec5SDimitry Andric int __lsan_is_turned_off() { return 1; }
5960b57cec5SDimitry Andric #endif  // __has_feature(address_sanitizer)
5970b57cec5SDimitry Andric #endif  // defined(__has_feature)
598