TableGen.cpp revision 234353
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 "ClangASTNodesEmitter.h"
15#include "ClangAttrEmitter.h"
16#include "ClangDiagnosticsEmitter.h"
17#include "ClangSACheckersEmitter.h"
18#include "NeonEmitter.h"
19#include "OptParserEmitter.h"
20
21#include "llvm/Support/CommandLine.h"
22#include "llvm/Support/PrettyStackTrace.h"
23#include "llvm/Support/Signals.h"
24#include "llvm/TableGen/Error.h"
25#include "llvm/TableGen/Main.h"
26#include "llvm/TableGen/Record.h"
27#include "llvm/TableGen/TableGenAction.h"
28
29using namespace llvm;
30
31enum ActionType {
32  GenClangAttrClasses,
33  GenClangAttrImpl,
34  GenClangAttrList,
35  GenClangAttrPCHRead,
36  GenClangAttrPCHWrite,
37  GenClangAttrSpellingList,
38  GenClangAttrLateParsedList,
39  GenClangAttrTemplateInstantiate,
40  GenClangAttrParsedAttrList,
41  GenClangAttrParsedAttrKinds,
42  GenClangDiagsDefs,
43  GenClangDiagGroups,
44  GenClangDiagsIndexName,
45  GenClangDeclNodes,
46  GenClangStmtNodes,
47  GenClangSACheckers,
48  GenOptParserDefs, GenOptParserImpl,
49  GenArmNeon,
50  GenArmNeonSema,
51  GenArmNeonTest
52};
53
54namespace {
55  cl::opt<ActionType>
56  Action(cl::desc("Action to perform:"),
57         cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
58                               "Generate option definitions"),
59                    clEnumValN(GenOptParserImpl, "gen-opt-parser-impl",
60                               "Generate option parser implementation"),
61                    clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
62                               "Generate clang attribute clases"),
63                    clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
64                               "Generate clang attribute implementations"),
65                    clEnumValN(GenClangAttrList, "gen-clang-attr-list",
66                               "Generate a clang attribute list"),
67                    clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
68                               "Generate clang PCH attribute reader"),
69                    clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
70                               "Generate clang PCH attribute writer"),
71                    clEnumValN(GenClangAttrSpellingList,
72                               "gen-clang-attr-spelling-list",
73                               "Generate a clang attribute spelling list"),
74                    clEnumValN(GenClangAttrLateParsedList,
75                               "gen-clang-attr-late-parsed-list",
76                               "Generate a clang attribute LateParsed list"),
77                    clEnumValN(GenClangAttrTemplateInstantiate,
78                               "gen-clang-attr-template-instantiate",
79                               "Generate a clang template instantiate code"),
80                    clEnumValN(GenClangAttrParsedAttrList,
81                               "gen-clang-attr-parsed-attr-list",
82                               "Generate a clang parsed attribute list"),
83                    clEnumValN(GenClangAttrParsedAttrKinds,
84                               "gen-clang-attr-parsed-attr-kinds",
85                               "Generate a clang parsed attribute kinds"),
86                    clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
87                               "Generate Clang diagnostics definitions"),
88                    clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
89                               "Generate Clang diagnostic groups"),
90                    clEnumValN(GenClangDiagsIndexName,
91                               "gen-clang-diags-index-name",
92                               "Generate Clang diagnostic name index"),
93                    clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
94                               "Generate Clang AST declaration nodes"),
95                    clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
96                               "Generate Clang AST statement nodes"),
97                    clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
98                               "Generate Clang Static Analyzer checkers"),
99                    clEnumValN(GenArmNeon, "gen-arm-neon",
100                               "Generate arm_neon.h for clang"),
101                    clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
102                               "Generate ARM NEON sema support for clang"),
103                    clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
104                               "Generate ARM NEON tests for clang"),
105                    clEnumValEnd));
106
107  cl::opt<std::string>
108  ClangComponent("clang-component",
109                 cl::desc("Only use warnings from specified component"),
110                 cl::value_desc("component"), cl::Hidden);
111
112class ClangTableGenAction : public TableGenAction {
113public:
114  bool operator()(raw_ostream &OS, RecordKeeper &Records) {
115    switch (Action) {
116    case GenClangAttrClasses:
117      ClangAttrClassEmitter(Records).run(OS);
118      break;
119    case GenClangAttrImpl:
120      ClangAttrImplEmitter(Records).run(OS);
121      break;
122    case GenClangAttrList:
123      ClangAttrListEmitter(Records).run(OS);
124      break;
125    case GenClangAttrPCHRead:
126      ClangAttrPCHReadEmitter(Records).run(OS);
127      break;
128    case GenClangAttrPCHWrite:
129      ClangAttrPCHWriteEmitter(Records).run(OS);
130      break;
131    case GenClangAttrSpellingList:
132      ClangAttrSpellingListEmitter(Records).run(OS);
133      break;
134    case GenClangAttrLateParsedList:
135      ClangAttrLateParsedListEmitter(Records).run(OS);
136      break;
137    case GenClangAttrTemplateInstantiate:
138      ClangAttrTemplateInstantiateEmitter(Records).run(OS);
139      break;
140    case GenClangAttrParsedAttrList:
141      ClangAttrParsedAttrListEmitter(Records).run(OS);
142      break;
143    case GenClangAttrParsedAttrKinds:
144      ClangAttrParsedAttrKindsEmitter(Records).run(OS);
145      break;
146    case GenClangDiagsDefs:
147      ClangDiagsDefsEmitter(Records, ClangComponent).run(OS);
148      break;
149    case GenClangDiagGroups:
150      ClangDiagGroupsEmitter(Records).run(OS);
151      break;
152    case GenClangDiagsIndexName:
153      ClangDiagsIndexNameEmitter(Records).run(OS);
154      break;
155    case GenClangDeclNodes:
156      ClangASTNodesEmitter(Records, "Decl", "Decl").run(OS);
157      ClangDeclContextEmitter(Records).run(OS);
158      break;
159    case GenClangStmtNodes:
160      ClangASTNodesEmitter(Records, "Stmt", "").run(OS);
161      break;
162    case GenClangSACheckers:
163      ClangSACheckersEmitter(Records).run(OS);
164      break;
165    case GenOptParserDefs:
166      OptParserEmitter(Records, true).run(OS);
167      break;
168    case GenOptParserImpl:
169      OptParserEmitter(Records, false).run(OS);
170      break;
171    case GenArmNeon:
172      NeonEmitter(Records).run(OS);
173      break;
174    case GenArmNeonSema:
175      NeonEmitter(Records).runHeader(OS);
176      break;
177    case GenArmNeonTest:
178      NeonEmitter(Records).runTests(OS);
179      break;
180    }
181
182    return false;
183  }
184};
185}
186
187int main(int argc, char **argv) {
188  sys::PrintStackTraceOnErrorSignal();
189  PrettyStackTraceProgram X(argc, argv);
190  cl::ParseCommandLineOptions(argc, argv);
191
192  ClangTableGenAction Action;
193  return TableGenMain(argv[0], Action);
194}
195