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 "llvm/Support/CommandLine.h"
15 #include "llvm/Support/PrettyStackTrace.h"
16 #include "llvm/Support/Signals.h"
17 #include "llvm/TableGen/Error.h"
18 #include "llvm/TableGen/Main.h"
19 #include "llvm/TableGen/Record.h"
20 
21 using namespace llvm;
22 using namespace clang;
23 
24 enum ActionType {
25   PrintRecords,
26   DumpJSON,
27   GenClangAttrClasses,
28   GenClangAttrParserStringSwitches,
29   GenClangAttrSubjectMatchRulesParserStringSwitches,
30   GenClangAttrImpl,
31   GenClangAttrList,
32   GenClangAttrSubjectMatchRuleList,
33   GenClangAttrPCHRead,
34   GenClangAttrPCHWrite,
35   GenClangAttrHasAttributeImpl,
36   GenClangAttrSpellingListIndex,
37   GenClangAttrASTVisitor,
38   GenClangAttrTemplateInstantiate,
39   GenClangAttrParsedAttrList,
40   GenClangAttrParsedAttrImpl,
41   GenClangAttrParsedAttrKinds,
42   GenClangAttrTextNodeDump,
43   GenClangAttrNodeTraverse,
44   GenClangDiagsDefs,
45   GenClangDiagGroups,
46   GenClangDiagsIndexName,
47   GenClangCommentNodes,
48   GenClangDeclNodes,
49   GenClangStmtNodes,
50   GenClangSACheckers,
51   GenClangCommentHTMLTags,
52   GenClangCommentHTMLTagsProperties,
53   GenClangCommentHTMLNamedCharacterReferences,
54   GenClangCommentCommandInfo,
55   GenClangCommentCommandList,
56   GenArmNeon,
57   GenArmFP16,
58   GenArmNeonSema,
59   GenArmNeonTest,
60   GenAttrDocs,
61   GenDiagDocs,
62   GenOptDocs,
63   GenDataCollectors,
64   GenTestPragmaAttributeSupportedAttributes
65 };
66 
67 namespace {
68 cl::opt<ActionType> Action(
69     cl::desc("Action to perform:"),
70     cl::values(
71         clEnumValN(PrintRecords, "print-records",
72                    "Print all records to stdout (default)"),
73         clEnumValN(DumpJSON, "dump-json",
74                    "Dump all records as machine-readable JSON"),
75         clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
76                    "Generate clang attribute clases"),
77         clEnumValN(GenClangAttrParserStringSwitches,
78                    "gen-clang-attr-parser-string-switches",
79                    "Generate all parser-related attribute string switches"),
80         clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches,
81                    "gen-clang-attr-subject-match-rules-parser-string-switches",
82                    "Generate all parser-related attribute subject match rule"
83                    "string switches"),
84         clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
85                    "Generate clang attribute implementations"),
86         clEnumValN(GenClangAttrList, "gen-clang-attr-list",
87                    "Generate a clang attribute list"),
88         clEnumValN(GenClangAttrSubjectMatchRuleList,
89                    "gen-clang-attr-subject-match-rule-list",
90                    "Generate a clang attribute subject match rule list"),
91         clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
92                    "Generate clang PCH attribute reader"),
93         clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
94                    "Generate clang PCH attribute writer"),
95         clEnumValN(GenClangAttrHasAttributeImpl,
96                    "gen-clang-attr-has-attribute-impl",
97                    "Generate a clang attribute spelling list"),
98         clEnumValN(GenClangAttrSpellingListIndex,
99                    "gen-clang-attr-spelling-index",
100                    "Generate a clang attribute spelling index"),
101         clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor",
102                    "Generate a recursive AST visitor for clang attributes"),
103         clEnumValN(GenClangAttrTemplateInstantiate,
104                    "gen-clang-attr-template-instantiate",
105                    "Generate a clang template instantiate code"),
106         clEnumValN(GenClangAttrParsedAttrList,
107                    "gen-clang-attr-parsed-attr-list",
108                    "Generate a clang parsed attribute list"),
109         clEnumValN(GenClangAttrParsedAttrImpl,
110                    "gen-clang-attr-parsed-attr-impl",
111                    "Generate the clang parsed attribute helpers"),
112         clEnumValN(GenClangAttrParsedAttrKinds,
113                    "gen-clang-attr-parsed-attr-kinds",
114                    "Generate a clang parsed attribute kinds"),
115         clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump",
116                    "Generate clang attribute text node dumper"),
117         clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse",
118                    "Generate clang attribute traverser"),
119         clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
120                    "Generate Clang diagnostics definitions"),
121         clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
122                    "Generate Clang diagnostic groups"),
123         clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
124                    "Generate Clang diagnostic name index"),
125         clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
126                    "Generate Clang AST comment nodes"),
127         clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
128                    "Generate Clang AST declaration nodes"),
129         clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
130                    "Generate Clang AST statement nodes"),
131         clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
132                    "Generate Clang Static Analyzer checkers"),
133         clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
134                    "Generate efficient matchers for HTML tag "
135                    "names that are used in documentation comments"),
136         clEnumValN(GenClangCommentHTMLTagsProperties,
137                    "gen-clang-comment-html-tags-properties",
138                    "Generate efficient matchers for HTML tag "
139                    "properties"),
140         clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
141                    "gen-clang-comment-html-named-character-references",
142                    "Generate function to translate named character "
143                    "references to UTF-8 sequences"),
144         clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
145                    "Generate command properties for commands that "
146                    "are used in documentation comments"),
147         clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
148                    "Generate list of commands that are used in "
149                    "documentation comments"),
150         clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
151         clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"),
152         clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
153                    "Generate ARM NEON sema support for clang"),
154         clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
155                    "Generate ARM NEON tests for clang"),
156         clEnumValN(GenAttrDocs, "gen-attr-docs",
157                    "Generate attribute documentation"),
158         clEnumValN(GenDiagDocs, "gen-diag-docs",
159                    "Generate diagnostic documentation"),
160         clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"),
161         clEnumValN(GenDataCollectors, "gen-clang-data-collectors",
162                    "Generate data collectors for AST nodes"),
163         clEnumValN(GenTestPragmaAttributeSupportedAttributes,
164                    "gen-clang-test-pragma-attribute-supported-attributes",
165                    "Generate a list of attributes supported by #pragma clang "
166                    "attribute for testing purposes")));
167 
168 cl::opt<std::string>
169 ClangComponent("clang-component",
170                cl::desc("Only use warnings from specified component"),
171                cl::value_desc("component"), cl::Hidden);
172 
173 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
174   switch (Action) {
175   case PrintRecords:
176     OS << Records;           // No argument, dump all contents
177     break;
178   case DumpJSON:
179     EmitJSON(Records, OS);
180     break;
181   case GenClangAttrClasses:
182     EmitClangAttrClass(Records, OS);
183     break;
184   case GenClangAttrParserStringSwitches:
185     EmitClangAttrParserStringSwitches(Records, OS);
186     break;
187   case GenClangAttrSubjectMatchRulesParserStringSwitches:
188     EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS);
189     break;
190   case GenClangAttrImpl:
191     EmitClangAttrImpl(Records, OS);
192     break;
193   case GenClangAttrList:
194     EmitClangAttrList(Records, OS);
195     break;
196   case GenClangAttrSubjectMatchRuleList:
197     EmitClangAttrSubjectMatchRuleList(Records, OS);
198     break;
199   case GenClangAttrPCHRead:
200     EmitClangAttrPCHRead(Records, OS);
201     break;
202   case GenClangAttrPCHWrite:
203     EmitClangAttrPCHWrite(Records, OS);
204     break;
205   case GenClangAttrHasAttributeImpl:
206     EmitClangAttrHasAttrImpl(Records, OS);
207     break;
208   case GenClangAttrSpellingListIndex:
209     EmitClangAttrSpellingListIndex(Records, OS);
210     break;
211   case GenClangAttrASTVisitor:
212     EmitClangAttrASTVisitor(Records, OS);
213     break;
214   case GenClangAttrTemplateInstantiate:
215     EmitClangAttrTemplateInstantiate(Records, OS);
216     break;
217   case GenClangAttrParsedAttrList:
218     EmitClangAttrParsedAttrList(Records, OS);
219     break;
220   case GenClangAttrParsedAttrImpl:
221     EmitClangAttrParsedAttrImpl(Records, OS);
222     break;
223   case GenClangAttrParsedAttrKinds:
224     EmitClangAttrParsedAttrKinds(Records, OS);
225     break;
226   case GenClangAttrTextNodeDump:
227     EmitClangAttrTextNodeDump(Records, OS);
228     break;
229   case GenClangAttrNodeTraverse:
230     EmitClangAttrNodeTraverse(Records, OS);
231     break;
232   case GenClangDiagsDefs:
233     EmitClangDiagsDefs(Records, OS, ClangComponent);
234     break;
235   case GenClangDiagGroups:
236     EmitClangDiagGroups(Records, OS);
237     break;
238   case GenClangDiagsIndexName:
239     EmitClangDiagsIndexName(Records, OS);
240     break;
241   case GenClangCommentNodes:
242     EmitClangASTNodes(Records, OS, "Comment", "");
243     break;
244   case GenClangDeclNodes:
245     EmitClangASTNodes(Records, OS, "Decl", "Decl");
246     EmitClangDeclContext(Records, OS);
247     break;
248   case GenClangStmtNodes:
249     EmitClangASTNodes(Records, OS, "Stmt", "");
250     break;
251   case GenClangSACheckers:
252     EmitClangSACheckers(Records, OS);
253     break;
254   case GenClangCommentHTMLTags:
255     EmitClangCommentHTMLTags(Records, OS);
256     break;
257   case GenClangCommentHTMLTagsProperties:
258     EmitClangCommentHTMLTagsProperties(Records, OS);
259     break;
260   case GenClangCommentHTMLNamedCharacterReferences:
261     EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
262     break;
263   case GenClangCommentCommandInfo:
264     EmitClangCommentCommandInfo(Records, OS);
265     break;
266   case GenClangCommentCommandList:
267     EmitClangCommentCommandList(Records, OS);
268     break;
269   case GenArmNeon:
270     EmitNeon(Records, OS);
271     break;
272   case GenArmFP16:
273     EmitFP16(Records, OS);
274     break;
275   case GenArmNeonSema:
276     EmitNeonSema(Records, OS);
277     break;
278   case GenArmNeonTest:
279     EmitNeonTest(Records, OS);
280     break;
281   case GenAttrDocs:
282     EmitClangAttrDocs(Records, OS);
283     break;
284   case GenDiagDocs:
285     EmitClangDiagDocs(Records, OS);
286     break;
287   case GenOptDocs:
288     EmitClangOptDocs(Records, OS);
289     break;
290   case GenDataCollectors:
291     EmitClangDataCollectors(Records, OS);
292     break;
293   case GenTestPragmaAttributeSupportedAttributes:
294     EmitTestPragmaAttributeSupportedAttributes(Records, OS);
295     break;
296   }
297 
298   return false;
299 }
300 }
301 
302 int main(int argc, char **argv) {
303   sys::PrintStackTraceOnErrorSignal(argv[0]);
304   PrettyStackTraceProgram X(argc, argv);
305   cl::ParseCommandLineOptions(argc, argv);
306 
307   llvm_shutdown_obj Y;
308 
309   return TableGenMain(argv[0], &ClangTableGenMain);
310 }
311 
312 #ifdef __has_feature
313 #if __has_feature(address_sanitizer)
314 #include <sanitizer/lsan_interface.h>
315 // Disable LeakSanitizer for this binary as it has too many leaks that are not
316 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
317 int __lsan_is_turned_off() { return 1; }
318 #endif  // __has_feature(address_sanitizer)
319 #endif  // defined(__has_feature)
320