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