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