blob: cf1404d87692f4c5fa91c60874b581cd2bc1e103 [file] [log] [blame]
Peter Collingbourne84c287e2011-10-01 16:41:13 +00001//===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===//
Misha Brukman650ba8e2005-04-22 00:00:37 +00002//
John Criswelld3032032003-10-20 20:20:30 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner8adcd9f2007-12-29 20:37:13 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukman650ba8e2005-04-22 00:00:37 +00007//
John Criswelld3032032003-10-20 20:20:30 +00008//===----------------------------------------------------------------------===//
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00009//
Peter Collingbourne84c287e2011-10-01 16:41:13 +000010// This file contains the main function for LLVM's TableGen.
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000011//
12//===----------------------------------------------------------------------===//
13
Jakob Stoklund Olesene6aed132012-06-11 15:37:55 +000014#include "TableGenBackends.h" // Declares all backends.
Chris Lattneree3c74f2009-07-08 18:44:05 +000015#include "llvm/Support/CommandLine.h"
Craig Topperdc6c3fc2016-01-04 04:51:51 +000016#include "llvm/Support/ManagedStatic.h"
Chris Lattneree3c74f2009-07-08 18:44:05 +000017#include "llvm/Support/PrettyStackTrace.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000018#include "llvm/Support/Signals.h"
Peter Collingbourne84c287e2011-10-01 16:41:13 +000019#include "llvm/TableGen/Main.h"
20#include "llvm/TableGen/Record.h"
James Molloyf1653b52014-06-17 13:10:38 +000021#include "llvm/TableGen/SetTheory.h"
Peter Collingbourne84c287e2011-10-01 16:41:13 +000022
Chris Lattner68478662004-08-01 03:55:39 +000023using namespace llvm;
Brian Gaeke960707c2003-11-11 22:41:34 +000024
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000025enum ActionType {
26 PrintRecords,
27 GenEmitter,
Evan Chengd9997ac2011-06-27 18:32:37 +000028 GenRegisterInfo,
Evan Cheng1e210d02011-06-28 20:07:07 +000029 GenInstrInfo,
Oliver Stannard174fdef2017-11-14 15:35:15 +000030 GenInstrDocs,
Evan Cheng1e210d02011-06-28 20:07:07 +000031 GenAsmWriter,
32 GenAsmMatcher,
Daniel Dunbare5024332009-11-25 02:13:23 +000033 GenDisassembler,
Jim Grosbachbcb36be2011-07-08 17:36:35 +000034 GenPseudoLowering,
Sameer AbuAsalc1b0e662018-04-06 21:07:05 +000035 GenCompressInst,
Chris Lattnercbebe462007-02-27 22:08:27 +000036 GenCallingConv,
Chris Lattner90d00042005-09-03 01:14:03 +000037 GenDAGISel,
Anshuman Dasgupta08ebdc12011-12-01 21:10:21 +000038 GenDFAPacketizer,
Dan Gohmanb2226e22008-08-13 20:19:35 +000039 GenFastISel,
Jim Laskey9ed90322005-10-21 19:05:19 +000040 GenSubtarget,
Reid Klecknerf5890e42018-06-23 02:02:38 +000041 GenIntrinsicEnums,
42 GenIntrinsicImpl,
43 GenTgtIntrinsicEnums,
44 GenTgtIntrinsicImpl,
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +000045 PrintEnums,
Michael J. Spencer41ee0412012-12-05 00:29:32 +000046 PrintSets,
Sean Silvacdd21b32013-03-21 23:40:38 +000047 GenOptParserDefs,
Akira Hatanakad9326792015-11-11 20:35:42 +000048 GenCTags,
Tim Northovere6ae6762016-07-05 21:23:04 +000049 GenAttributes,
50 GenSearchableTables,
Ahmed Bougacha36f70352016-12-21 23:26:20 +000051 GenGlobalISel,
Ayman Musa850fc972017-03-07 08:11:19 +000052 GenX86EVEX2VEXTables,
Ayman Musa993339b2017-10-08 09:20:32 +000053 GenX86FoldTables,
Daniel Sandersd64d50242017-01-19 11:15:55 +000054 GenRegisterBank,
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000055};
56
57namespace {
58 cl::opt<ActionType>
59 Action(cl::desc("Action to perform:"),
60 cl::values(clEnumValN(PrintRecords, "print-records",
61 "Print all records to stdout (default)"),
62 clEnumValN(GenEmitter, "gen-emitter",
63 "Generate machine code emitter"),
Evan Cheng24753312011-06-24 01:44:41 +000064 clEnumValN(GenRegisterInfo, "gen-register-info",
Evan Chengd9997ac2011-06-27 18:32:37 +000065 "Generate registers and register classes info"),
Evan Cheng1e210d02011-06-28 20:07:07 +000066 clEnumValN(GenInstrInfo, "gen-instr-info",
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000067 "Generate instruction descriptions"),
Oliver Stannard174fdef2017-11-14 15:35:15 +000068 clEnumValN(GenInstrDocs, "gen-instr-docs",
69 "Generate instruction documentation"),
Chris Lattnercbebe462007-02-27 22:08:27 +000070 clEnumValN(GenCallingConv, "gen-callingconv",
71 "Generate calling convention descriptions"),
Chris Lattner1c4ae852004-08-01 05:59:33 +000072 clEnumValN(GenAsmWriter, "gen-asm-writer",
73 "Generate assembly writer"),
Daniel Dunbare5024332009-11-25 02:13:23 +000074 clEnumValN(GenDisassembler, "gen-disassembler",
75 "Generate disassembler"),
Jim Grosbachbcb36be2011-07-08 17:36:35 +000076 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
77 "Generate pseudo instruction lowering"),
Sameer AbuAsalc1b0e662018-04-06 21:07:05 +000078 clEnumValN(GenCompressInst, "gen-compress-inst-emitter",
79 "Generate RISCV compressed instructions."),
Daniel Dunbar3085b572009-07-11 19:39:44 +000080 clEnumValN(GenAsmMatcher, "gen-asm-matcher",
81 "Generate assembly instruction matcher"),
Chris Lattner90d00042005-09-03 01:14:03 +000082 clEnumValN(GenDAGISel, "gen-dag-isel",
83 "Generate a DAG instruction selector"),
Anshuman Dasgupta08ebdc12011-12-01 21:10:21 +000084 clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
85 "Generate DFA Packetizer for VLIW targets"),
Dan Gohmanb2226e22008-08-13 20:19:35 +000086 clEnumValN(GenFastISel, "gen-fast-isel",
87 "Generate a \"fast\" instruction selector"),
Jim Laskey9ed90322005-10-21 19:05:19 +000088 clEnumValN(GenSubtarget, "gen-subtarget",
89 "Generate subtarget enumerations"),
Reid Klecknerf5890e42018-06-23 02:02:38 +000090 clEnumValN(GenIntrinsicEnums, "gen-intrinsic-enums",
91 "Generate intrinsic enums"),
92 clEnumValN(GenIntrinsicImpl, "gen-intrinsic-impl",
Chris Lattnerc313d0b2006-03-03 02:32:46 +000093 "Generate intrinsic information"),
Reid Klecknerf5890e42018-06-23 02:02:38 +000094 clEnumValN(GenTgtIntrinsicEnums, "gen-tgt-intrinsic-enums",
95 "Generate target intrinsic enums"),
96 clEnumValN(GenTgtIntrinsicImpl, "gen-tgt-intrinsic-impl",
Dale Johannesenb842d522009-02-05 01:49:45 +000097 "Generate target intrinsic information"),
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000098 clEnumValN(PrintEnums, "print-enums",
99 "Print enum values for a class"),
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +0000100 clEnumValN(PrintSets, "print-sets",
101 "Print expanded sets for testing DAG exprs"),
Michael J. Spencer41ee0412012-12-05 00:29:32 +0000102 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
103 "Generate option definitions"),
Sean Silvacdd21b32013-03-21 23:40:38 +0000104 clEnumValN(GenCTags, "gen-ctags",
105 "Generate ctags-compatible index"),
Akira Hatanakad9326792015-11-11 20:35:42 +0000106 clEnumValN(GenAttributes, "gen-attrs",
107 "Generate attributes"),
Tim Northovere6ae6762016-07-05 21:23:04 +0000108 clEnumValN(GenSearchableTables, "gen-searchable-tables",
Ahmed Bougacha36f70352016-12-21 23:26:20 +0000109 "Generate generic binary-searchable table"),
110 clEnumValN(GenGlobalISel, "gen-global-isel",
Daniel Sandersd64d50242017-01-19 11:15:55 +0000111 "Generate GlobalISel selector"),
Ayman Musa850fc972017-03-07 08:11:19 +0000112 clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables",
113 "Generate X86 EVEX to VEX compress tables"),
Ayman Musa993339b2017-10-08 09:20:32 +0000114 clEnumValN(GenX86FoldTables, "gen-x86-fold-tables",
115 "Generate X86 fold tables"),
Daniel Sandersd64d50242017-01-19 11:15:55 +0000116 clEnumValN(GenRegisterBank, "gen-register-bank",
117 "Generate registers bank descriptions")));
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000118
Daniel Sanders0848b232017-03-27 13:15:13 +0000119 cl::OptionCategory PrintEnumsCat("Options for -print-enums");
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000120 cl::opt<std::string>
121 Class("class", cl::desc("Print Enum list for this class"),
Daniel Sanders0848b232017-03-27 13:15:13 +0000122 cl::value_desc("class name"), cl::cat(PrintEnumsCat));
Jakob Stoklund Olesene6aed132012-06-11 15:37:55 +0000123
Sean Silvaa3bf5612012-10-03 21:29:19 +0000124bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
125 switch (Action) {
126 case PrintRecords:
127 OS << Records; // No argument, dump all contents
128 break;
129 case GenEmitter:
130 EmitCodeEmitter(Records, OS);
131 break;
132 case GenRegisterInfo:
133 EmitRegisterInfo(Records, OS);
134 break;
135 case GenInstrInfo:
136 EmitInstrInfo(Records, OS);
137 break;
Oliver Stannard174fdef2017-11-14 15:35:15 +0000138 case GenInstrDocs:
139 EmitInstrDocs(Records, OS);
140 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000141 case GenCallingConv:
142 EmitCallingConv(Records, OS);
143 break;
144 case GenAsmWriter:
145 EmitAsmWriter(Records, OS);
146 break;
147 case GenAsmMatcher:
148 EmitAsmMatcher(Records, OS);
149 break;
150 case GenDisassembler:
151 EmitDisassembler(Records, OS);
152 break;
153 case GenPseudoLowering:
154 EmitPseudoLowering(Records, OS);
155 break;
Sameer AbuAsalc1b0e662018-04-06 21:07:05 +0000156 case GenCompressInst:
157 EmitCompressInst(Records, OS);
158 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000159 case GenDAGISel:
160 EmitDAGISel(Records, OS);
161 break;
162 case GenDFAPacketizer:
163 EmitDFAPacketizer(Records, OS);
164 break;
165 case GenFastISel:
166 EmitFastISel(Records, OS);
167 break;
168 case GenSubtarget:
169 EmitSubtarget(Records, OS);
170 break;
Reid Klecknerf5890e42018-06-23 02:02:38 +0000171 case GenIntrinsicEnums:
172 EmitIntrinsicEnums(Records, OS);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000173 break;
Reid Klecknerf5890e42018-06-23 02:02:38 +0000174 case GenIntrinsicImpl:
175 EmitIntrinsicImpl(Records, OS);
176 break;
177 case GenTgtIntrinsicEnums:
178 EmitIntrinsicEnums(Records, OS, true);
179 break;
180 case GenTgtIntrinsicImpl:
181 EmitIntrinsicImpl(Records, OS, true);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000182 break;
Michael J. Spencer41ee0412012-12-05 00:29:32 +0000183 case GenOptParserDefs:
184 EmitOptParser(Records, OS);
185 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000186 case PrintEnums:
187 {
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000188 for (Record *Rec : Records.getAllDerivedDefinitions(Class))
189 OS << Rec->getName() << ", ";
Sean Silvaa3bf5612012-10-03 21:29:19 +0000190 OS << "\n";
191 break;
192 }
193 case PrintSets:
194 {
195 SetTheory Sets;
196 Sets.addFieldExpander("Set", "Elements");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000197 for (Record *Rec : Records.getAllDerivedDefinitions("Set")) {
198 OS << Rec->getName() << " = [";
199 const std::vector<Record*> *Elts = Sets.expand(Rec);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000200 assert(Elts && "Couldn't expand Set instance");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000201 for (Record *Elt : *Elts)
202 OS << ' ' << Elt->getName();
Sean Silvaa3bf5612012-10-03 21:29:19 +0000203 OS << " ]\n";
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +0000204 }
Sean Silvaa3bf5612012-10-03 21:29:19 +0000205 break;
206 }
Sean Silvacdd21b32013-03-21 23:40:38 +0000207 case GenCTags:
208 EmitCTags(Records, OS);
209 break;
Akira Hatanakad9326792015-11-11 20:35:42 +0000210 case GenAttributes:
211 EmitAttributes(Records, OS);
212 break;
Tim Northovere6ae6762016-07-05 21:23:04 +0000213 case GenSearchableTables:
214 EmitSearchableTables(Records, OS);
215 break;
Ahmed Bougacha36f70352016-12-21 23:26:20 +0000216 case GenGlobalISel:
217 EmitGlobalISel(Records, OS);
Daniel Sanders320f79c2017-02-03 14:18:35 +0000218 break;
Daniel Sandersd64d50242017-01-19 11:15:55 +0000219 case GenRegisterBank:
220 EmitRegisterBank(Records, OS);
Ahmed Bougacha36f70352016-12-21 23:26:20 +0000221 break;
Ayman Musa850fc972017-03-07 08:11:19 +0000222 case GenX86EVEX2VEXTables:
223 EmitX86EVEX2VEXTables(Records, OS);
224 break;
Ayman Musa993339b2017-10-08 09:20:32 +0000225 case GenX86FoldTables:
226 EmitX86FoldTables(Records, OS);
227 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000228 }
229
230 return false;
231}
David Blaikiea379b1812011-12-20 02:50:00 +0000232}
Alexis Huntf4cdc842010-05-05 04:13:08 +0000233
Peter Collingbourne84c287e2011-10-01 16:41:13 +0000234int main(int argc, char **argv) {
Richard Smith2ad6d482016-06-09 00:53:21 +0000235 sys::PrintStackTraceOnErrorSignal(argv[0]);
Peter Collingbourne84c287e2011-10-01 16:41:13 +0000236 PrettyStackTraceProgram X(argc, argv);
237 cl::ParseCommandLineOptions(argc, argv);
238
Craig Topperdc6c3fc2016-01-04 04:51:51 +0000239 llvm_shutdown_obj Y;
240
Sean Silvaa3bf5612012-10-03 21:29:19 +0000241 return TableGenMain(argv[0], &LLVMTableGenMain);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000242}
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000243
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000244#ifdef __has_feature
245#if __has_feature(address_sanitizer)
246#include <sanitizer/lsan_interface.h>
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000247// Disable LeakSanitizer for this binary as it has too many leaks that are not
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000248// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
Francis Ricci8a1c2b42017-09-11 13:50:39 +0000249LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; }
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000250#endif // __has_feature(address_sanitizer)
251#endif // defined(__has_feature)