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