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