xref: /aosp_15_r20/external/clang/utils/TableGen/TableGen.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file contains the main function for Clang's TableGen.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #include "TableGenBackends.h" // Declares all backends.
15*67e74705SXin Li #include "llvm/Support/CommandLine.h"
16*67e74705SXin Li #include "llvm/Support/ManagedStatic.h"
17*67e74705SXin Li #include "llvm/Support/PrettyStackTrace.h"
18*67e74705SXin Li #include "llvm/Support/Signals.h"
19*67e74705SXin Li #include "llvm/TableGen/Error.h"
20*67e74705SXin Li #include "llvm/TableGen/Main.h"
21*67e74705SXin Li #include "llvm/TableGen/Record.h"
22*67e74705SXin Li 
23*67e74705SXin Li using namespace llvm;
24*67e74705SXin Li using namespace clang;
25*67e74705SXin Li 
26*67e74705SXin Li enum ActionType {
27*67e74705SXin Li   GenClangAttrClasses,
28*67e74705SXin Li   GenClangAttrParserStringSwitches,
29*67e74705SXin Li   GenClangAttrImpl,
30*67e74705SXin Li   GenClangAttrList,
31*67e74705SXin Li   GenClangAttrPCHRead,
32*67e74705SXin Li   GenClangAttrPCHWrite,
33*67e74705SXin Li   GenClangAttrHasAttributeImpl,
34*67e74705SXin Li   GenClangAttrSpellingListIndex,
35*67e74705SXin Li   GenClangAttrASTVisitor,
36*67e74705SXin Li   GenClangAttrTemplateInstantiate,
37*67e74705SXin Li   GenClangAttrParsedAttrList,
38*67e74705SXin Li   GenClangAttrParsedAttrImpl,
39*67e74705SXin Li   GenClangAttrParsedAttrKinds,
40*67e74705SXin Li   GenClangAttrDump,
41*67e74705SXin Li   GenClangDiagsDefs,
42*67e74705SXin Li   GenClangDiagGroups,
43*67e74705SXin Li   GenClangDiagsIndexName,
44*67e74705SXin Li   GenClangCommentNodes,
45*67e74705SXin Li   GenClangDeclNodes,
46*67e74705SXin Li   GenClangStmtNodes,
47*67e74705SXin Li   GenClangSACheckers,
48*67e74705SXin Li   GenClangCommentHTMLTags,
49*67e74705SXin Li   GenClangCommentHTMLTagsProperties,
50*67e74705SXin Li   GenClangCommentHTMLNamedCharacterReferences,
51*67e74705SXin Li   GenClangCommentCommandInfo,
52*67e74705SXin Li   GenClangCommentCommandList,
53*67e74705SXin Li   GenArmNeon,
54*67e74705SXin Li   GenArmNeonSema,
55*67e74705SXin Li   GenArmNeonTest,
56*67e74705SXin Li   GenAttrDocs
57*67e74705SXin Li };
58*67e74705SXin Li 
59*67e74705SXin Li namespace {
60*67e74705SXin Li cl::opt<ActionType> Action(
61*67e74705SXin Li     cl::desc("Action to perform:"),
62*67e74705SXin Li     cl::values(
63*67e74705SXin Li         clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
64*67e74705SXin Li                    "Generate clang attribute clases"),
65*67e74705SXin Li         clEnumValN(GenClangAttrParserStringSwitches,
66*67e74705SXin Li                    "gen-clang-attr-parser-string-switches",
67*67e74705SXin Li                    "Generate all parser-related attribute string switches"),
68*67e74705SXin Li         clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
69*67e74705SXin Li                    "Generate clang attribute implementations"),
70*67e74705SXin Li         clEnumValN(GenClangAttrList, "gen-clang-attr-list",
71*67e74705SXin Li                    "Generate a clang attribute list"),
72*67e74705SXin Li         clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
73*67e74705SXin Li                    "Generate clang PCH attribute reader"),
74*67e74705SXin Li         clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
75*67e74705SXin Li                    "Generate clang PCH attribute writer"),
76*67e74705SXin Li         clEnumValN(GenClangAttrHasAttributeImpl,
77*67e74705SXin Li                    "gen-clang-attr-has-attribute-impl",
78*67e74705SXin Li                    "Generate a clang attribute spelling list"),
79*67e74705SXin Li         clEnumValN(GenClangAttrSpellingListIndex,
80*67e74705SXin Li                    "gen-clang-attr-spelling-index",
81*67e74705SXin Li                    "Generate a clang attribute spelling index"),
82*67e74705SXin Li         clEnumValN(GenClangAttrASTVisitor,
83*67e74705SXin Li                    "gen-clang-attr-ast-visitor",
84*67e74705SXin Li                    "Generate a recursive AST visitor for clang attributes"),
85*67e74705SXin Li         clEnumValN(GenClangAttrTemplateInstantiate,
86*67e74705SXin Li                    "gen-clang-attr-template-instantiate",
87*67e74705SXin Li                    "Generate a clang template instantiate code"),
88*67e74705SXin Li         clEnumValN(GenClangAttrParsedAttrList,
89*67e74705SXin Li                    "gen-clang-attr-parsed-attr-list",
90*67e74705SXin Li                    "Generate a clang parsed attribute list"),
91*67e74705SXin Li         clEnumValN(GenClangAttrParsedAttrImpl,
92*67e74705SXin Li                    "gen-clang-attr-parsed-attr-impl",
93*67e74705SXin Li                    "Generate the clang parsed attribute helpers"),
94*67e74705SXin Li         clEnumValN(GenClangAttrParsedAttrKinds,
95*67e74705SXin Li                    "gen-clang-attr-parsed-attr-kinds",
96*67e74705SXin Li                    "Generate a clang parsed attribute kinds"),
97*67e74705SXin Li         clEnumValN(GenClangAttrDump, "gen-clang-attr-dump",
98*67e74705SXin Li                    "Generate clang attribute dumper"),
99*67e74705SXin Li         clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
100*67e74705SXin Li                    "Generate Clang diagnostics definitions"),
101*67e74705SXin Li         clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
102*67e74705SXin Li                    "Generate Clang diagnostic groups"),
103*67e74705SXin Li         clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
104*67e74705SXin Li                    "Generate Clang diagnostic name index"),
105*67e74705SXin Li         clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
106*67e74705SXin Li                    "Generate Clang AST comment nodes"),
107*67e74705SXin Li         clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
108*67e74705SXin Li                    "Generate Clang AST declaration nodes"),
109*67e74705SXin Li         clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
110*67e74705SXin Li                    "Generate Clang AST statement nodes"),
111*67e74705SXin Li         clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
112*67e74705SXin Li                    "Generate Clang Static Analyzer checkers"),
113*67e74705SXin Li         clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
114*67e74705SXin Li                    "Generate efficient matchers for HTML tag "
115*67e74705SXin Li                    "names that are used in documentation comments"),
116*67e74705SXin Li         clEnumValN(GenClangCommentHTMLTagsProperties,
117*67e74705SXin Li                    "gen-clang-comment-html-tags-properties",
118*67e74705SXin Li                    "Generate efficient matchers for HTML tag "
119*67e74705SXin Li                    "properties"),
120*67e74705SXin Li         clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
121*67e74705SXin Li                    "gen-clang-comment-html-named-character-references",
122*67e74705SXin Li                    "Generate function to translate named character "
123*67e74705SXin Li                    "references to UTF-8 sequences"),
124*67e74705SXin Li         clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
125*67e74705SXin Li                    "Generate command properties for commands that "
126*67e74705SXin Li                    "are used in documentation comments"),
127*67e74705SXin Li         clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
128*67e74705SXin Li                    "Generate list of commands that are used in "
129*67e74705SXin Li                    "documentation comments"),
130*67e74705SXin Li         clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
131*67e74705SXin Li         clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
132*67e74705SXin Li                    "Generate ARM NEON sema support for clang"),
133*67e74705SXin Li         clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
134*67e74705SXin Li                    "Generate ARM NEON tests for clang"),
135*67e74705SXin Li         clEnumValN(GenAttrDocs, "gen-attr-docs",
136*67e74705SXin Li                    "Generate attribute documentation"),
137*67e74705SXin Li         clEnumValEnd));
138*67e74705SXin Li 
139*67e74705SXin Li cl::opt<std::string>
140*67e74705SXin Li ClangComponent("clang-component",
141*67e74705SXin Li                cl::desc("Only use warnings from specified component"),
142*67e74705SXin Li                cl::value_desc("component"), cl::Hidden);
143*67e74705SXin Li 
ClangTableGenMain(raw_ostream & OS,RecordKeeper & Records)144*67e74705SXin Li bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
145*67e74705SXin Li   switch (Action) {
146*67e74705SXin Li   case GenClangAttrClasses:
147*67e74705SXin Li     EmitClangAttrClass(Records, OS);
148*67e74705SXin Li     break;
149*67e74705SXin Li   case GenClangAttrParserStringSwitches:
150*67e74705SXin Li     EmitClangAttrParserStringSwitches(Records, OS);
151*67e74705SXin Li     break;
152*67e74705SXin Li   case GenClangAttrImpl:
153*67e74705SXin Li     EmitClangAttrImpl(Records, OS);
154*67e74705SXin Li     break;
155*67e74705SXin Li   case GenClangAttrList:
156*67e74705SXin Li     EmitClangAttrList(Records, OS);
157*67e74705SXin Li     break;
158*67e74705SXin Li   case GenClangAttrPCHRead:
159*67e74705SXin Li     EmitClangAttrPCHRead(Records, OS);
160*67e74705SXin Li     break;
161*67e74705SXin Li   case GenClangAttrPCHWrite:
162*67e74705SXin Li     EmitClangAttrPCHWrite(Records, OS);
163*67e74705SXin Li     break;
164*67e74705SXin Li   case GenClangAttrHasAttributeImpl:
165*67e74705SXin Li     EmitClangAttrHasAttrImpl(Records, OS);
166*67e74705SXin Li     break;
167*67e74705SXin Li   case GenClangAttrSpellingListIndex:
168*67e74705SXin Li     EmitClangAttrSpellingListIndex(Records, OS);
169*67e74705SXin Li     break;
170*67e74705SXin Li   case GenClangAttrASTVisitor:
171*67e74705SXin Li     EmitClangAttrASTVisitor(Records, OS);
172*67e74705SXin Li     break;
173*67e74705SXin Li   case GenClangAttrTemplateInstantiate:
174*67e74705SXin Li     EmitClangAttrTemplateInstantiate(Records, OS);
175*67e74705SXin Li     break;
176*67e74705SXin Li   case GenClangAttrParsedAttrList:
177*67e74705SXin Li     EmitClangAttrParsedAttrList(Records, OS);
178*67e74705SXin Li     break;
179*67e74705SXin Li   case GenClangAttrParsedAttrImpl:
180*67e74705SXin Li     EmitClangAttrParsedAttrImpl(Records, OS);
181*67e74705SXin Li     break;
182*67e74705SXin Li   case GenClangAttrParsedAttrKinds:
183*67e74705SXin Li     EmitClangAttrParsedAttrKinds(Records, OS);
184*67e74705SXin Li     break;
185*67e74705SXin Li   case GenClangAttrDump:
186*67e74705SXin Li     EmitClangAttrDump(Records, OS);
187*67e74705SXin Li     break;
188*67e74705SXin Li   case GenClangDiagsDefs:
189*67e74705SXin Li     EmitClangDiagsDefs(Records, OS, ClangComponent);
190*67e74705SXin Li     break;
191*67e74705SXin Li   case GenClangDiagGroups:
192*67e74705SXin Li     EmitClangDiagGroups(Records, OS);
193*67e74705SXin Li     break;
194*67e74705SXin Li   case GenClangDiagsIndexName:
195*67e74705SXin Li     EmitClangDiagsIndexName(Records, OS);
196*67e74705SXin Li     break;
197*67e74705SXin Li   case GenClangCommentNodes:
198*67e74705SXin Li     EmitClangASTNodes(Records, OS, "Comment", "");
199*67e74705SXin Li     break;
200*67e74705SXin Li   case GenClangDeclNodes:
201*67e74705SXin Li     EmitClangASTNodes(Records, OS, "Decl", "Decl");
202*67e74705SXin Li     EmitClangDeclContext(Records, OS);
203*67e74705SXin Li     break;
204*67e74705SXin Li   case GenClangStmtNodes:
205*67e74705SXin Li     EmitClangASTNodes(Records, OS, "Stmt", "");
206*67e74705SXin Li     break;
207*67e74705SXin Li   case GenClangSACheckers:
208*67e74705SXin Li     EmitClangSACheckers(Records, OS);
209*67e74705SXin Li     break;
210*67e74705SXin Li   case GenClangCommentHTMLTags:
211*67e74705SXin Li     EmitClangCommentHTMLTags(Records, OS);
212*67e74705SXin Li     break;
213*67e74705SXin Li   case GenClangCommentHTMLTagsProperties:
214*67e74705SXin Li     EmitClangCommentHTMLTagsProperties(Records, OS);
215*67e74705SXin Li     break;
216*67e74705SXin Li   case GenClangCommentHTMLNamedCharacterReferences:
217*67e74705SXin Li     EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
218*67e74705SXin Li     break;
219*67e74705SXin Li   case GenClangCommentCommandInfo:
220*67e74705SXin Li     EmitClangCommentCommandInfo(Records, OS);
221*67e74705SXin Li     break;
222*67e74705SXin Li   case GenClangCommentCommandList:
223*67e74705SXin Li     EmitClangCommentCommandList(Records, OS);
224*67e74705SXin Li     break;
225*67e74705SXin Li   case GenArmNeon:
226*67e74705SXin Li     EmitNeon(Records, OS);
227*67e74705SXin Li     break;
228*67e74705SXin Li   case GenArmNeonSema:
229*67e74705SXin Li     EmitNeonSema(Records, OS);
230*67e74705SXin Li     break;
231*67e74705SXin Li   case GenArmNeonTest:
232*67e74705SXin Li     EmitNeonTest(Records, OS);
233*67e74705SXin Li     break;
234*67e74705SXin Li   case GenAttrDocs:
235*67e74705SXin Li     EmitClangAttrDocs(Records, OS);
236*67e74705SXin Li     break;
237*67e74705SXin Li   }
238*67e74705SXin Li 
239*67e74705SXin Li   return false;
240*67e74705SXin Li }
241*67e74705SXin Li }
242*67e74705SXin Li 
main(int argc,char ** argv)243*67e74705SXin Li int main(int argc, char **argv) {
244*67e74705SXin Li   sys::PrintStackTraceOnErrorSignal(argv[0]);
245*67e74705SXin Li   PrettyStackTraceProgram X(argc, argv);
246*67e74705SXin Li   cl::ParseCommandLineOptions(argc, argv);
247*67e74705SXin Li 
248*67e74705SXin Li   llvm_shutdown_obj Y;
249*67e74705SXin Li 
250*67e74705SXin Li   return TableGenMain(argv[0], &ClangTableGenMain);
251*67e74705SXin Li }
252*67e74705SXin Li 
253*67e74705SXin Li #ifdef __has_feature
254*67e74705SXin Li #if __has_feature(address_sanitizer)
255*67e74705SXin Li #include <sanitizer/lsan_interface.h>
256*67e74705SXin Li // Disable LeakSanitizer for this binary as it has too many leaks that are not
257*67e74705SXin Li // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
__lsan_is_turned_off()258*67e74705SXin Li int __lsan_is_turned_off() { return 1; }
259*67e74705SXin Li #endif  // __has_feature(address_sanitizer)
260*67e74705SXin Li #endif  // defined(__has_feature)
261