TableGen.cpp revision 51d7777a21b9706d503496c650af06f80d278c1a
193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//                     The LLVM Compiler Infrastructure
493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// This file is distributed under the University of Illinois Open Source
693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// License. See LICENSE.TXT for details.
793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//===----------------------------------------------------------------------===//
993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
1093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// This file contains the main function for Clang's TableGen.
1193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
1293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//===----------------------------------------------------------------------===//
1393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "ClangASTNodesEmitter.h"
1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "ClangAttrEmitter.h"
1693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "ClangDiagnosticsEmitter.h"
1793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "ClangSACheckersEmitter.h"
1893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "NeonEmitter.h"
1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "OptParserEmitter.h"
2093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
2193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/Support/CommandLine.h"
2293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/Support/PrettyStackTrace.h"
2393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/Support/Signals.h"
2493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/TableGen/Error.h"
2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/TableGen/Main.h"
2693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/TableGen/Record.h"
2793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/TableGen/TableGenAction.h"
2893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
2993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgusing namespace llvm;
3093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
3193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgenum ActionType {
3293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  GenClangAttrClasses,
3393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  GenClangAttrImpl,
3493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  GenClangAttrList,
35  GenClangAttrPCHRead,
36  GenClangAttrPCHWrite,
37  GenClangAttrSpellingList,
38  GenClangAttrLateParsedList,
39  GenClangDiagsDefs,
40  GenClangDiagGroups,
41  GenClangDiagsIndexName,
42  GenClangDeclNodes,
43  GenClangStmtNodes,
44  GenClangSACheckers,
45  GenOptParserDefs, GenOptParserImpl,
46  GenArmNeon,
47  GenArmNeonSema,
48  GenArmNeonTest
49};
50
51namespace {
52  cl::opt<ActionType>
53  Action(cl::desc("Action to perform:"),
54         cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
55                               "Generate option definitions"),
56                    clEnumValN(GenOptParserImpl, "gen-opt-parser-impl",
57                               "Generate option parser implementation"),
58                    clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
59                               "Generate clang attribute clases"),
60                    clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
61                               "Generate clang attribute implementations"),
62                    clEnumValN(GenClangAttrList, "gen-clang-attr-list",
63                               "Generate a clang attribute list"),
64                    clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
65                               "Generate clang PCH attribute reader"),
66                    clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
67                               "Generate clang PCH attribute writer"),
68                    clEnumValN(GenClangAttrSpellingList,
69                               "gen-clang-attr-spelling-list",
70                               "Generate a clang attribute spelling list"),
71                    clEnumValN(GenClangAttrLateParsedList,
72                               "gen-clang-attr-late-parsed-list",
73                               "Generate a clang attribute LateParsed list"),
74                    clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
75                               "Generate Clang diagnostics definitions"),
76                    clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
77                               "Generate Clang diagnostic groups"),
78                    clEnumValN(GenClangDiagsIndexName,
79                               "gen-clang-diags-index-name",
80                               "Generate Clang diagnostic name index"),
81                    clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
82                               "Generate Clang AST declaration nodes"),
83                    clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
84                               "Generate Clang AST statement nodes"),
85                    clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
86                               "Generate Clang Static Analyzer checkers"),
87                    clEnumValN(GenArmNeon, "gen-arm-neon",
88                               "Generate arm_neon.h for clang"),
89                    clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
90                               "Generate ARM NEON sema support for clang"),
91                    clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
92                               "Generate ARM NEON tests for clang"),
93                    clEnumValEnd));
94
95  cl::opt<std::string>
96  ClangComponent("clang-component",
97                 cl::desc("Only use warnings from specified component"),
98                 cl::value_desc("component"), cl::Hidden);
99}
100
101class ClangTableGenAction : public TableGenAction {
102public:
103  bool operator()(raw_ostream &OS, RecordKeeper &Records) {
104    switch (Action) {
105    case GenClangAttrClasses:
106      ClangAttrClassEmitter(Records).run(OS);
107      break;
108    case GenClangAttrImpl:
109      ClangAttrImplEmitter(Records).run(OS);
110      break;
111    case GenClangAttrList:
112      ClangAttrListEmitter(Records).run(OS);
113      break;
114    case GenClangAttrPCHRead:
115      ClangAttrPCHReadEmitter(Records).run(OS);
116      break;
117    case GenClangAttrPCHWrite:
118      ClangAttrPCHWriteEmitter(Records).run(OS);
119      break;
120    case GenClangAttrSpellingList:
121      ClangAttrSpellingListEmitter(Records).run(OS);
122      break;
123    case GenClangAttrLateParsedList:
124      ClangAttrLateParsedListEmitter(Records).run(OS);
125      break;
126    case GenClangDiagsDefs:
127      ClangDiagsDefsEmitter(Records, ClangComponent).run(OS);
128      break;
129    case GenClangDiagGroups:
130      ClangDiagGroupsEmitter(Records).run(OS);
131      break;
132    case GenClangDiagsIndexName:
133      ClangDiagsIndexNameEmitter(Records).run(OS);
134      break;
135    case GenClangDeclNodes:
136      ClangASTNodesEmitter(Records, "Decl", "Decl").run(OS);
137      ClangDeclContextEmitter(Records).run(OS);
138      break;
139    case GenClangStmtNodes:
140      ClangASTNodesEmitter(Records, "Stmt", "").run(OS);
141      break;
142    case GenClangSACheckers:
143      ClangSACheckersEmitter(Records).run(OS);
144      break;
145    case GenOptParserDefs:
146      OptParserEmitter(Records, true).run(OS);
147      break;
148    case GenOptParserImpl:
149      OptParserEmitter(Records, false).run(OS);
150      break;
151    case GenArmNeon:
152      NeonEmitter(Records).run(OS);
153      break;
154    case GenArmNeonSema:
155      NeonEmitter(Records).runHeader(OS);
156      break;
157    case GenArmNeonTest:
158      NeonEmitter(Records).runTests(OS);
159      break;
160    default:
161      assert(1 && "Invalid Action");
162      return true;
163    }
164
165    return false;
166  }
167};
168
169int main(int argc, char **argv) {
170  sys::PrintStackTraceOnErrorSignal();
171  PrettyStackTraceProgram X(argc, argv);
172  cl::ParseCommandLineOptions(argc, argv);
173
174  ClangTableGenAction Action;
175  return TableGenMain(argv[0], Action);
176}
177