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