1226586Sdim//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
2226586Sdim//
3226586Sdim//                     The LLVM Compiler Infrastructure
4226586Sdim//
5226586Sdim// This file is distributed under the University of Illinois Open Source
6226586Sdim// License. See LICENSE.TXT for details.
7226586Sdim//
8226586Sdim//===----------------------------------------------------------------------===//
9226586Sdim//
10226586Sdim// This file contains the main function for Clang's TableGen.
11226586Sdim//
12226586Sdim//===----------------------------------------------------------------------===//
13226586Sdim
14239462Sdim#include "TableGenBackends.h" // Declares all backends.
15226586Sdim#include "llvm/Support/CommandLine.h"
16226586Sdim#include "llvm/Support/PrettyStackTrace.h"
17226586Sdim#include "llvm/Support/Signals.h"
18226586Sdim#include "llvm/TableGen/Error.h"
19226586Sdim#include "llvm/TableGen/Main.h"
20226586Sdim#include "llvm/TableGen/Record.h"
21226586Sdim
22226586Sdimusing namespace llvm;
23239462Sdimusing namespace clang;
24226586Sdim
25226586Sdimenum ActionType {
26226586Sdim  GenClangAttrClasses,
27251662Sdim  GenClangAttrExprArgsList,
28226586Sdim  GenClangAttrImpl,
29226586Sdim  GenClangAttrList,
30226586Sdim  GenClangAttrPCHRead,
31226586Sdim  GenClangAttrPCHWrite,
32226586Sdim  GenClangAttrSpellingList,
33249423Sdim  GenClangAttrSpellingListIndex,
34226586Sdim  GenClangAttrLateParsedList,
35234353Sdim  GenClangAttrTemplateInstantiate,
36234353Sdim  GenClangAttrParsedAttrList,
37234353Sdim  GenClangAttrParsedAttrKinds,
38249423Sdim  GenClangAttrDump,
39226586Sdim  GenClangDiagsDefs,
40226586Sdim  GenClangDiagGroups,
41226586Sdim  GenClangDiagsIndexName,
42239462Sdim  GenClangCommentNodes,
43226586Sdim  GenClangDeclNodes,
44226586Sdim  GenClangStmtNodes,
45226586Sdim  GenClangSACheckers,
46243830Sdim  GenClangCommentHTMLTags,
47243830Sdim  GenClangCommentHTMLTagsProperties,
48249423Sdim  GenClangCommentHTMLNamedCharacterReferences,
49243830Sdim  GenClangCommentCommandInfo,
50249423Sdim  GenClangCommentCommandList,
51226586Sdim  GenOptParserDefs, GenOptParserImpl,
52226586Sdim  GenArmNeon,
53226586Sdim  GenArmNeonSema,
54226586Sdim  GenArmNeonTest
55226586Sdim};
56226586Sdim
57226586Sdimnamespace {
58226586Sdim  cl::opt<ActionType>
59226586Sdim  Action(cl::desc("Action to perform:"),
60226586Sdim         cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
61226586Sdim                               "Generate option definitions"),
62226586Sdim                    clEnumValN(GenOptParserImpl, "gen-opt-parser-impl",
63226586Sdim                               "Generate option parser implementation"),
64226586Sdim                    clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
65226586Sdim                               "Generate clang attribute clases"),
66251662Sdim                    clEnumValN(GenClangAttrExprArgsList,
67251662Sdim                               "gen-clang-attr-expr-args-list",
68251662Sdim                               "Generate a clang attribute expression "
69251662Sdim                               "arguments list"),
70226586Sdim                    clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
71226586Sdim                               "Generate clang attribute implementations"),
72226586Sdim                    clEnumValN(GenClangAttrList, "gen-clang-attr-list",
73226586Sdim                               "Generate a clang attribute list"),
74226586Sdim                    clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
75226586Sdim                               "Generate clang PCH attribute reader"),
76226586Sdim                    clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
77226586Sdim                               "Generate clang PCH attribute writer"),
78226586Sdim                    clEnumValN(GenClangAttrSpellingList,
79226586Sdim                               "gen-clang-attr-spelling-list",
80226586Sdim                               "Generate a clang attribute spelling list"),
81249423Sdim                    clEnumValN(GenClangAttrSpellingListIndex,
82249423Sdim                               "gen-clang-attr-spelling-index",
83249423Sdim                               "Generate a clang attribute spelling index"),
84226586Sdim                    clEnumValN(GenClangAttrLateParsedList,
85226586Sdim                               "gen-clang-attr-late-parsed-list",
86226586Sdim                               "Generate a clang attribute LateParsed list"),
87234353Sdim                    clEnumValN(GenClangAttrTemplateInstantiate,
88234353Sdim                               "gen-clang-attr-template-instantiate",
89234353Sdim                               "Generate a clang template instantiate code"),
90234353Sdim                    clEnumValN(GenClangAttrParsedAttrList,
91234353Sdim                               "gen-clang-attr-parsed-attr-list",
92234353Sdim                               "Generate a clang parsed attribute list"),
93234353Sdim                    clEnumValN(GenClangAttrParsedAttrKinds,
94234353Sdim                               "gen-clang-attr-parsed-attr-kinds",
95234353Sdim                               "Generate a clang parsed attribute kinds"),
96249423Sdim                    clEnumValN(GenClangAttrDump, "gen-clang-attr-dump",
97249423Sdim                               "Generate clang attribute dumper"),
98226586Sdim                    clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
99226586Sdim                               "Generate Clang diagnostics definitions"),
100226586Sdim                    clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
101226586Sdim                               "Generate Clang diagnostic groups"),
102226586Sdim                    clEnumValN(GenClangDiagsIndexName,
103226586Sdim                               "gen-clang-diags-index-name",
104226586Sdim                               "Generate Clang diagnostic name index"),
105239462Sdim                    clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
106239462Sdim                               "Generate Clang AST comment nodes"),
107226586Sdim                    clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
108226586Sdim                               "Generate Clang AST declaration nodes"),
109226586Sdim                    clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
110226586Sdim                               "Generate Clang AST statement nodes"),
111226586Sdim                    clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
112226586Sdim                               "Generate Clang Static Analyzer checkers"),
113243830Sdim                    clEnumValN(GenClangCommentHTMLTags,
114243830Sdim                               "gen-clang-comment-html-tags",
115243830Sdim                               "Generate efficient matchers for HTML tag "
116243830Sdim                               "names that are used in documentation comments"),
117243830Sdim                    clEnumValN(GenClangCommentHTMLTagsProperties,
118243830Sdim                               "gen-clang-comment-html-tags-properties",
119243830Sdim                               "Generate efficient matchers for HTML tag "
120243830Sdim                               "properties"),
121249423Sdim                    clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
122249423Sdim                               "gen-clang-comment-html-named-character-references",
123249423Sdim                               "Generate function to translate named character "
124249423Sdim                               "references to UTF-8 sequences"),
125243830Sdim                    clEnumValN(GenClangCommentCommandInfo,
126243830Sdim                               "gen-clang-comment-command-info",
127249423Sdim                               "Generate command properties for commands that "
128249423Sdim                               "are used in documentation comments"),
129249423Sdim                    clEnumValN(GenClangCommentCommandList,
130249423Sdim                               "gen-clang-comment-command-list",
131243830Sdim                               "Generate list of commands that are used in "
132243830Sdim                               "documentation comments"),
133226586Sdim                    clEnumValN(GenArmNeon, "gen-arm-neon",
134226586Sdim                               "Generate arm_neon.h for clang"),
135226586Sdim                    clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
136226586Sdim                               "Generate ARM NEON sema support for clang"),
137226586Sdim                    clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
138226586Sdim                               "Generate ARM NEON tests for clang"),
139226586Sdim                    clEnumValEnd));
140226586Sdim
141226586Sdim  cl::opt<std::string>
142226586Sdim  ClangComponent("clang-component",
143226586Sdim                 cl::desc("Only use warnings from specified component"),
144226586Sdim                 cl::value_desc("component"), cl::Hidden);
145226586Sdim
146243830Sdimbool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
147243830Sdim  switch (Action) {
148243830Sdim  case GenClangAttrClasses:
149243830Sdim    EmitClangAttrClass(Records, OS);
150243830Sdim    break;
151251662Sdim  case GenClangAttrExprArgsList:
152251662Sdim    EmitClangAttrExprArgsList(Records, OS);
153251662Sdim    break;
154243830Sdim  case GenClangAttrImpl:
155243830Sdim    EmitClangAttrImpl(Records, OS);
156243830Sdim    break;
157243830Sdim  case GenClangAttrList:
158243830Sdim    EmitClangAttrList(Records, OS);
159243830Sdim    break;
160243830Sdim  case GenClangAttrPCHRead:
161243830Sdim    EmitClangAttrPCHRead(Records, OS);
162243830Sdim    break;
163243830Sdim  case GenClangAttrPCHWrite:
164243830Sdim    EmitClangAttrPCHWrite(Records, OS);
165243830Sdim    break;
166243830Sdim  case GenClangAttrSpellingList:
167243830Sdim    EmitClangAttrSpellingList(Records, OS);
168243830Sdim    break;
169249423Sdim  case GenClangAttrSpellingListIndex:
170249423Sdim    EmitClangAttrSpellingListIndex(Records, OS);
171249423Sdim    break;
172243830Sdim  case GenClangAttrLateParsedList:
173243830Sdim    EmitClangAttrLateParsedList(Records, OS);
174243830Sdim    break;
175243830Sdim  case GenClangAttrTemplateInstantiate:
176243830Sdim    EmitClangAttrTemplateInstantiate(Records, OS);
177243830Sdim    break;
178243830Sdim  case GenClangAttrParsedAttrList:
179243830Sdim    EmitClangAttrParsedAttrList(Records, OS);
180243830Sdim    break;
181243830Sdim  case GenClangAttrParsedAttrKinds:
182243830Sdim    EmitClangAttrParsedAttrKinds(Records, OS);
183243830Sdim    break;
184249423Sdim  case GenClangAttrDump:
185249423Sdim    EmitClangAttrDump(Records, OS);
186249423Sdim    break;
187243830Sdim  case GenClangDiagsDefs:
188243830Sdim    EmitClangDiagsDefs(Records, OS, ClangComponent);
189243830Sdim    break;
190243830Sdim  case GenClangDiagGroups:
191243830Sdim    EmitClangDiagGroups(Records, OS);
192243830Sdim    break;
193243830Sdim  case GenClangDiagsIndexName:
194243830Sdim    EmitClangDiagsIndexName(Records, OS);
195243830Sdim    break;
196243830Sdim  case GenClangCommentNodes:
197243830Sdim    EmitClangASTNodes(Records, OS, "Comment", "");
198243830Sdim    break;
199243830Sdim  case GenClangDeclNodes:
200243830Sdim    EmitClangASTNodes(Records, OS, "Decl", "Decl");
201243830Sdim    EmitClangDeclContext(Records, OS);
202243830Sdim    break;
203243830Sdim  case GenClangStmtNodes:
204243830Sdim    EmitClangASTNodes(Records, OS, "Stmt", "");
205243830Sdim    break;
206243830Sdim  case GenClangSACheckers:
207243830Sdim    EmitClangSACheckers(Records, OS);
208243830Sdim    break;
209243830Sdim  case GenClangCommentHTMLTags:
210243830Sdim    EmitClangCommentHTMLTags(Records, OS);
211243830Sdim    break;
212243830Sdim  case GenClangCommentHTMLTagsProperties:
213243830Sdim    EmitClangCommentHTMLTagsProperties(Records, OS);
214243830Sdim    break;
215249423Sdim  case GenClangCommentHTMLNamedCharacterReferences:
216249423Sdim    EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
217249423Sdim    break;
218243830Sdim  case GenClangCommentCommandInfo:
219243830Sdim    EmitClangCommentCommandInfo(Records, OS);
220243830Sdim    break;
221249423Sdim  case GenClangCommentCommandList:
222249423Sdim    EmitClangCommentCommandList(Records, OS);
223249423Sdim    break;
224243830Sdim  case GenOptParserDefs:
225243830Sdim    EmitOptParser(Records, OS, true);
226243830Sdim    break;
227243830Sdim  case GenOptParserImpl:
228243830Sdim    EmitOptParser(Records, OS, false);
229243830Sdim    break;
230243830Sdim  case GenArmNeon:
231243830Sdim    EmitNeon(Records, OS);
232243830Sdim    break;
233243830Sdim  case GenArmNeonSema:
234243830Sdim    EmitNeonSema(Records, OS);
235243830Sdim    break;
236243830Sdim  case GenArmNeonTest:
237243830Sdim    EmitNeonTest(Records, OS);
238243830Sdim    break;
239243830Sdim  }
240226586Sdim
241243830Sdim  return false;
242234353Sdim}
243243830Sdim}
244226586Sdim
245226586Sdimint main(int argc, char **argv) {
246226586Sdim  sys::PrintStackTraceOnErrorSignal();
247226586Sdim  PrettyStackTraceProgram X(argc, argv);
248226586Sdim  cl::ParseCommandLineOptions(argc, argv);
249226586Sdim
250243830Sdim  return TableGenMain(argv[0], &ClangTableGenMain);
251226586Sdim}
252