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