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,
27263508Sdim  GenClangAttrIdentifierArgList,
28263508Sdim  GenClangAttrTypeArgList,
29226586Sdim  GenClangAttrImpl,
30226586Sdim  GenClangAttrList,
31226586Sdim  GenClangAttrPCHRead,
32226586Sdim  GenClangAttrPCHWrite,
33226586Sdim  GenClangAttrSpellingList,
34249423Sdim  GenClangAttrSpellingListIndex,
35226586Sdim  GenClangAttrLateParsedList,
36234353Sdim  GenClangAttrTemplateInstantiate,
37234353Sdim  GenClangAttrParsedAttrList,
38263508Sdim  GenClangAttrParsedAttrImpl,
39234353Sdim  GenClangAttrParsedAttrKinds,
40249423Sdim  GenClangAttrDump,
41226586Sdim  GenClangDiagsDefs,
42226586Sdim  GenClangDiagGroups,
43226586Sdim  GenClangDiagsIndexName,
44239462Sdim  GenClangCommentNodes,
45226586Sdim  GenClangDeclNodes,
46226586Sdim  GenClangStmtNodes,
47226586Sdim  GenClangSACheckers,
48243830Sdim  GenClangCommentHTMLTags,
49243830Sdim  GenClangCommentHTMLTagsProperties,
50249423Sdim  GenClangCommentHTMLNamedCharacterReferences,
51243830Sdim  GenClangCommentCommandInfo,
52249423Sdim  GenClangCommentCommandList,
53226586Sdim  GenArmNeon,
54226586Sdim  GenArmNeonSema,
55226586Sdim  GenArmNeonTest
56226586Sdim};
57226586Sdim
58226586Sdimnamespace {
59263508Sdimcl::opt<ActionType> Action(
60263508Sdim    cl::desc("Action to perform:"),
61263508Sdim    cl::values(
62263508Sdim        clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
63263508Sdim                   "Generate clang attribute clases"),
64263508Sdim        clEnumValN(GenClangAttrIdentifierArgList,
65263508Sdim                   "gen-clang-attr-identifier-arg-list",
66263508Sdim                   "Generate a list of attributes that take an "
67263508Sdim                   "identifier as their first argument"),
68263508Sdim        clEnumValN(GenClangAttrTypeArgList,
69263508Sdim                   "gen-clang-attr-type-arg-list",
70263508Sdim                   "Generate a list of attributes that take a type as their "
71263508Sdim                   "first argument"),
72263508Sdim        clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
73263508Sdim                   "Generate clang attribute implementations"),
74263508Sdim        clEnumValN(GenClangAttrList, "gen-clang-attr-list",
75263508Sdim                   "Generate a clang attribute list"),
76263508Sdim        clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
77263508Sdim                   "Generate clang PCH attribute reader"),
78263508Sdim        clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
79263508Sdim                   "Generate clang PCH attribute writer"),
80263508Sdim        clEnumValN(GenClangAttrSpellingList, "gen-clang-attr-spelling-list",
81263508Sdim                   "Generate a clang attribute spelling list"),
82263508Sdim        clEnumValN(GenClangAttrSpellingListIndex,
83263508Sdim                   "gen-clang-attr-spelling-index",
84263508Sdim                   "Generate a clang attribute spelling index"),
85263508Sdim        clEnumValN(GenClangAttrLateParsedList,
86263508Sdim                   "gen-clang-attr-late-parsed-list",
87263508Sdim                   "Generate a clang attribute LateParsed list"),
88263508Sdim        clEnumValN(GenClangAttrTemplateInstantiate,
89263508Sdim                   "gen-clang-attr-template-instantiate",
90263508Sdim                   "Generate a clang template instantiate code"),
91263508Sdim        clEnumValN(GenClangAttrParsedAttrList,
92263508Sdim                   "gen-clang-attr-parsed-attr-list",
93263508Sdim                   "Generate a clang parsed attribute list"),
94263508Sdim        clEnumValN(GenClangAttrParsedAttrImpl,
95263508Sdim                   "gen-clang-attr-parsed-attr-impl",
96263508Sdim                   "Generate the clang parsed attribute helpers"),
97263508Sdim        clEnumValN(GenClangAttrParsedAttrKinds,
98263508Sdim                   "gen-clang-attr-parsed-attr-kinds",
99263508Sdim                   "Generate a clang parsed attribute kinds"),
100263508Sdim        clEnumValN(GenClangAttrDump, "gen-clang-attr-dump",
101263508Sdim                   "Generate clang attribute dumper"),
102263508Sdim        clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
103263508Sdim                   "Generate Clang diagnostics definitions"),
104263508Sdim        clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
105263508Sdim                   "Generate Clang diagnostic groups"),
106263508Sdim        clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
107263508Sdim                   "Generate Clang diagnostic name index"),
108263508Sdim        clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
109263508Sdim                   "Generate Clang AST comment nodes"),
110263508Sdim        clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
111263508Sdim                   "Generate Clang AST declaration nodes"),
112263508Sdim        clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
113263508Sdim                   "Generate Clang AST statement nodes"),
114263508Sdim        clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
115263508Sdim                   "Generate Clang Static Analyzer checkers"),
116263508Sdim        clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
117263508Sdim                   "Generate efficient matchers for HTML tag "
118263508Sdim                   "names that are used in documentation comments"),
119263508Sdim        clEnumValN(GenClangCommentHTMLTagsProperties,
120263508Sdim                   "gen-clang-comment-html-tags-properties",
121263508Sdim                   "Generate efficient matchers for HTML tag "
122263508Sdim                   "properties"),
123263508Sdim        clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
124263508Sdim                   "gen-clang-comment-html-named-character-references",
125263508Sdim                   "Generate function to translate named character "
126263508Sdim                   "references to UTF-8 sequences"),
127263508Sdim        clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
128263508Sdim                   "Generate command properties for commands that "
129263508Sdim                   "are used in documentation comments"),
130263508Sdim        clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
131263508Sdim                   "Generate list of commands that are used in "
132263508Sdim                   "documentation comments"),
133263508Sdim        clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
134263508Sdim        clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
135263508Sdim                   "Generate ARM NEON sema support for clang"),
136263508Sdim        clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
137263508Sdim                   "Generate ARM NEON tests for clang"),
138263508Sdim        clEnumValEnd));
139226586Sdim
140263508Sdimcl::opt<std::string>
141263508SdimClangComponent("clang-component",
142263508Sdim               cl::desc("Only use warnings from specified component"),
143263508Sdim               cl::value_desc("component"), cl::Hidden);
144226586Sdim
145243830Sdimbool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
146243830Sdim  switch (Action) {
147243830Sdim  case GenClangAttrClasses:
148243830Sdim    EmitClangAttrClass(Records, OS);
149243830Sdim    break;
150263508Sdim  case GenClangAttrIdentifierArgList:
151263508Sdim    EmitClangAttrIdentifierArgList(Records, OS);
152251662Sdim    break;
153263508Sdim  case GenClangAttrTypeArgList:
154263508Sdim    EmitClangAttrTypeArgList(Records, OS);
155263508Sdim    break;
156243830Sdim  case GenClangAttrImpl:
157243830Sdim    EmitClangAttrImpl(Records, OS);
158243830Sdim    break;
159243830Sdim  case GenClangAttrList:
160243830Sdim    EmitClangAttrList(Records, OS);
161243830Sdim    break;
162243830Sdim  case GenClangAttrPCHRead:
163243830Sdim    EmitClangAttrPCHRead(Records, OS);
164243830Sdim    break;
165243830Sdim  case GenClangAttrPCHWrite:
166243830Sdim    EmitClangAttrPCHWrite(Records, OS);
167243830Sdim    break;
168243830Sdim  case GenClangAttrSpellingList:
169243830Sdim    EmitClangAttrSpellingList(Records, OS);
170243830Sdim    break;
171249423Sdim  case GenClangAttrSpellingListIndex:
172249423Sdim    EmitClangAttrSpellingListIndex(Records, OS);
173249423Sdim    break;
174243830Sdim  case GenClangAttrLateParsedList:
175243830Sdim    EmitClangAttrLateParsedList(Records, OS);
176243830Sdim    break;
177243830Sdim  case GenClangAttrTemplateInstantiate:
178243830Sdim    EmitClangAttrTemplateInstantiate(Records, OS);
179243830Sdim    break;
180243830Sdim  case GenClangAttrParsedAttrList:
181243830Sdim    EmitClangAttrParsedAttrList(Records, OS);
182243830Sdim    break;
183263508Sdim  case GenClangAttrParsedAttrImpl:
184263508Sdim    EmitClangAttrParsedAttrImpl(Records, OS);
185263508Sdim    break;
186243830Sdim  case GenClangAttrParsedAttrKinds:
187243830Sdim    EmitClangAttrParsedAttrKinds(Records, OS);
188243830Sdim    break;
189249423Sdim  case GenClangAttrDump:
190249423Sdim    EmitClangAttrDump(Records, OS);
191249423Sdim    break;
192243830Sdim  case GenClangDiagsDefs:
193243830Sdim    EmitClangDiagsDefs(Records, OS, ClangComponent);
194243830Sdim    break;
195243830Sdim  case GenClangDiagGroups:
196243830Sdim    EmitClangDiagGroups(Records, OS);
197243830Sdim    break;
198243830Sdim  case GenClangDiagsIndexName:
199243830Sdim    EmitClangDiagsIndexName(Records, OS);
200243830Sdim    break;
201243830Sdim  case GenClangCommentNodes:
202243830Sdim    EmitClangASTNodes(Records, OS, "Comment", "");
203243830Sdim    break;
204243830Sdim  case GenClangDeclNodes:
205243830Sdim    EmitClangASTNodes(Records, OS, "Decl", "Decl");
206243830Sdim    EmitClangDeclContext(Records, OS);
207243830Sdim    break;
208243830Sdim  case GenClangStmtNodes:
209243830Sdim    EmitClangASTNodes(Records, OS, "Stmt", "");
210243830Sdim    break;
211243830Sdim  case GenClangSACheckers:
212243830Sdim    EmitClangSACheckers(Records, OS);
213243830Sdim    break;
214243830Sdim  case GenClangCommentHTMLTags:
215243830Sdim    EmitClangCommentHTMLTags(Records, OS);
216243830Sdim    break;
217243830Sdim  case GenClangCommentHTMLTagsProperties:
218243830Sdim    EmitClangCommentHTMLTagsProperties(Records, OS);
219243830Sdim    break;
220249423Sdim  case GenClangCommentHTMLNamedCharacterReferences:
221249423Sdim    EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
222249423Sdim    break;
223243830Sdim  case GenClangCommentCommandInfo:
224243830Sdim    EmitClangCommentCommandInfo(Records, OS);
225243830Sdim    break;
226249423Sdim  case GenClangCommentCommandList:
227249423Sdim    EmitClangCommentCommandList(Records, OS);
228249423Sdim    break;
229243830Sdim  case GenArmNeon:
230243830Sdim    EmitNeon(Records, OS);
231243830Sdim    break;
232243830Sdim  case GenArmNeonSema:
233243830Sdim    EmitNeonSema(Records, OS);
234243830Sdim    break;
235243830Sdim  case GenArmNeonTest:
236243830Sdim    EmitNeonTest(Records, OS);
237243830Sdim    break;
238243830Sdim  }
239226586Sdim
240243830Sdim  return false;
241234353Sdim}
242243830Sdim}
243226586Sdim
244226586Sdimint main(int argc, char **argv) {
245226586Sdim  sys::PrintStackTraceOnErrorSignal();
246226586Sdim  PrettyStackTraceProgram X(argc, argv);
247226586Sdim  cl::ParseCommandLineOptions(argc, argv);
248226586Sdim
249243830Sdim  return TableGenMain(argv[0], &ClangTableGenMain);
250226586Sdim}
251