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