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