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 "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"
21 
22 using namespace llvm;
23 using namespace clang;
24 
25 enum ActionType {
26   PrintRecords,
27   DumpJSON,
28   GenClangAttrClasses,
29   GenClangAttrParserStringSwitches,
30   GenClangAttrSubjectMatchRulesParserStringSwitches,
31   GenClangAttrImpl,
32   GenClangAttrList,
33   GenClangAttrDocTable,
34   GenClangAttrSubjectMatchRuleList,
35   GenClangAttrPCHRead,
36   GenClangAttrPCHWrite,
37   GenClangAttrHasAttributeImpl,
38   GenClangAttrSpellingListIndex,
39   GenClangAttrASTVisitor,
40   GenClangAttrTemplateInstantiate,
41   GenClangAttrParsedAttrList,
42   GenClangAttrParsedAttrImpl,
43   GenClangAttrParsedAttrKinds,
44   GenClangAttrTextNodeDump,
45   GenClangAttrNodeTraverse,
46   GenClangBasicReader,
47   GenClangBasicWriter,
48   GenClangDiagsDefs,
49   GenClangDiagGroups,
50   GenClangDiagsIndexName,
51   GenClangCommentNodes,
52   GenClangDeclNodes,
53   GenClangStmtNodes,
54   GenClangTypeNodes,
55   GenClangTypeReader,
56   GenClangTypeWriter,
57   GenClangOpcodes,
58   GenClangSACheckers,
59   GenClangSyntaxNodeList,
60   GenClangSyntaxNodeClasses,
61   GenClangCommentHTMLTags,
62   GenClangCommentHTMLTagsProperties,
63   GenClangCommentHTMLNamedCharacterReferences,
64   GenClangCommentCommandInfo,
65   GenClangCommentCommandList,
66   GenClangOpenCLBuiltins,
67   GenClangOpenCLBuiltinTests,
68   GenArmNeon,
69   GenArmFP16,
70   GenArmBF16,
71   GenArmNeonSema,
72   GenArmNeonTest,
73   GenArmMveHeader,
74   GenArmMveBuiltinDef,
75   GenArmMveBuiltinSema,
76   GenArmMveBuiltinCG,
77   GenArmMveBuiltinAliases,
78   GenArmSveHeader,
79   GenArmSveBuiltins,
80   GenArmSveBuiltinCG,
81   GenArmSveTypeFlags,
82   GenArmSveRangeChecks,
83   GenArmCdeHeader,
84   GenArmCdeBuiltinDef,
85   GenArmCdeBuiltinSema,
86   GenArmCdeBuiltinCG,
87   GenArmCdeBuiltinAliases,
88   GenRISCVVectorHeader,
89   GenRISCVVectorBuiltins,
90   GenRISCVVectorBuiltinCG,
91   GenRISCVVectorBuiltinSema,
92   GenAttrDocs,
93   GenDiagDocs,
94   GenOptDocs,
95   GenDataCollectors,
96   GenTestPragmaAttributeSupportedAttributes
97 };
98 
99 namespace {
100 cl::opt<ActionType> Action(
101     cl::desc("Action to perform:"),
102     cl::values(
103         clEnumValN(PrintRecords, "print-records",
104                    "Print all records to stdout (default)"),
105         clEnumValN(DumpJSON, "dump-json",
106                    "Dump all records as machine-readable JSON"),
107         clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
108                    "Generate clang attribute clases"),
109         clEnumValN(GenClangAttrParserStringSwitches,
110                    "gen-clang-attr-parser-string-switches",
111                    "Generate all parser-related attribute string switches"),
112         clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches,
113                    "gen-clang-attr-subject-match-rules-parser-string-switches",
114                    "Generate all parser-related attribute subject match rule"
115                    "string switches"),
116         clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
117                    "Generate clang attribute implementations"),
118         clEnumValN(GenClangAttrList, "gen-clang-attr-list",
119                    "Generate a clang attribute list"),
120         clEnumValN(GenClangAttrDocTable, "gen-clang-attr-doc-table",
121                    "Generate a table of attribute documentation"),
122         clEnumValN(GenClangAttrSubjectMatchRuleList,
123                    "gen-clang-attr-subject-match-rule-list",
124                    "Generate a clang attribute subject match rule list"),
125         clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
126                    "Generate clang PCH attribute reader"),
127         clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
128                    "Generate clang PCH attribute writer"),
129         clEnumValN(GenClangAttrHasAttributeImpl,
130                    "gen-clang-attr-has-attribute-impl",
131                    "Generate a clang attribute spelling list"),
132         clEnumValN(GenClangAttrSpellingListIndex,
133                    "gen-clang-attr-spelling-index",
134                    "Generate a clang attribute spelling index"),
135         clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor",
136                    "Generate a recursive AST visitor for clang attributes"),
137         clEnumValN(GenClangAttrTemplateInstantiate,
138                    "gen-clang-attr-template-instantiate",
139                    "Generate a clang template instantiate code"),
140         clEnumValN(GenClangAttrParsedAttrList,
141                    "gen-clang-attr-parsed-attr-list",
142                    "Generate a clang parsed attribute list"),
143         clEnumValN(GenClangAttrParsedAttrImpl,
144                    "gen-clang-attr-parsed-attr-impl",
145                    "Generate the clang parsed attribute helpers"),
146         clEnumValN(GenClangAttrParsedAttrKinds,
147                    "gen-clang-attr-parsed-attr-kinds",
148                    "Generate a clang parsed attribute kinds"),
149         clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump",
150                    "Generate clang attribute text node dumper"),
151         clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse",
152                    "Generate clang attribute traverser"),
153         clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
154                    "Generate Clang diagnostics definitions"),
155         clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
156                    "Generate Clang diagnostic groups"),
157         clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
158                    "Generate Clang diagnostic name index"),
159         clEnumValN(GenClangBasicReader, "gen-clang-basic-reader",
160                    "Generate Clang BasicReader classes"),
161         clEnumValN(GenClangBasicWriter, "gen-clang-basic-writer",
162                    "Generate Clang BasicWriter classes"),
163         clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
164                    "Generate Clang AST comment nodes"),
165         clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
166                    "Generate Clang AST declaration nodes"),
167         clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
168                    "Generate Clang AST statement nodes"),
169         clEnumValN(GenClangTypeNodes, "gen-clang-type-nodes",
170                    "Generate Clang AST type nodes"),
171         clEnumValN(GenClangTypeReader, "gen-clang-type-reader",
172                    "Generate Clang AbstractTypeReader class"),
173         clEnumValN(GenClangTypeWriter, "gen-clang-type-writer",
174                    "Generate Clang AbstractTypeWriter class"),
175         clEnumValN(GenClangOpcodes, "gen-clang-opcodes",
176                    "Generate Clang constexpr interpreter opcodes"),
177         clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
178                    "Generate Clang Static Analyzer checkers"),
179         clEnumValN(GenClangSyntaxNodeList, "gen-clang-syntax-node-list",
180                    "Generate list of Clang Syntax Tree node types"),
181         clEnumValN(GenClangSyntaxNodeClasses, "gen-clang-syntax-node-classes",
182                    "Generate definitions of Clang Syntax Tree node clasess"),
183         clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
184                    "Generate efficient matchers for HTML tag "
185                    "names that are used in documentation comments"),
186         clEnumValN(GenClangCommentHTMLTagsProperties,
187                    "gen-clang-comment-html-tags-properties",
188                    "Generate efficient matchers for HTML tag "
189                    "properties"),
190         clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
191                    "gen-clang-comment-html-named-character-references",
192                    "Generate function to translate named character "
193                    "references to UTF-8 sequences"),
194         clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
195                    "Generate command properties for commands that "
196                    "are used in documentation comments"),
197         clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
198                    "Generate list of commands that are used in "
199                    "documentation comments"),
200         clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins",
201                    "Generate OpenCL builtin declaration handlers"),
202         clEnumValN(GenClangOpenCLBuiltinTests, "gen-clang-opencl-builtin-tests",
203                    "Generate OpenCL builtin declaration tests"),
204         clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
205         clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"),
206         clEnumValN(GenArmBF16, "gen-arm-bf16", "Generate arm_bf16.h for clang"),
207         clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
208                    "Generate ARM NEON sema support for clang"),
209         clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
210                    "Generate ARM NEON tests for clang"),
211         clEnumValN(GenArmSveHeader, "gen-arm-sve-header",
212                    "Generate arm_sve.h for clang"),
213         clEnumValN(GenArmSveBuiltins, "gen-arm-sve-builtins",
214                    "Generate arm_sve_builtins.inc for clang"),
215         clEnumValN(GenArmSveBuiltinCG, "gen-arm-sve-builtin-codegen",
216                    "Generate arm_sve_builtin_cg_map.inc for clang"),
217         clEnumValN(GenArmSveTypeFlags, "gen-arm-sve-typeflags",
218                    "Generate arm_sve_typeflags.inc for clang"),
219         clEnumValN(GenArmSveRangeChecks, "gen-arm-sve-sema-rangechecks",
220                    "Generate arm_sve_sema_rangechecks.inc for clang"),
221         clEnumValN(GenArmMveHeader, "gen-arm-mve-header",
222                    "Generate arm_mve.h for clang"),
223         clEnumValN(GenArmMveBuiltinDef, "gen-arm-mve-builtin-def",
224                    "Generate ARM MVE builtin definitions for clang"),
225         clEnumValN(GenArmMveBuiltinSema, "gen-arm-mve-builtin-sema",
226                    "Generate ARM MVE builtin sema checks for clang"),
227         clEnumValN(GenArmMveBuiltinCG, "gen-arm-mve-builtin-codegen",
228                    "Generate ARM MVE builtin code-generator for clang"),
229         clEnumValN(GenArmMveBuiltinAliases, "gen-arm-mve-builtin-aliases",
230                    "Generate list of valid ARM MVE builtin aliases for clang"),
231         clEnumValN(GenArmCdeHeader, "gen-arm-cde-header",
232                    "Generate arm_cde.h for clang"),
233         clEnumValN(GenArmCdeBuiltinDef, "gen-arm-cde-builtin-def",
234                    "Generate ARM CDE builtin definitions for clang"),
235         clEnumValN(GenArmCdeBuiltinSema, "gen-arm-cde-builtin-sema",
236                    "Generate ARM CDE builtin sema checks for clang"),
237         clEnumValN(GenArmCdeBuiltinCG, "gen-arm-cde-builtin-codegen",
238                    "Generate ARM CDE builtin code-generator for clang"),
239         clEnumValN(GenArmCdeBuiltinAliases, "gen-arm-cde-builtin-aliases",
240                    "Generate list of valid ARM CDE builtin aliases for clang"),
241         clEnumValN(GenRISCVVectorHeader, "gen-riscv-vector-header",
242                    "Generate riscv_vector.h for clang"),
243         clEnumValN(GenRISCVVectorBuiltins, "gen-riscv-vector-builtins",
244                    "Generate riscv_vector_builtins.inc for clang"),
245         clEnumValN(GenRISCVVectorBuiltinCG, "gen-riscv-vector-builtin-codegen",
246                    "Generate riscv_vector_builtin_cg.inc for clang"),
247         clEnumValN(GenRISCVVectorBuiltinSema, "gen-riscv-vector-builtin-sema",
248                    "Generate riscv_vector_builtin_sema.inc for clang"),
249         clEnumValN(GenAttrDocs, "gen-attr-docs",
250                    "Generate attribute documentation"),
251         clEnumValN(GenDiagDocs, "gen-diag-docs",
252                    "Generate diagnostic documentation"),
253         clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"),
254         clEnumValN(GenDataCollectors, "gen-clang-data-collectors",
255                    "Generate data collectors for AST nodes"),
256         clEnumValN(GenTestPragmaAttributeSupportedAttributes,
257                    "gen-clang-test-pragma-attribute-supported-attributes",
258                    "Generate a list of attributes supported by #pragma clang "
259                    "attribute for testing purposes")));
260 
261 cl::opt<std::string>
262 ClangComponent("clang-component",
263                cl::desc("Only use warnings from specified component"),
264                cl::value_desc("component"), cl::Hidden);
265 
266 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
267   switch (Action) {
268   case PrintRecords:
269     OS << Records;           // No argument, dump all contents
270     break;
271   case DumpJSON:
272     EmitJSON(Records, OS);
273     break;
274   case GenClangAttrClasses:
275     EmitClangAttrClass(Records, OS);
276     break;
277   case GenClangAttrParserStringSwitches:
278     EmitClangAttrParserStringSwitches(Records, OS);
279     break;
280   case GenClangAttrSubjectMatchRulesParserStringSwitches:
281     EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS);
282     break;
283   case GenClangAttrImpl:
284     EmitClangAttrImpl(Records, OS);
285     break;
286   case GenClangAttrList:
287     EmitClangAttrList(Records, OS);
288     break;
289   case GenClangAttrDocTable:
290     EmitClangAttrDocTable(Records, OS);
291     break;
292   case GenClangAttrSubjectMatchRuleList:
293     EmitClangAttrSubjectMatchRuleList(Records, OS);
294     break;
295   case GenClangAttrPCHRead:
296     EmitClangAttrPCHRead(Records, OS);
297     break;
298   case GenClangAttrPCHWrite:
299     EmitClangAttrPCHWrite(Records, OS);
300     break;
301   case GenClangAttrHasAttributeImpl:
302     EmitClangAttrHasAttrImpl(Records, OS);
303     break;
304   case GenClangAttrSpellingListIndex:
305     EmitClangAttrSpellingListIndex(Records, OS);
306     break;
307   case GenClangAttrASTVisitor:
308     EmitClangAttrASTVisitor(Records, OS);
309     break;
310   case GenClangAttrTemplateInstantiate:
311     EmitClangAttrTemplateInstantiate(Records, OS);
312     break;
313   case GenClangAttrParsedAttrList:
314     EmitClangAttrParsedAttrList(Records, OS);
315     break;
316   case GenClangAttrParsedAttrImpl:
317     EmitClangAttrParsedAttrImpl(Records, OS);
318     break;
319   case GenClangAttrParsedAttrKinds:
320     EmitClangAttrParsedAttrKinds(Records, OS);
321     break;
322   case GenClangAttrTextNodeDump:
323     EmitClangAttrTextNodeDump(Records, OS);
324     break;
325   case GenClangAttrNodeTraverse:
326     EmitClangAttrNodeTraverse(Records, OS);
327     break;
328   case GenClangDiagsDefs:
329     EmitClangDiagsDefs(Records, OS, ClangComponent);
330     break;
331   case GenClangDiagGroups:
332     EmitClangDiagGroups(Records, OS);
333     break;
334   case GenClangDiagsIndexName:
335     EmitClangDiagsIndexName(Records, OS);
336     break;
337   case GenClangCommentNodes:
338     EmitClangASTNodes(Records, OS, CommentNodeClassName, "");
339     break;
340   case GenClangDeclNodes:
341     EmitClangASTNodes(Records, OS, DeclNodeClassName, "Decl");
342     EmitClangDeclContext(Records, OS);
343     break;
344   case GenClangStmtNodes:
345     EmitClangASTNodes(Records, OS, StmtNodeClassName, "");
346     break;
347   case GenClangTypeNodes:
348     EmitClangTypeNodes(Records, OS);
349     break;
350   case GenClangTypeReader:
351     EmitClangTypeReader(Records, OS);
352     break;
353   case GenClangTypeWriter:
354     EmitClangTypeWriter(Records, OS);
355     break;
356   case GenClangBasicReader:
357     EmitClangBasicReader(Records, OS);
358     break;
359   case GenClangBasicWriter:
360     EmitClangBasicWriter(Records, OS);
361     break;
362   case GenClangOpcodes:
363     EmitClangOpcodes(Records, OS);
364     break;
365   case GenClangSACheckers:
366     EmitClangSACheckers(Records, OS);
367     break;
368   case GenClangCommentHTMLTags:
369     EmitClangCommentHTMLTags(Records, OS);
370     break;
371   case GenClangCommentHTMLTagsProperties:
372     EmitClangCommentHTMLTagsProperties(Records, OS);
373     break;
374   case GenClangCommentHTMLNamedCharacterReferences:
375     EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
376     break;
377   case GenClangCommentCommandInfo:
378     EmitClangCommentCommandInfo(Records, OS);
379     break;
380   case GenClangCommentCommandList:
381     EmitClangCommentCommandList(Records, OS);
382     break;
383   case GenClangOpenCLBuiltins:
384     EmitClangOpenCLBuiltins(Records, OS);
385     break;
386   case GenClangOpenCLBuiltinTests:
387     EmitClangOpenCLBuiltinTests(Records, OS);
388     break;
389   case GenClangSyntaxNodeList:
390     EmitClangSyntaxNodeList(Records, OS);
391     break;
392   case GenClangSyntaxNodeClasses:
393     EmitClangSyntaxNodeClasses(Records, OS);
394     break;
395   case GenArmNeon:
396     EmitNeon(Records, OS);
397     break;
398   case GenArmFP16:
399     EmitFP16(Records, OS);
400     break;
401   case GenArmBF16:
402     EmitBF16(Records, OS);
403     break;
404   case GenArmNeonSema:
405     EmitNeonSema(Records, OS);
406     break;
407   case GenArmNeonTest:
408     EmitNeonTest(Records, OS);
409     break;
410   case GenArmMveHeader:
411     EmitMveHeader(Records, OS);
412     break;
413   case GenArmMveBuiltinDef:
414     EmitMveBuiltinDef(Records, OS);
415     break;
416   case GenArmMveBuiltinSema:
417     EmitMveBuiltinSema(Records, OS);
418     break;
419   case GenArmMveBuiltinCG:
420     EmitMveBuiltinCG(Records, OS);
421     break;
422   case GenArmMveBuiltinAliases:
423     EmitMveBuiltinAliases(Records, OS);
424     break;
425   case GenArmSveHeader:
426     EmitSveHeader(Records, OS);
427     break;
428   case GenArmSveBuiltins:
429     EmitSveBuiltins(Records, OS);
430     break;
431   case GenArmSveBuiltinCG:
432     EmitSveBuiltinCG(Records, OS);
433     break;
434   case GenArmSveTypeFlags:
435     EmitSveTypeFlags(Records, OS);
436     break;
437   case GenArmSveRangeChecks:
438     EmitSveRangeChecks(Records, OS);
439     break;
440   case GenArmCdeHeader:
441     EmitCdeHeader(Records, OS);
442     break;
443   case GenArmCdeBuiltinDef:
444     EmitCdeBuiltinDef(Records, OS);
445     break;
446   case GenArmCdeBuiltinSema:
447     EmitCdeBuiltinSema(Records, OS);
448     break;
449   case GenArmCdeBuiltinCG:
450     EmitCdeBuiltinCG(Records, OS);
451     break;
452   case GenArmCdeBuiltinAliases:
453     EmitCdeBuiltinAliases(Records, OS);
454     break;
455   case GenRISCVVectorHeader:
456     EmitRVVHeader(Records, OS);
457     break;
458   case GenRISCVVectorBuiltins:
459     EmitRVVBuiltins(Records, OS);
460     break;
461   case GenRISCVVectorBuiltinCG:
462     EmitRVVBuiltinCG(Records, OS);
463     break;
464   case GenRISCVVectorBuiltinSema:
465     EmitRVVBuiltinSema(Records, OS);
466     break;
467   case GenAttrDocs:
468     EmitClangAttrDocs(Records, OS);
469     break;
470   case GenDiagDocs:
471     EmitClangDiagDocs(Records, OS);
472     break;
473   case GenOptDocs:
474     EmitClangOptDocs(Records, OS);
475     break;
476   case GenDataCollectors:
477     EmitClangDataCollectors(Records, OS);
478     break;
479   case GenTestPragmaAttributeSupportedAttributes:
480     EmitTestPragmaAttributeSupportedAttributes(Records, OS);
481     break;
482   }
483 
484   return false;
485 }
486 }
487 
488 int main(int argc, char **argv) {
489   sys::PrintStackTraceOnErrorSignal(argv[0]);
490   PrettyStackTraceProgram X(argc, argv);
491   cl::ParseCommandLineOptions(argc, argv);
492 
493   llvm_shutdown_obj Y;
494 
495   return TableGenMain(argv[0], &ClangTableGenMain);
496 }
497 
498 #ifdef __has_feature
499 #if __has_feature(address_sanitizer)
500 #include <sanitizer/lsan_interface.h>
501 // Disable LeakSanitizer for this binary as it has too many leaks that are not
502 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
503 int __lsan_is_turned_off() { return 1; }
504 #endif  // __has_feature(address_sanitizer)
505 #endif  // defined(__has_feature)
506