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