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