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