1 //===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the main function for LLVM's TableGen.
12 //===----------------------------------------------------------------------===//
14 #include "AsmMatcherEmitter.h"
15 #include "AsmWriterEmitter.h"
16 #include "CallingConvEmitter.h"
17 #include "ClangASTNodesEmitter.h"
18 #include "ClangAttrEmitter.h"
19 #include "ClangDiagnosticsEmitter.h"
20 #include "ClangSACheckersEmitter.h"
21 #include "CodeEmitterGen.h"
22 #include "DAGISelEmitter.h"
23 #include "DisassemblerEmitter.h"
24 #include "EDEmitter.h"
25 #include "FastISelEmitter.h"
26 #include "InstrInfoEmitter.h"
27 #include "IntrinsicEmitter.h"
28 #include "NeonEmitter.h"
29 #include "OptParserEmitter.h"
30 #include "PseudoLoweringEmitter.h"
31 #include "RegisterInfoEmitter.h"
32 #include "ARMDecoderEmitter.h"
33 #include "SubtargetEmitter.h"
34 #include "SetTheory.h"
36 #include "llvm/Support/CommandLine.h"
37 #include "llvm/Support/PrettyStackTrace.h"
38 #include "llvm/Support/Signals.h"
39 #include "llvm/TableGen/Error.h"
40 #include "llvm/TableGen/Main.h"
41 #include "llvm/TableGen/Record.h"
42 #include "llvm/TableGen/TableGenAction.h"
62 GenClangAttrSpellingList,
63 GenClangAttrLateParsedList,
66 GenClangDiagsIndexName,
72 GenOptParserDefs, GenOptParserImpl,
86 Action(cl::desc("Action to perform:"),
87 cl::values(clEnumValN(PrintRecords, "print-records",
88 "Print all records to stdout (default)"),
89 clEnumValN(GenEmitter, "gen-emitter",
90 "Generate machine code emitter"),
91 clEnumValN(GenRegisterInfo, "gen-register-info",
92 "Generate registers and register classes info"),
93 clEnumValN(GenInstrInfo, "gen-instr-info",
94 "Generate instruction descriptions"),
95 clEnumValN(GenCallingConv, "gen-callingconv",
96 "Generate calling convention descriptions"),
97 clEnumValN(GenAsmWriter, "gen-asm-writer",
98 "Generate assembly writer"),
99 clEnumValN(GenARMDecoder, "gen-arm-decoder",
100 "Generate decoders for ARM/Thumb"),
101 clEnumValN(GenDisassembler, "gen-disassembler",
102 "Generate disassembler"),
103 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
104 "Generate pseudo instruction lowering"),
105 clEnumValN(GenAsmMatcher, "gen-asm-matcher",
106 "Generate assembly instruction matcher"),
107 clEnumValN(GenDAGISel, "gen-dag-isel",
108 "Generate a DAG instruction selector"),
109 clEnumValN(GenFastISel, "gen-fast-isel",
110 "Generate a \"fast\" instruction selector"),
111 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
112 "Generate option definitions"),
113 clEnumValN(GenOptParserImpl, "gen-opt-parser-impl",
114 "Generate option parser implementation"),
115 clEnumValN(GenSubtarget, "gen-subtarget",
116 "Generate subtarget enumerations"),
117 clEnumValN(GenIntrinsic, "gen-intrinsic",
118 "Generate intrinsic information"),
119 clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
120 "Generate target intrinsic information"),
121 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
122 "Generate clang attribute clases"),
123 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
124 "Generate clang attribute implementations"),
125 clEnumValN(GenClangAttrList, "gen-clang-attr-list",
126 "Generate a clang attribute list"),
127 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
128 "Generate clang PCH attribute reader"),
129 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
130 "Generate clang PCH attribute writer"),
131 clEnumValN(GenClangAttrSpellingList,
132 "gen-clang-attr-spelling-list",
133 "Generate a clang attribute spelling list"),
134 clEnumValN(GenClangAttrLateParsedList,
135 "gen-clang-attr-late-parsed-list",
136 "Generate a clang attribute LateParsed list"),
137 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
138 "Generate Clang diagnostics definitions"),
139 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
140 "Generate Clang diagnostic groups"),
141 clEnumValN(GenClangDiagsIndexName,
142 "gen-clang-diags-index-name",
143 "Generate Clang diagnostic name index"),
144 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
145 "Generate Clang AST declaration nodes"),
146 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
147 "Generate Clang AST statement nodes"),
148 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
149 "Generate Clang Static Analyzer checkers"),
150 clEnumValN(GenEDInfo, "gen-enhanced-disassembly-info",
151 "Generate enhanced disassembly info"),
152 clEnumValN(GenArmNeon, "gen-arm-neon",
153 "Generate arm_neon.h for clang"),
154 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
155 "Generate ARM NEON sema support for clang"),
156 clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
157 "Generate ARM NEON tests for clang"),
158 clEnumValN(PrintEnums, "print-enums",
159 "Print enum values for a class"),
160 clEnumValN(PrintSets, "print-sets",
161 "Print expanded sets for testing DAG exprs"),
165 Class("class", cl::desc("Print Enum list for this class"),
166 cl::value_desc("class name"));
169 ClangComponent("clang-component",
170 cl::desc("Only use warnings from specified component"),
171 cl::value_desc("component"), cl::Hidden);
174 class LLVMTableGenAction : public TableGenAction {
176 bool operator()(raw_ostream &OS, RecordKeeper &Records) {
179 OS << Records; // No argument, dump all contents
182 CodeEmitterGen(Records).run(OS);
184 case GenRegisterInfo:
185 RegisterInfoEmitter(Records).run(OS);
188 InstrInfoEmitter(Records).run(OS);
191 CallingConvEmitter(Records).run(OS);
194 AsmWriterEmitter(Records).run(OS);
197 ARMDecoderEmitter(Records).run(OS);
200 AsmMatcherEmitter(Records).run(OS);
202 case GenClangAttrClasses:
203 ClangAttrClassEmitter(Records).run(OS);
205 case GenClangAttrImpl:
206 ClangAttrImplEmitter(Records).run(OS);
208 case GenClangAttrList:
209 ClangAttrListEmitter(Records).run(OS);
211 case GenClangAttrPCHRead:
212 ClangAttrPCHReadEmitter(Records).run(OS);
214 case GenClangAttrPCHWrite:
215 ClangAttrPCHWriteEmitter(Records).run(OS);
217 case GenClangAttrSpellingList:
218 ClangAttrSpellingListEmitter(Records).run(OS);
220 case GenClangAttrLateParsedList:
221 ClangAttrLateParsedListEmitter(Records).run(OS);
223 case GenClangDiagsDefs:
224 ClangDiagsDefsEmitter(Records, ClangComponent).run(OS);
226 case GenClangDiagGroups:
227 ClangDiagGroupsEmitter(Records).run(OS);
229 case GenClangDiagsIndexName:
230 ClangDiagsIndexNameEmitter(Records).run(OS);
232 case GenClangDeclNodes:
233 ClangASTNodesEmitter(Records, "Decl", "Decl").run(OS);
234 ClangDeclContextEmitter(Records).run(OS);
236 case GenClangStmtNodes:
237 ClangASTNodesEmitter(Records, "Stmt", "").run(OS);
239 case GenClangSACheckers:
240 ClangSACheckersEmitter(Records).run(OS);
242 case GenDisassembler:
243 DisassemblerEmitter(Records).run(OS);
245 case GenPseudoLowering:
246 PseudoLoweringEmitter(Records).run(OS);
248 case GenOptParserDefs:
249 OptParserEmitter(Records, true).run(OS);
251 case GenOptParserImpl:
252 OptParserEmitter(Records, false).run(OS);
255 DAGISelEmitter(Records).run(OS);
258 FastISelEmitter(Records).run(OS);
261 SubtargetEmitter(Records).run(OS);
264 IntrinsicEmitter(Records).run(OS);
266 case GenTgtIntrinsic:
267 IntrinsicEmitter(Records, true).run(OS);
270 EDEmitter(Records).run(OS);
273 NeonEmitter(Records).run(OS);
276 NeonEmitter(Records).runHeader(OS);
279 NeonEmitter(Records).runTests(OS);
283 std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class);
284 for (unsigned i = 0, e = Recs.size(); i != e; ++i)
285 OS << Recs[i]->getName() << ", ";
292 Sets.addFieldExpander("Set", "Elements");
293 std::vector<Record*> Recs = Records.getAllDerivedDefinitions("Set");
294 for (unsigned i = 0, e = Recs.size(); i != e; ++i) {
295 OS << Recs[i]->getName() << " = [";
296 const std::vector<Record*> *Elts = Sets.expand(Recs[i]);
297 assert(Elts && "Couldn't expand Set instance");
298 for (unsigned ei = 0, ee = Elts->size(); ei != ee; ++ei)
299 OS << ' ' << (*Elts)[ei]->getName();
305 assert(1 && "Invalid Action");
313 int main(int argc, char **argv) {
314 sys::PrintStackTraceOnErrorSignal();
315 PrettyStackTraceProgram X(argc, argv);
316 cl::ParseCommandLineOptions(argc, argv);
318 LLVMTableGenAction Action;
319 return TableGenMain(argv[0], Action);