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