TableGen.cpp revision 263508
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
22using namespace llvm;
23using namespace clang;
24
25enum ActionType {
26  GenClangAttrClasses,
27  GenClangAttrIdentifierArgList,
28  GenClangAttrTypeArgList,
29  GenClangAttrImpl,
30  GenClangAttrList,
31  GenClangAttrPCHRead,
32  GenClangAttrPCHWrite,
33  GenClangAttrSpellingList,
34  GenClangAttrSpellingListIndex,
35  GenClangAttrLateParsedList,
36  GenClangAttrTemplateInstantiate,
37  GenClangAttrParsedAttrList,
38  GenClangAttrParsedAttrImpl,
39  GenClangAttrParsedAttrKinds,
40  GenClangAttrDump,
41  GenClangDiagsDefs,
42  GenClangDiagGroups,
43  GenClangDiagsIndexName,
44  GenClangCommentNodes,
45  GenClangDeclNodes,
46  GenClangStmtNodes,
47  GenClangSACheckers,
48  GenClangCommentHTMLTags,
49  GenClangCommentHTMLTagsProperties,
50  GenClangCommentHTMLNamedCharacterReferences,
51  GenClangCommentCommandInfo,
52  GenClangCommentCommandList,
53  GenArmNeon,
54  GenArmNeonSema,
55  GenArmNeonTest
56};
57
58namespace {
59cl::opt<ActionType> Action(
60    cl::desc("Action to perform:"),
61    cl::values(
62        clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
63                   "Generate clang attribute clases"),
64        clEnumValN(GenClangAttrIdentifierArgList,
65                   "gen-clang-attr-identifier-arg-list",
66                   "Generate a list of attributes that take an "
67                   "identifier as their first argument"),
68        clEnumValN(GenClangAttrTypeArgList,
69                   "gen-clang-attr-type-arg-list",
70                   "Generate a list of attributes that take a type as their "
71                   "first argument"),
72        clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
73                   "Generate clang attribute implementations"),
74        clEnumValN(GenClangAttrList, "gen-clang-attr-list",
75                   "Generate a clang attribute list"),
76        clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
77                   "Generate clang PCH attribute reader"),
78        clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
79                   "Generate clang PCH attribute writer"),
80        clEnumValN(GenClangAttrSpellingList, "gen-clang-attr-spelling-list",
81                   "Generate a clang attribute spelling list"),
82        clEnumValN(GenClangAttrSpellingListIndex,
83                   "gen-clang-attr-spelling-index",
84                   "Generate a clang attribute spelling index"),
85        clEnumValN(GenClangAttrLateParsedList,
86                   "gen-clang-attr-late-parsed-list",
87                   "Generate a clang attribute LateParsed list"),
88        clEnumValN(GenClangAttrTemplateInstantiate,
89                   "gen-clang-attr-template-instantiate",
90                   "Generate a clang template instantiate code"),
91        clEnumValN(GenClangAttrParsedAttrList,
92                   "gen-clang-attr-parsed-attr-list",
93                   "Generate a clang parsed attribute list"),
94        clEnumValN(GenClangAttrParsedAttrImpl,
95                   "gen-clang-attr-parsed-attr-impl",
96                   "Generate the clang parsed attribute helpers"),
97        clEnumValN(GenClangAttrParsedAttrKinds,
98                   "gen-clang-attr-parsed-attr-kinds",
99                   "Generate a clang parsed attribute kinds"),
100        clEnumValN(GenClangAttrDump, "gen-clang-attr-dump",
101                   "Generate clang attribute dumper"),
102        clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
103                   "Generate Clang diagnostics definitions"),
104        clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
105                   "Generate Clang diagnostic groups"),
106        clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
107                   "Generate Clang diagnostic name index"),
108        clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
109                   "Generate Clang AST comment nodes"),
110        clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
111                   "Generate Clang AST declaration nodes"),
112        clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
113                   "Generate Clang AST statement nodes"),
114        clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
115                   "Generate Clang Static Analyzer checkers"),
116        clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
117                   "Generate efficient matchers for HTML tag "
118                   "names that are used in documentation comments"),
119        clEnumValN(GenClangCommentHTMLTagsProperties,
120                   "gen-clang-comment-html-tags-properties",
121                   "Generate efficient matchers for HTML tag "
122                   "properties"),
123        clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
124                   "gen-clang-comment-html-named-character-references",
125                   "Generate function to translate named character "
126                   "references to UTF-8 sequences"),
127        clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
128                   "Generate command properties for commands that "
129                   "are used in documentation comments"),
130        clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
131                   "Generate list of commands that are used in "
132                   "documentation comments"),
133        clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
134        clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
135                   "Generate ARM NEON sema support for clang"),
136        clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
137                   "Generate ARM NEON tests for clang"),
138        clEnumValEnd));
139
140cl::opt<std::string>
141ClangComponent("clang-component",
142               cl::desc("Only use warnings from specified component"),
143               cl::value_desc("component"), cl::Hidden);
144
145bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
146  switch (Action) {
147  case GenClangAttrClasses:
148    EmitClangAttrClass(Records, OS);
149    break;
150  case GenClangAttrIdentifierArgList:
151    EmitClangAttrIdentifierArgList(Records, OS);
152    break;
153  case GenClangAttrTypeArgList:
154    EmitClangAttrTypeArgList(Records, OS);
155    break;
156  case GenClangAttrImpl:
157    EmitClangAttrImpl(Records, OS);
158    break;
159  case GenClangAttrList:
160    EmitClangAttrList(Records, OS);
161    break;
162  case GenClangAttrPCHRead:
163    EmitClangAttrPCHRead(Records, OS);
164    break;
165  case GenClangAttrPCHWrite:
166    EmitClangAttrPCHWrite(Records, OS);
167    break;
168  case GenClangAttrSpellingList:
169    EmitClangAttrSpellingList(Records, OS);
170    break;
171  case GenClangAttrSpellingListIndex:
172    EmitClangAttrSpellingListIndex(Records, OS);
173    break;
174  case GenClangAttrLateParsedList:
175    EmitClangAttrLateParsedList(Records, OS);
176    break;
177  case GenClangAttrTemplateInstantiate:
178    EmitClangAttrTemplateInstantiate(Records, OS);
179    break;
180  case GenClangAttrParsedAttrList:
181    EmitClangAttrParsedAttrList(Records, OS);
182    break;
183  case GenClangAttrParsedAttrImpl:
184    EmitClangAttrParsedAttrImpl(Records, OS);
185    break;
186  case GenClangAttrParsedAttrKinds:
187    EmitClangAttrParsedAttrKinds(Records, OS);
188    break;
189  case GenClangAttrDump:
190    EmitClangAttrDump(Records, OS);
191    break;
192  case GenClangDiagsDefs:
193    EmitClangDiagsDefs(Records, OS, ClangComponent);
194    break;
195  case GenClangDiagGroups:
196    EmitClangDiagGroups(Records, OS);
197    break;
198  case GenClangDiagsIndexName:
199    EmitClangDiagsIndexName(Records, OS);
200    break;
201  case GenClangCommentNodes:
202    EmitClangASTNodes(Records, OS, "Comment", "");
203    break;
204  case GenClangDeclNodes:
205    EmitClangASTNodes(Records, OS, "Decl", "Decl");
206    EmitClangDeclContext(Records, OS);
207    break;
208  case GenClangStmtNodes:
209    EmitClangASTNodes(Records, OS, "Stmt", "");
210    break;
211  case GenClangSACheckers:
212    EmitClangSACheckers(Records, OS);
213    break;
214  case GenClangCommentHTMLTags:
215    EmitClangCommentHTMLTags(Records, OS);
216    break;
217  case GenClangCommentHTMLTagsProperties:
218    EmitClangCommentHTMLTagsProperties(Records, OS);
219    break;
220  case GenClangCommentHTMLNamedCharacterReferences:
221    EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
222    break;
223  case GenClangCommentCommandInfo:
224    EmitClangCommentCommandInfo(Records, OS);
225    break;
226  case GenClangCommentCommandList:
227    EmitClangCommentCommandList(Records, OS);
228    break;
229  case GenArmNeon:
230    EmitNeon(Records, OS);
231    break;
232  case GenArmNeonSema:
233    EmitNeonSema(Records, OS);
234    break;
235  case GenArmNeonTest:
236    EmitNeonTest(Records, OS);
237    break;
238  }
239
240  return false;
241}
242}
243
244int main(int argc, char **argv) {
245  sys::PrintStackTraceOnErrorSignal();
246  PrettyStackTraceProgram X(argc, argv);
247  cl::ParseCommandLineOptions(argc, argv);
248
249  return TableGenMain(argv[0], &ClangTableGenMain);
250}
251