]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/utils/TableGen/TableGen.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / utils / TableGen / TableGen.cpp
1 //===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===//
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 LLVM's TableGen.
11 //
12 //===----------------------------------------------------------------------===//
13
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"
22
23 using namespace llvm;
24
25 enum ActionType {
26   PrintRecords,
27   DumpJSON,
28   GenEmitter,
29   GenRegisterInfo,
30   GenInstrInfo,
31   GenInstrDocs,
32   GenAsmWriter,
33   GenAsmMatcher,
34   GenDisassembler,
35   GenPseudoLowering,
36   GenCompressInst,
37   GenCallingConv,
38   GenDAGISel,
39   GenDFAPacketizer,
40   GenFastISel,
41   GenSubtarget,
42   GenIntrinsicEnums,
43   GenIntrinsicImpl,
44   GenTgtIntrinsicEnums,
45   GenTgtIntrinsicImpl,
46   PrintEnums,
47   PrintSets,
48   GenOptParserDefs,
49   GenCTags,
50   GenAttributes,
51   GenSearchableTables,
52   GenGlobalISel,
53   GenX86EVEX2VEXTables,
54   GenX86FoldTables,
55   GenRegisterBank,
56   GenExegesis,
57 };
58
59 namespace {
60   cl::opt<ActionType>
61   Action(cl::desc("Action to perform:"),
62          cl::values(clEnumValN(PrintRecords, "print-records",
63                                "Print all records to stdout (default)"),
64                     clEnumValN(DumpJSON, "dump-json",
65                                "Dump all records as machine-readable JSON"),
66                     clEnumValN(GenEmitter, "gen-emitter",
67                                "Generate machine code emitter"),
68                     clEnumValN(GenRegisterInfo, "gen-register-info",
69                                "Generate registers and register classes info"),
70                     clEnumValN(GenInstrInfo, "gen-instr-info",
71                                "Generate instruction descriptions"),
72                     clEnumValN(GenInstrDocs, "gen-instr-docs",
73                                "Generate instruction documentation"),
74                     clEnumValN(GenCallingConv, "gen-callingconv",
75                                "Generate calling convention descriptions"),
76                     clEnumValN(GenAsmWriter, "gen-asm-writer",
77                                "Generate assembly writer"),
78                     clEnumValN(GenDisassembler, "gen-disassembler",
79                                "Generate disassembler"),
80                     clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
81                                "Generate pseudo instruction lowering"),
82                     clEnumValN(GenCompressInst, "gen-compress-inst-emitter",
83                                "Generate RISCV compressed instructions."),
84                     clEnumValN(GenAsmMatcher, "gen-asm-matcher",
85                                "Generate assembly instruction matcher"),
86                     clEnumValN(GenDAGISel, "gen-dag-isel",
87                                "Generate a DAG instruction selector"),
88                     clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
89                                "Generate DFA Packetizer for VLIW targets"),
90                     clEnumValN(GenFastISel, "gen-fast-isel",
91                                "Generate a \"fast\" instruction selector"),
92                     clEnumValN(GenSubtarget, "gen-subtarget",
93                                "Generate subtarget enumerations"),
94                     clEnumValN(GenIntrinsicEnums, "gen-intrinsic-enums",
95                                "Generate intrinsic enums"),
96                     clEnumValN(GenIntrinsicImpl, "gen-intrinsic-impl",
97                                "Generate intrinsic information"),
98                     clEnumValN(GenTgtIntrinsicEnums, "gen-tgt-intrinsic-enums",
99                                "Generate target intrinsic enums"),
100                     clEnumValN(GenTgtIntrinsicImpl, "gen-tgt-intrinsic-impl",
101                                "Generate target intrinsic information"),
102                     clEnumValN(PrintEnums, "print-enums",
103                                "Print enum values for a class"),
104                     clEnumValN(PrintSets, "print-sets",
105                                "Print expanded sets for testing DAG exprs"),
106                     clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
107                                "Generate option definitions"),
108                     clEnumValN(GenCTags, "gen-ctags",
109                                "Generate ctags-compatible index"),
110                     clEnumValN(GenAttributes, "gen-attrs",
111                                "Generate attributes"),
112                     clEnumValN(GenSearchableTables, "gen-searchable-tables",
113                                "Generate generic binary-searchable table"),
114                     clEnumValN(GenGlobalISel, "gen-global-isel",
115                                "Generate GlobalISel selector"),
116                     clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables",
117                                "Generate X86 EVEX to VEX compress tables"),
118                     clEnumValN(GenX86FoldTables, "gen-x86-fold-tables",
119                                "Generate X86 fold tables"),
120                     clEnumValN(GenRegisterBank, "gen-register-bank",
121                                "Generate registers bank descriptions"),
122                     clEnumValN(GenExegesis, "gen-exegesis",
123                                "Generate llvm-exegesis tables")));
124
125   cl::OptionCategory PrintEnumsCat("Options for -print-enums");
126   cl::opt<std::string>
127   Class("class", cl::desc("Print Enum list for this class"),
128         cl::value_desc("class name"), cl::cat(PrintEnumsCat));
129
130 bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
131   switch (Action) {
132   case PrintRecords:
133     OS << Records;           // No argument, dump all contents
134     break;
135   case DumpJSON:
136     EmitJSON(Records, OS);
137     break;
138   case GenEmitter:
139     EmitCodeEmitter(Records, OS);
140     break;
141   case GenRegisterInfo:
142     EmitRegisterInfo(Records, OS);
143     break;
144   case GenInstrInfo:
145     EmitInstrInfo(Records, OS);
146     break;
147   case GenInstrDocs:
148     EmitInstrDocs(Records, OS);
149     break;
150   case GenCallingConv:
151     EmitCallingConv(Records, OS);
152     break;
153   case GenAsmWriter:
154     EmitAsmWriter(Records, OS);
155     break;
156   case GenAsmMatcher:
157     EmitAsmMatcher(Records, OS);
158     break;
159   case GenDisassembler:
160     EmitDisassembler(Records, OS);
161     break;
162   case GenPseudoLowering:
163     EmitPseudoLowering(Records, OS);
164     break;
165   case GenCompressInst:
166     EmitCompressInst(Records, OS);
167     break;
168   case GenDAGISel:
169     EmitDAGISel(Records, OS);
170     break;
171   case GenDFAPacketizer:
172     EmitDFAPacketizer(Records, OS);
173     break;
174   case GenFastISel:
175     EmitFastISel(Records, OS);
176     break;
177   case GenSubtarget:
178     EmitSubtarget(Records, OS);
179     break;
180   case GenIntrinsicEnums:
181     EmitIntrinsicEnums(Records, OS);
182     break;
183   case GenIntrinsicImpl:
184     EmitIntrinsicImpl(Records, OS);
185     break;
186   case GenTgtIntrinsicEnums:
187     EmitIntrinsicEnums(Records, OS, true);
188     break;
189   case GenTgtIntrinsicImpl:
190     EmitIntrinsicImpl(Records, OS, true);
191     break;
192   case GenOptParserDefs:
193     EmitOptParser(Records, OS);
194     break;
195   case PrintEnums:
196   {
197     for (Record *Rec : Records.getAllDerivedDefinitions(Class))
198       OS << Rec->getName() << ", ";
199     OS << "\n";
200     break;
201   }
202   case PrintSets:
203   {
204     SetTheory Sets;
205     Sets.addFieldExpander("Set", "Elements");
206     for (Record *Rec : Records.getAllDerivedDefinitions("Set")) {
207       OS << Rec->getName() << " = [";
208       const std::vector<Record*> *Elts = Sets.expand(Rec);
209       assert(Elts && "Couldn't expand Set instance");
210       for (Record *Elt : *Elts)
211         OS << ' ' << Elt->getName();
212       OS << " ]\n";
213     }
214     break;
215   }
216   case GenCTags:
217     EmitCTags(Records, OS);
218     break;
219   case GenAttributes:
220     EmitAttributes(Records, OS);
221     break;
222   case GenSearchableTables:
223     EmitSearchableTables(Records, OS);
224     break;
225   case GenGlobalISel:
226     EmitGlobalISel(Records, OS);
227     break;
228   case GenRegisterBank:
229     EmitRegisterBank(Records, OS);
230     break;
231   case GenX86EVEX2VEXTables:
232     EmitX86EVEX2VEXTables(Records, OS);
233     break;
234   case GenX86FoldTables:
235     EmitX86FoldTables(Records, OS);
236     break;
237   case GenExegesis:
238     EmitExegesis(Records, OS);
239     break;
240   }
241
242   return false;
243 }
244 }
245
246 int main(int argc, char **argv) {
247   sys::PrintStackTraceOnErrorSignal(argv[0]);
248   PrettyStackTraceProgram X(argc, argv);
249   cl::ParseCommandLineOptions(argc, argv);
250
251   llvm_shutdown_obj Y;
252
253   return TableGenMain(argv[0], &LLVMTableGenMain);
254 }
255
256 #ifdef __has_feature
257 #if __has_feature(address_sanitizer)
258 #include <sanitizer/lsan_interface.h>
259 // Disable LeakSanitizer for this binary as it has too many leaks that are not
260 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
261 LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; }
262 #endif  // __has_feature(address_sanitizer)
263 #endif  // defined(__has_feature)