1204076Spjd//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
2204076Spjd//
3204076Spjd//                     The LLVM Compiler Infrastructure
4204076Spjd//
5204076Spjd// This file is distributed under the University of Illinois Open Source
6204076Spjd// License. See LICENSE.TXT for details.
7204076Spjd//
8204076Spjd//===----------------------------------------------------------------------===//
9204076Spjd//
10204076Spjd// This file contains the main function for Clang's TableGen.
11204076Spjd//
12204076Spjd//===----------------------------------------------------------------------===//
13204076Spjd
14204076Spjd#include "TableGenBackends.h" // Declares all backends.
15204076Spjd#include "llvm/Support/CommandLine.h"
16204076Spjd#include "llvm/Support/ManagedStatic.h"
17204076Spjd#include "llvm/Support/PrettyStackTrace.h"
18204076Spjd#include "llvm/Support/Signals.h"
19204076Spjd#include "llvm/TableGen/Error.h"
20204076Spjd#include "llvm/TableGen/Main.h"
21204076Spjd#include "llvm/TableGen/Record.h"
22204076Spjd
23204076Spjdusing namespace llvm;
24204076Spjdusing namespace clang;
25204076Spjd
26204076Spjdenum ActionType {
27204076Spjd  GenClangAttrClasses,
28204076Spjd  GenClangAttrParserStringSwitches,
29204076Spjd  GenClangAttrImpl,
30204076Spjd  GenClangAttrList,
31204076Spjd  GenClangAttrPCHRead,
32204076Spjd  GenClangAttrPCHWrite,
33204076Spjd  GenClangAttrHasAttributeImpl,
34204076Spjd  GenClangAttrSpellingListIndex,
35204076Spjd  GenClangAttrASTVisitor,
36204076Spjd  GenClangAttrTemplateInstantiate,
37204076Spjd  GenClangAttrParsedAttrList,
38204076Spjd  GenClangAttrParsedAttrImpl,
39225787Spjd  GenClangAttrParsedAttrKinds,
40225787Spjd  GenClangAttrDump,
41204076Spjd  GenClangDiagsDefs,
42204076Spjd  GenClangDiagGroups,
43225787Spjd  GenClangDiagsIndexName,
44225787Spjd  GenClangCommentNodes,
45225787Spjd  GenClangDeclNodes,
46225787Spjd  GenClangStmtNodes,
47225787Spjd  GenClangSACheckers,
48204076Spjd  GenClangCommentHTMLTags,
49204076Spjd  GenClangCommentHTMLTagsProperties,
50204076Spjd  GenClangCommentHTMLNamedCharacterReferences,
51204076Spjd  GenClangCommentCommandInfo,
52204076Spjd  GenClangCommentCommandList,
53204076Spjd  GenArmNeon,
54204076Spjd  GenArmNeonSema,
55204076Spjd  GenArmNeonTest,
56204076Spjd  GenAttrDocs
57204076Spjd};
58204076Spjd
59204076Spjdnamespace {
60204076Spjdcl::opt<ActionType> Action(
61204076Spjd    cl::desc("Action to perform:"),
62204076Spjd    cl::values(
63204076Spjd        clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
64204076Spjd                   "Generate clang attribute clases"),
65225787Spjd        clEnumValN(GenClangAttrParserStringSwitches,
66204076Spjd                   "gen-clang-attr-parser-string-switches",
67204076Spjd                   "Generate all parser-related attribute string switches"),
68204076Spjd        clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
69204076Spjd                   "Generate clang attribute implementations"),
70204076Spjd        clEnumValN(GenClangAttrList, "gen-clang-attr-list",
71204076Spjd                   "Generate a clang attribute list"),
72204076Spjd        clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
73204076Spjd                   "Generate clang PCH attribute reader"),
74204076Spjd        clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
75204076Spjd                   "Generate clang PCH attribute writer"),
76204076Spjd        clEnumValN(GenClangAttrHasAttributeImpl,
77204076Spjd                   "gen-clang-attr-has-attribute-impl",
78204076Spjd                   "Generate a clang attribute spelling list"),
79204076Spjd        clEnumValN(GenClangAttrSpellingListIndex,
80204076Spjd                   "gen-clang-attr-spelling-index",
81204076Spjd                   "Generate a clang attribute spelling index"),
82204076Spjd        clEnumValN(GenClangAttrASTVisitor,
83204076Spjd                   "gen-clang-attr-ast-visitor",
84225787Spjd                   "Generate a recursive AST visitor for clang attributes"),
85204076Spjd        clEnumValN(GenClangAttrTemplateInstantiate,
86204076Spjd                   "gen-clang-attr-template-instantiate",
87204076Spjd                   "Generate a clang template instantiate code"),
88204076Spjd        clEnumValN(GenClangAttrParsedAttrList,
89204076Spjd                   "gen-clang-attr-parsed-attr-list",
90204076Spjd                   "Generate a clang parsed attribute list"),
91204076Spjd        clEnumValN(GenClangAttrParsedAttrImpl,
92204076Spjd                   "gen-clang-attr-parsed-attr-impl",
93204076Spjd                   "Generate the clang parsed attribute helpers"),
94204076Spjd        clEnumValN(GenClangAttrParsedAttrKinds,
95204076Spjd                   "gen-clang-attr-parsed-attr-kinds",
96204076Spjd                   "Generate a clang parsed attribute kinds"),
97204076Spjd        clEnumValN(GenClangAttrDump, "gen-clang-attr-dump",
98204076Spjd                   "Generate clang attribute dumper"),
99204076Spjd        clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
100225787Spjd                   "Generate Clang diagnostics definitions"),
101204076Spjd        clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
102204076Spjd                   "Generate Clang diagnostic groups"),
103204076Spjd        clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
104204076Spjd                   "Generate Clang diagnostic name index"),
105204076Spjd        clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
106204076Spjd                   "Generate Clang AST comment nodes"),
107204076Spjd        clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
108204076Spjd                   "Generate Clang AST declaration nodes"),
109204076Spjd        clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
110204076Spjd                   "Generate Clang AST statement nodes"),
111204076Spjd        clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
112204076Spjd                   "Generate Clang Static Analyzer checkers"),
113204076Spjd        clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
114204076Spjd                   "Generate efficient matchers for HTML tag "
115204076Spjd                   "names that are used in documentation comments"),
116225787Spjd        clEnumValN(GenClangCommentHTMLTagsProperties,
117204076Spjd                   "gen-clang-comment-html-tags-properties",
118204076Spjd                   "Generate efficient matchers for HTML tag "
119204076Spjd                   "properties"),
120204076Spjd        clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
121204076Spjd                   "gen-clang-comment-html-named-character-references",
122225787Spjd                   "Generate function to translate named character "
123204076Spjd                   "references to UTF-8 sequences"),
124204076Spjd        clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
125204076Spjd                   "Generate command properties for commands that "
126204076Spjd                   "are used in documentation comments"),
127204076Spjd        clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
128204076Spjd                   "Generate list of commands that are used in "
129204076Spjd                   "documentation comments"),
130204076Spjd        clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
131204076Spjd        clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
132225787Spjd                   "Generate ARM NEON sema support for clang"),
133204076Spjd        clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
134204076Spjd                   "Generate ARM NEON tests for clang"),
135204076Spjd        clEnumValN(GenAttrDocs, "gen-attr-docs",
136204076Spjd                   "Generate attribute documentation"),
137204076Spjd        clEnumValEnd));
138204076Spjd
139204076Spjdcl::opt<std::string>
140204076SpjdClangComponent("clang-component",
141204076Spjd               cl::desc("Only use warnings from specified component"),
142204076Spjd               cl::value_desc("component"), cl::Hidden);
143204076Spjd
144bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
145  switch (Action) {
146  case GenClangAttrClasses:
147    EmitClangAttrClass(Records, OS);
148    break;
149  case GenClangAttrParserStringSwitches:
150    EmitClangAttrParserStringSwitches(Records, OS);
151    break;
152  case GenClangAttrImpl:
153    EmitClangAttrImpl(Records, OS);
154    break;
155  case GenClangAttrList:
156    EmitClangAttrList(Records, OS);
157    break;
158  case GenClangAttrPCHRead:
159    EmitClangAttrPCHRead(Records, OS);
160    break;
161  case GenClangAttrPCHWrite:
162    EmitClangAttrPCHWrite(Records, OS);
163    break;
164  case GenClangAttrHasAttributeImpl:
165    EmitClangAttrHasAttrImpl(Records, OS);
166    break;
167  case GenClangAttrSpellingListIndex:
168    EmitClangAttrSpellingListIndex(Records, OS);
169    break;
170  case GenClangAttrASTVisitor:
171    EmitClangAttrASTVisitor(Records, OS);
172    break;
173  case GenClangAttrTemplateInstantiate:
174    EmitClangAttrTemplateInstantiate(Records, OS);
175    break;
176  case GenClangAttrParsedAttrList:
177    EmitClangAttrParsedAttrList(Records, OS);
178    break;
179  case GenClangAttrParsedAttrImpl:
180    EmitClangAttrParsedAttrImpl(Records, OS);
181    break;
182  case GenClangAttrParsedAttrKinds:
183    EmitClangAttrParsedAttrKinds(Records, OS);
184    break;
185  case GenClangAttrDump:
186    EmitClangAttrDump(Records, OS);
187    break;
188  case GenClangDiagsDefs:
189    EmitClangDiagsDefs(Records, OS, ClangComponent);
190    break;
191  case GenClangDiagGroups:
192    EmitClangDiagGroups(Records, OS);
193    break;
194  case GenClangDiagsIndexName:
195    EmitClangDiagsIndexName(Records, OS);
196    break;
197  case GenClangCommentNodes:
198    EmitClangASTNodes(Records, OS, "Comment", "");
199    break;
200  case GenClangDeclNodes:
201    EmitClangASTNodes(Records, OS, "Decl", "Decl");
202    EmitClangDeclContext(Records, OS);
203    break;
204  case GenClangStmtNodes:
205    EmitClangASTNodes(Records, OS, "Stmt", "");
206    break;
207  case GenClangSACheckers:
208    EmitClangSACheckers(Records, OS);
209    break;
210  case GenClangCommentHTMLTags:
211    EmitClangCommentHTMLTags(Records, OS);
212    break;
213  case GenClangCommentHTMLTagsProperties:
214    EmitClangCommentHTMLTagsProperties(Records, OS);
215    break;
216  case GenClangCommentHTMLNamedCharacterReferences:
217    EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
218    break;
219  case GenClangCommentCommandInfo:
220    EmitClangCommentCommandInfo(Records, OS);
221    break;
222  case GenClangCommentCommandList:
223    EmitClangCommentCommandList(Records, OS);
224    break;
225  case GenArmNeon:
226    EmitNeon(Records, OS);
227    break;
228  case GenArmNeonSema:
229    EmitNeonSema(Records, OS);
230    break;
231  case GenArmNeonTest:
232    EmitNeonTest(Records, OS);
233    break;
234  case GenAttrDocs:
235    EmitClangAttrDocs(Records, OS);
236    break;
237  }
238
239  return false;
240}
241}
242
243int main(int argc, char **argv) {
244  sys::PrintStackTraceOnErrorSignal();
245  PrettyStackTraceProgram X(argc, argv);
246  cl::ParseCommandLineOptions(argc, argv);
247
248  llvm_shutdown_obj Y;
249
250  return TableGenMain(argv[0], &ClangTableGenMain);
251}
252
253#ifdef __has_feature
254#if __has_feature(address_sanitizer)
255#include <sanitizer/lsan_interface.h>
256// Disable LeakSanitizer for this binary as it has too many leaks that are not
257// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
258int __lsan_is_turned_off() { return 1; }
259#endif  // __has_feature(address_sanitizer)
260#endif  // defined(__has_feature)
261