TableGen.cpp revision 226586
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
14226586Sdim#include "ClangASTNodesEmitter.h"
15226586Sdim#include "ClangAttrEmitter.h"
16226586Sdim#include "ClangDiagnosticsEmitter.h"
17226586Sdim#include "ClangSACheckersEmitter.h"
18226586Sdim#include "NeonEmitter.h"
19226586Sdim#include "OptParserEmitter.h"
20226586Sdim
21226586Sdim#include "llvm/Support/CommandLine.h"
22226586Sdim#include "llvm/Support/PrettyStackTrace.h"
23226586Sdim#include "llvm/Support/Signals.h"
24226586Sdim#include "llvm/TableGen/Error.h"
25226586Sdim#include "llvm/TableGen/Main.h"
26226586Sdim#include "llvm/TableGen/Record.h"
27226586Sdim#include "llvm/TableGen/TableGenAction.h"
28226586Sdim
29226586Sdimusing namespace llvm;
30226586Sdim
31226586Sdimenum ActionType {
32226586Sdim  GenClangAttrClasses,
33226586Sdim  GenClangAttrImpl,
34226586Sdim  GenClangAttrList,
35226586Sdim  GenClangAttrPCHRead,
36226586Sdim  GenClangAttrPCHWrite,
37226586Sdim  GenClangAttrSpellingList,
38226586Sdim  GenClangAttrLateParsedList,
39226586Sdim  GenClangDiagsDefs,
40226586Sdim  GenClangDiagGroups,
41226586Sdim  GenClangDiagsIndexName,
42226586Sdim  GenClangDeclNodes,
43226586Sdim  GenClangStmtNodes,
44226586Sdim  GenClangSACheckers,
45226586Sdim  GenOptParserDefs, GenOptParserImpl,
46226586Sdim  GenArmNeon,
47226586Sdim  GenArmNeonSema,
48226586Sdim  GenArmNeonTest
49226586Sdim};
50226586Sdim
51226586Sdimnamespace {
52226586Sdim  cl::opt<ActionType>
53226586Sdim  Action(cl::desc("Action to perform:"),
54226586Sdim         cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
55226586Sdim                               "Generate option definitions"),
56226586Sdim                    clEnumValN(GenOptParserImpl, "gen-opt-parser-impl",
57226586Sdim                               "Generate option parser implementation"),
58226586Sdim                    clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
59226586Sdim                               "Generate clang attribute clases"),
60226586Sdim                    clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
61226586Sdim                               "Generate clang attribute implementations"),
62226586Sdim                    clEnumValN(GenClangAttrList, "gen-clang-attr-list",
63226586Sdim                               "Generate a clang attribute list"),
64226586Sdim                    clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
65226586Sdim                               "Generate clang PCH attribute reader"),
66226586Sdim                    clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
67226586Sdim                               "Generate clang PCH attribute writer"),
68226586Sdim                    clEnumValN(GenClangAttrSpellingList,
69226586Sdim                               "gen-clang-attr-spelling-list",
70226586Sdim                               "Generate a clang attribute spelling list"),
71226586Sdim                    clEnumValN(GenClangAttrLateParsedList,
72226586Sdim                               "gen-clang-attr-late-parsed-list",
73226586Sdim                               "Generate a clang attribute LateParsed list"),
74226586Sdim                    clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
75226586Sdim                               "Generate Clang diagnostics definitions"),
76226586Sdim                    clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
77226586Sdim                               "Generate Clang diagnostic groups"),
78226586Sdim                    clEnumValN(GenClangDiagsIndexName,
79226586Sdim                               "gen-clang-diags-index-name",
80226586Sdim                               "Generate Clang diagnostic name index"),
81226586Sdim                    clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
82226586Sdim                               "Generate Clang AST declaration nodes"),
83226586Sdim                    clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
84226586Sdim                               "Generate Clang AST statement nodes"),
85226586Sdim                    clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
86226586Sdim                               "Generate Clang Static Analyzer checkers"),
87226586Sdim                    clEnumValN(GenArmNeon, "gen-arm-neon",
88226586Sdim                               "Generate arm_neon.h for clang"),
89226586Sdim                    clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
90226586Sdim                               "Generate ARM NEON sema support for clang"),
91226586Sdim                    clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
92226586Sdim                               "Generate ARM NEON tests for clang"),
93226586Sdim                    clEnumValEnd));
94226586Sdim
95226586Sdim  cl::opt<std::string>
96226586Sdim  ClangComponent("clang-component",
97226586Sdim                 cl::desc("Only use warnings from specified component"),
98226586Sdim                 cl::value_desc("component"), cl::Hidden);
99226586Sdim}
100226586Sdim
101226586Sdimclass ClangTableGenAction : public TableGenAction {
102226586Sdimpublic:
103226586Sdim  bool operator()(raw_ostream &OS, RecordKeeper &Records) {
104226586Sdim    switch (Action) {
105226586Sdim    case GenClangAttrClasses:
106226586Sdim      ClangAttrClassEmitter(Records).run(OS);
107226586Sdim      break;
108226586Sdim    case GenClangAttrImpl:
109226586Sdim      ClangAttrImplEmitter(Records).run(OS);
110226586Sdim      break;
111226586Sdim    case GenClangAttrList:
112226586Sdim      ClangAttrListEmitter(Records).run(OS);
113226586Sdim      break;
114226586Sdim    case GenClangAttrPCHRead:
115226586Sdim      ClangAttrPCHReadEmitter(Records).run(OS);
116226586Sdim      break;
117226586Sdim    case GenClangAttrPCHWrite:
118226586Sdim      ClangAttrPCHWriteEmitter(Records).run(OS);
119226586Sdim      break;
120226586Sdim    case GenClangAttrSpellingList:
121226586Sdim      ClangAttrSpellingListEmitter(Records).run(OS);
122226586Sdim      break;
123226586Sdim    case GenClangAttrLateParsedList:
124226586Sdim      ClangAttrLateParsedListEmitter(Records).run(OS);
125226586Sdim      break;
126226586Sdim    case GenClangDiagsDefs:
127226586Sdim      ClangDiagsDefsEmitter(Records, ClangComponent).run(OS);
128226586Sdim      break;
129226586Sdim    case GenClangDiagGroups:
130226586Sdim      ClangDiagGroupsEmitter(Records).run(OS);
131226586Sdim      break;
132226586Sdim    case GenClangDiagsIndexName:
133226586Sdim      ClangDiagsIndexNameEmitter(Records).run(OS);
134226586Sdim      break;
135226586Sdim    case GenClangDeclNodes:
136226586Sdim      ClangASTNodesEmitter(Records, "Decl", "Decl").run(OS);
137226586Sdim      ClangDeclContextEmitter(Records).run(OS);
138226586Sdim      break;
139226586Sdim    case GenClangStmtNodes:
140226586Sdim      ClangASTNodesEmitter(Records, "Stmt", "").run(OS);
141226586Sdim      break;
142226586Sdim    case GenClangSACheckers:
143226586Sdim      ClangSACheckersEmitter(Records).run(OS);
144226586Sdim      break;
145226586Sdim    case GenOptParserDefs:
146226586Sdim      OptParserEmitter(Records, true).run(OS);
147226586Sdim      break;
148226586Sdim    case GenOptParserImpl:
149226586Sdim      OptParserEmitter(Records, false).run(OS);
150226586Sdim      break;
151226586Sdim    case GenArmNeon:
152226586Sdim      NeonEmitter(Records).run(OS);
153226586Sdim      break;
154226586Sdim    case GenArmNeonSema:
155226586Sdim      NeonEmitter(Records).runHeader(OS);
156226586Sdim      break;
157226586Sdim    case GenArmNeonTest:
158226586Sdim      NeonEmitter(Records).runTests(OS);
159226586Sdim      break;
160226586Sdim    default:
161226586Sdim      assert(1 && "Invalid Action");
162226586Sdim      return true;
163226586Sdim    }
164226586Sdim
165226586Sdim    return false;
166226586Sdim  }
167226586Sdim};
168226586Sdim
169226586Sdimint main(int argc, char **argv) {
170226586Sdim  sys::PrintStackTraceOnErrorSignal();
171226586Sdim  PrettyStackTraceProgram X(argc, argv);
172226586Sdim  cl::ParseCommandLineOptions(argc, argv);
173226586Sdim
174226586Sdim  ClangTableGenAction Action;
175226586Sdim  return TableGenMain(argv[0], Action);
176226586Sdim}
177