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 "TableGenBackends.h" // Declares all backends.
15 #include "llvm/Support/CommandLine.h"
16 #include "llvm/Support/ManagedStatic.h"
17 #include "llvm/Support/PrettyStackTrace.h"
18 #include "llvm/Support/Signals.h"
19 #include "llvm/TableGen/Main.h"
20 #include "llvm/TableGen/Record.h"
21 #include "llvm/TableGen/SetTheory.h"
56 Action(cl::desc("Action to perform:"),
57 cl::values(clEnumValN(PrintRecords, "print-records",
58 "Print all records to stdout (default)"),
59 clEnumValN(GenEmitter, "gen-emitter",
60 "Generate machine code emitter"),
61 clEnumValN(GenRegisterInfo, "gen-register-info",
62 "Generate registers and register classes info"),
63 clEnumValN(GenInstrInfo, "gen-instr-info",
64 "Generate instruction descriptions"),
65 clEnumValN(GenInstrDocs, "gen-instr-docs",
66 "Generate instruction documentation"),
67 clEnumValN(GenCallingConv, "gen-callingconv",
68 "Generate calling convention descriptions"),
69 clEnumValN(GenAsmWriter, "gen-asm-writer",
70 "Generate assembly writer"),
71 clEnumValN(GenDisassembler, "gen-disassembler",
72 "Generate disassembler"),
73 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
74 "Generate pseudo instruction lowering"),
75 clEnumValN(GenAsmMatcher, "gen-asm-matcher",
76 "Generate assembly instruction matcher"),
77 clEnumValN(GenDAGISel, "gen-dag-isel",
78 "Generate a DAG instruction selector"),
79 clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
80 "Generate DFA Packetizer for VLIW targets"),
81 clEnumValN(GenFastISel, "gen-fast-isel",
82 "Generate a \"fast\" instruction selector"),
83 clEnumValN(GenSubtarget, "gen-subtarget",
84 "Generate subtarget enumerations"),
85 clEnumValN(GenIntrinsic, "gen-intrinsic",
86 "Generate intrinsic information"),
87 clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
88 "Generate target intrinsic information"),
89 clEnumValN(PrintEnums, "print-enums",
90 "Print enum values for a class"),
91 clEnumValN(PrintSets, "print-sets",
92 "Print expanded sets for testing DAG exprs"),
93 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
94 "Generate option definitions"),
95 clEnumValN(GenCTags, "gen-ctags",
96 "Generate ctags-compatible index"),
97 clEnumValN(GenAttributes, "gen-attrs",
98 "Generate attributes"),
99 clEnumValN(GenSearchableTables, "gen-searchable-tables",
100 "Generate generic binary-searchable table"),
101 clEnumValN(GenGlobalISel, "gen-global-isel",
102 "Generate GlobalISel selector"),
103 clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables",
104 "Generate X86 EVEX to VEX compress tables"),
105 clEnumValN(GenX86FoldTables, "gen-x86-fold-tables",
106 "Generate X86 fold tables"),
107 clEnumValN(GenRegisterBank, "gen-register-bank",
108 "Generate registers bank descriptions")));
110 cl::OptionCategory PrintEnumsCat("Options for -print-enums");
112 Class("class", cl::desc("Print Enum list for this class"),
113 cl::value_desc("class name"), cl::cat(PrintEnumsCat));
115 bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
118 OS << Records; // No argument, dump all contents
121 EmitCodeEmitter(Records, OS);
123 case GenRegisterInfo:
124 EmitRegisterInfo(Records, OS);
127 EmitInstrInfo(Records, OS);
130 EmitInstrDocs(Records, OS);
133 EmitCallingConv(Records, OS);
136 EmitAsmWriter(Records, OS);
139 EmitAsmMatcher(Records, OS);
141 case GenDisassembler:
142 EmitDisassembler(Records, OS);
144 case GenPseudoLowering:
145 EmitPseudoLowering(Records, OS);
148 EmitDAGISel(Records, OS);
150 case GenDFAPacketizer:
151 EmitDFAPacketizer(Records, OS);
154 EmitFastISel(Records, OS);
157 EmitSubtarget(Records, OS);
160 EmitIntrinsics(Records, OS);
162 case GenTgtIntrinsic:
163 EmitIntrinsics(Records, OS, true);
165 case GenOptParserDefs:
166 EmitOptParser(Records, OS);
170 for (Record *Rec : Records.getAllDerivedDefinitions(Class))
171 OS << Rec->getName() << ", ";
178 Sets.addFieldExpander("Set", "Elements");
179 for (Record *Rec : Records.getAllDerivedDefinitions("Set")) {
180 OS << Rec->getName() << " = [";
181 const std::vector<Record*> *Elts = Sets.expand(Rec);
182 assert(Elts && "Couldn't expand Set instance");
183 for (Record *Elt : *Elts)
184 OS << ' ' << Elt->getName();
190 EmitCTags(Records, OS);
193 EmitAttributes(Records, OS);
195 case GenSearchableTables:
196 EmitSearchableTables(Records, OS);
199 EmitGlobalISel(Records, OS);
201 case GenRegisterBank:
202 EmitRegisterBank(Records, OS);
204 case GenX86EVEX2VEXTables:
205 EmitX86EVEX2VEXTables(Records, OS);
207 case GenX86FoldTables:
208 EmitX86FoldTables(Records, OS);
216 int main(int argc, char **argv) {
217 sys::PrintStackTraceOnErrorSignal(argv[0]);
218 PrettyStackTraceProgram X(argc, argv);
219 cl::ParseCommandLineOptions(argc, argv);
223 return TableGenMain(argv[0], &LLVMTableGenMain);
227 #if __has_feature(address_sanitizer)
228 #include <sanitizer/lsan_interface.h>
229 // Disable LeakSanitizer for this binary as it has too many leaks that are not
230 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
231 LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; }
232 #endif // __has_feature(address_sanitizer)
233 #endif // defined(__has_feature)