1 //===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file contains the main function for Clang's TableGen.
11 //===----------------------------------------------------------------------===//
13 #include "TableGenBackends.h" // Declares all backends.
14 #include "ASTTableGen.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"
23 using namespace clang;
29 GenClangAttrParserStringSwitches,
30 GenClangAttrSubjectMatchRulesParserStringSwitches,
33 GenClangAttrSubjectMatchRuleList,
36 GenClangAttrHasAttributeImpl,
37 GenClangAttrSpellingListIndex,
38 GenClangAttrASTVisitor,
39 GenClangAttrTemplateInstantiate,
40 GenClangAttrParsedAttrList,
41 GenClangAttrParsedAttrImpl,
42 GenClangAttrParsedAttrKinds,
43 GenClangAttrTextNodeDump,
44 GenClangAttrNodeTraverse,
49 GenClangDiagsIndexName,
58 GenClangCommentHTMLTags,
59 GenClangCommentHTMLTagsProperties,
60 GenClangCommentHTMLNamedCharacterReferences,
61 GenClangCommentCommandInfo,
62 GenClangCommentCommandList,
63 GenClangOpenCLBuiltins,
72 GenArmMveBuiltinAliases,
77 GenTestPragmaAttributeSupportedAttributes
81 cl::opt<ActionType> Action(
82 cl::desc("Action to perform:"),
84 clEnumValN(PrintRecords, "print-records",
85 "Print all records to stdout (default)"),
86 clEnumValN(DumpJSON, "dump-json",
87 "Dump all records as machine-readable JSON"),
88 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
89 "Generate clang attribute clases"),
90 clEnumValN(GenClangAttrParserStringSwitches,
91 "gen-clang-attr-parser-string-switches",
92 "Generate all parser-related attribute string switches"),
93 clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches,
94 "gen-clang-attr-subject-match-rules-parser-string-switches",
95 "Generate all parser-related attribute subject match rule"
97 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
98 "Generate clang attribute implementations"),
99 clEnumValN(GenClangAttrList, "gen-clang-attr-list",
100 "Generate a clang attribute list"),
101 clEnumValN(GenClangAttrSubjectMatchRuleList,
102 "gen-clang-attr-subject-match-rule-list",
103 "Generate a clang attribute subject match rule list"),
104 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
105 "Generate clang PCH attribute reader"),
106 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
107 "Generate clang PCH attribute writer"),
108 clEnumValN(GenClangAttrHasAttributeImpl,
109 "gen-clang-attr-has-attribute-impl",
110 "Generate a clang attribute spelling list"),
111 clEnumValN(GenClangAttrSpellingListIndex,
112 "gen-clang-attr-spelling-index",
113 "Generate a clang attribute spelling index"),
114 clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor",
115 "Generate a recursive AST visitor for clang attributes"),
116 clEnumValN(GenClangAttrTemplateInstantiate,
117 "gen-clang-attr-template-instantiate",
118 "Generate a clang template instantiate code"),
119 clEnumValN(GenClangAttrParsedAttrList,
120 "gen-clang-attr-parsed-attr-list",
121 "Generate a clang parsed attribute list"),
122 clEnumValN(GenClangAttrParsedAttrImpl,
123 "gen-clang-attr-parsed-attr-impl",
124 "Generate the clang parsed attribute helpers"),
125 clEnumValN(GenClangAttrParsedAttrKinds,
126 "gen-clang-attr-parsed-attr-kinds",
127 "Generate a clang parsed attribute kinds"),
128 clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump",
129 "Generate clang attribute text node dumper"),
130 clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse",
131 "Generate clang attribute traverser"),
132 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
133 "Generate Clang diagnostics definitions"),
134 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
135 "Generate Clang diagnostic groups"),
136 clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
137 "Generate Clang diagnostic name index"),
138 clEnumValN(GenClangBasicReader, "gen-clang-basic-reader",
139 "Generate Clang BasicReader classes"),
140 clEnumValN(GenClangBasicWriter, "gen-clang-basic-writer",
141 "Generate Clang BasicWriter classes"),
142 clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
143 "Generate Clang AST comment nodes"),
144 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
145 "Generate Clang AST declaration nodes"),
146 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
147 "Generate Clang AST statement nodes"),
148 clEnumValN(GenClangTypeNodes, "gen-clang-type-nodes",
149 "Generate Clang AST type nodes"),
150 clEnumValN(GenClangTypeReader, "gen-clang-type-reader",
151 "Generate Clang AbstractTypeReader class"),
152 clEnumValN(GenClangTypeWriter, "gen-clang-type-writer",
153 "Generate Clang AbstractTypeWriter class"),
154 clEnumValN(GenClangOpcodes, "gen-clang-opcodes",
155 "Generate Clang constexpr interpreter opcodes"),
156 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
157 "Generate Clang Static Analyzer checkers"),
158 clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
159 "Generate efficient matchers for HTML tag "
160 "names that are used in documentation comments"),
161 clEnumValN(GenClangCommentHTMLTagsProperties,
162 "gen-clang-comment-html-tags-properties",
163 "Generate efficient matchers for HTML tag "
165 clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
166 "gen-clang-comment-html-named-character-references",
167 "Generate function to translate named character "
168 "references to UTF-8 sequences"),
169 clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
170 "Generate command properties for commands that "
171 "are used in documentation comments"),
172 clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
173 "Generate list of commands that are used in "
174 "documentation comments"),
175 clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins",
176 "Generate OpenCL builtin declaration handlers"),
177 clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
178 clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"),
179 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
180 "Generate ARM NEON sema support for clang"),
181 clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
182 "Generate ARM NEON tests for clang"),
183 clEnumValN(GenArmMveHeader, "gen-arm-mve-header",
184 "Generate arm_mve.h for clang"),
185 clEnumValN(GenArmMveBuiltinDef, "gen-arm-mve-builtin-def",
186 "Generate ARM MVE builtin definitions for clang"),
187 clEnumValN(GenArmMveBuiltinSema, "gen-arm-mve-builtin-sema",
188 "Generate ARM MVE builtin sema checks for clang"),
189 clEnumValN(GenArmMveBuiltinCG, "gen-arm-mve-builtin-codegen",
190 "Generate ARM MVE builtin code-generator for clang"),
191 clEnumValN(GenArmMveBuiltinAliases, "gen-arm-mve-builtin-aliases",
192 "Generate list of valid ARM MVE builtin aliases for clang"),
193 clEnumValN(GenAttrDocs, "gen-attr-docs",
194 "Generate attribute documentation"),
195 clEnumValN(GenDiagDocs, "gen-diag-docs",
196 "Generate diagnostic documentation"),
197 clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"),
198 clEnumValN(GenDataCollectors, "gen-clang-data-collectors",
199 "Generate data collectors for AST nodes"),
200 clEnumValN(GenTestPragmaAttributeSupportedAttributes,
201 "gen-clang-test-pragma-attribute-supported-attributes",
202 "Generate a list of attributes supported by #pragma clang "
203 "attribute for testing purposes")));
206 ClangComponent("clang-component",
207 cl::desc("Only use warnings from specified component"),
208 cl::value_desc("component"), cl::Hidden);
210 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
213 OS << Records; // No argument, dump all contents
216 EmitJSON(Records, OS);
218 case GenClangAttrClasses:
219 EmitClangAttrClass(Records, OS);
221 case GenClangAttrParserStringSwitches:
222 EmitClangAttrParserStringSwitches(Records, OS);
224 case GenClangAttrSubjectMatchRulesParserStringSwitches:
225 EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS);
227 case GenClangAttrImpl:
228 EmitClangAttrImpl(Records, OS);
230 case GenClangAttrList:
231 EmitClangAttrList(Records, OS);
233 case GenClangAttrSubjectMatchRuleList:
234 EmitClangAttrSubjectMatchRuleList(Records, OS);
236 case GenClangAttrPCHRead:
237 EmitClangAttrPCHRead(Records, OS);
239 case GenClangAttrPCHWrite:
240 EmitClangAttrPCHWrite(Records, OS);
242 case GenClangAttrHasAttributeImpl:
243 EmitClangAttrHasAttrImpl(Records, OS);
245 case GenClangAttrSpellingListIndex:
246 EmitClangAttrSpellingListIndex(Records, OS);
248 case GenClangAttrASTVisitor:
249 EmitClangAttrASTVisitor(Records, OS);
251 case GenClangAttrTemplateInstantiate:
252 EmitClangAttrTemplateInstantiate(Records, OS);
254 case GenClangAttrParsedAttrList:
255 EmitClangAttrParsedAttrList(Records, OS);
257 case GenClangAttrParsedAttrImpl:
258 EmitClangAttrParsedAttrImpl(Records, OS);
260 case GenClangAttrParsedAttrKinds:
261 EmitClangAttrParsedAttrKinds(Records, OS);
263 case GenClangAttrTextNodeDump:
264 EmitClangAttrTextNodeDump(Records, OS);
266 case GenClangAttrNodeTraverse:
267 EmitClangAttrNodeTraverse(Records, OS);
269 case GenClangDiagsDefs:
270 EmitClangDiagsDefs(Records, OS, ClangComponent);
272 case GenClangDiagGroups:
273 EmitClangDiagGroups(Records, OS);
275 case GenClangDiagsIndexName:
276 EmitClangDiagsIndexName(Records, OS);
278 case GenClangCommentNodes:
279 EmitClangASTNodes(Records, OS, CommentNodeClassName, "");
281 case GenClangDeclNodes:
282 EmitClangASTNodes(Records, OS, DeclNodeClassName, "Decl");
283 EmitClangDeclContext(Records, OS);
285 case GenClangStmtNodes:
286 EmitClangASTNodes(Records, OS, StmtNodeClassName, "");
288 case GenClangTypeNodes:
289 EmitClangTypeNodes(Records, OS);
291 case GenClangTypeReader:
292 EmitClangTypeReader(Records, OS);
294 case GenClangTypeWriter:
295 EmitClangTypeWriter(Records, OS);
297 case GenClangBasicReader:
298 EmitClangBasicReader(Records, OS);
300 case GenClangBasicWriter:
301 EmitClangBasicWriter(Records, OS);
303 case GenClangOpcodes:
304 EmitClangOpcodes(Records, OS);
306 case GenClangSACheckers:
307 EmitClangSACheckers(Records, OS);
309 case GenClangCommentHTMLTags:
310 EmitClangCommentHTMLTags(Records, OS);
312 case GenClangCommentHTMLTagsProperties:
313 EmitClangCommentHTMLTagsProperties(Records, OS);
315 case GenClangCommentHTMLNamedCharacterReferences:
316 EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
318 case GenClangCommentCommandInfo:
319 EmitClangCommentCommandInfo(Records, OS);
321 case GenClangCommentCommandList:
322 EmitClangCommentCommandList(Records, OS);
324 case GenClangOpenCLBuiltins:
325 EmitClangOpenCLBuiltins(Records, OS);
328 EmitNeon(Records, OS);
331 EmitFP16(Records, OS);
334 EmitNeonSema(Records, OS);
337 EmitNeonTest(Records, OS);
339 case GenArmMveHeader:
340 EmitMveHeader(Records, OS);
342 case GenArmMveBuiltinDef:
343 EmitMveBuiltinDef(Records, OS);
345 case GenArmMveBuiltinSema:
346 EmitMveBuiltinSema(Records, OS);
348 case GenArmMveBuiltinCG:
349 EmitMveBuiltinCG(Records, OS);
351 case GenArmMveBuiltinAliases:
352 EmitMveBuiltinAliases(Records, OS);
355 EmitClangAttrDocs(Records, OS);
358 EmitClangDiagDocs(Records, OS);
361 EmitClangOptDocs(Records, OS);
363 case GenDataCollectors:
364 EmitClangDataCollectors(Records, OS);
366 case GenTestPragmaAttributeSupportedAttributes:
367 EmitTestPragmaAttributeSupportedAttributes(Records, OS);
375 int main(int argc, char **argv) {
376 sys::PrintStackTraceOnErrorSignal(argv[0]);
377 PrettyStackTraceProgram X(argc, argv);
378 cl::ParseCommandLineOptions(argc, argv);
382 return TableGenMain(argv[0], &ClangTableGenMain);
386 #if __has_feature(address_sanitizer)
387 #include <sanitizer/lsan_interface.h>
388 // Disable LeakSanitizer for this binary as it has too many leaks that are not
389 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
390 int __lsan_is_turned_off() { return 1; }
391 #endif // __has_feature(address_sanitizer)
392 #endif // defined(__has_feature)