blob: 7353c538270d2c0cdb010a895bd1c91f391ecbda [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/Error.h"
20#include "llvm/TableGen/Main.h"
21#include "llvm/TableGen/Record.h"
James Molloyf1653b52014-06-17 13:10:38 +000022#include "llvm/TableGen/SetTheory.h"
Peter Collingbourne84c287e2011-10-01 16:41:13 +000023
Chris Lattner68478662004-08-01 03:55:39 +000024using namespace llvm;
Brian Gaeke960707c2003-11-11 22:41:34 +000025
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000026enum ActionType {
27 PrintRecords,
28 GenEmitter,
Evan Chengd9997ac2011-06-27 18:32:37 +000029 GenRegisterInfo,
Evan Cheng1e210d02011-06-28 20:07:07 +000030 GenInstrInfo,
31 GenAsmWriter,
32 GenAsmMatcher,
Daniel Dunbare5024332009-11-25 02:13:23 +000033 GenDisassembler,
Jim Grosbachbcb36be2011-07-08 17:36:35 +000034 GenPseudoLowering,
Chris Lattnercbebe462007-02-27 22:08:27 +000035 GenCallingConv,
Chris Lattner90d00042005-09-03 01:14:03 +000036 GenDAGISel,
Anshuman Dasgupta08ebdc12011-12-01 21:10:21 +000037 GenDFAPacketizer,
Dan Gohmanb2226e22008-08-13 20:19:35 +000038 GenFastISel,
Jim Laskey9ed90322005-10-21 19:05:19 +000039 GenSubtarget,
Chris Lattnerc313d0b2006-03-03 02:32:46 +000040 GenIntrinsic,
Dale Johannesenb842d522009-02-05 01:49:45 +000041 GenTgtIntrinsic,
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +000042 PrintEnums,
Michael J. Spencer41ee0412012-12-05 00:29:32 +000043 PrintSets,
Sean Silvacdd21b32013-03-21 23:40:38 +000044 GenOptParserDefs,
Akira Hatanakad9326792015-11-11 20:35:42 +000045 GenCTags,
Tim Northovere6ae6762016-07-05 21:23:04 +000046 GenAttributes,
47 GenSearchableTables,
Ahmed Bougacha36f70352016-12-21 23:26:20 +000048 GenGlobalISel,
Ayman Musa850fc972017-03-07 08:11:19 +000049 GenX86EVEX2VEXTables,
Ayman Musa993339b2017-10-08 09:20:32 +000050 GenX86FoldTables,
Daniel Sandersd64d50242017-01-19 11:15:55 +000051 GenRegisterBank,
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000052};
53
54namespace {
55 cl::opt<ActionType>
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"),
Evan Cheng24753312011-06-24 01:44:41 +000061 clEnumValN(GenRegisterInfo, "gen-register-info",
Evan Chengd9997ac2011-06-27 18:32:37 +000062 "Generate registers and register classes info"),
Evan Cheng1e210d02011-06-28 20:07:07 +000063 clEnumValN(GenInstrInfo, "gen-instr-info",
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000064 "Generate instruction descriptions"),
Chris Lattnercbebe462007-02-27 22:08:27 +000065 clEnumValN(GenCallingConv, "gen-callingconv",
66 "Generate calling convention descriptions"),
Chris Lattner1c4ae852004-08-01 05:59:33 +000067 clEnumValN(GenAsmWriter, "gen-asm-writer",
68 "Generate assembly writer"),
Daniel Dunbare5024332009-11-25 02:13:23 +000069 clEnumValN(GenDisassembler, "gen-disassembler",
70 "Generate disassembler"),
Jim Grosbachbcb36be2011-07-08 17:36:35 +000071 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
72 "Generate pseudo instruction lowering"),
Daniel Dunbar3085b572009-07-11 19:39:44 +000073 clEnumValN(GenAsmMatcher, "gen-asm-matcher",
74 "Generate assembly instruction matcher"),
Chris Lattner90d00042005-09-03 01:14:03 +000075 clEnumValN(GenDAGISel, "gen-dag-isel",
76 "Generate a DAG instruction selector"),
Anshuman Dasgupta08ebdc12011-12-01 21:10:21 +000077 clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
78 "Generate DFA Packetizer for VLIW targets"),
Dan Gohmanb2226e22008-08-13 20:19:35 +000079 clEnumValN(GenFastISel, "gen-fast-isel",
80 "Generate a \"fast\" instruction selector"),
Jim Laskey9ed90322005-10-21 19:05:19 +000081 clEnumValN(GenSubtarget, "gen-subtarget",
82 "Generate subtarget enumerations"),
Chris Lattnerc313d0b2006-03-03 02:32:46 +000083 clEnumValN(GenIntrinsic, "gen-intrinsic",
84 "Generate intrinsic information"),
Dale Johannesenb842d522009-02-05 01:49:45 +000085 clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
86 "Generate target intrinsic information"),
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000087 clEnumValN(PrintEnums, "print-enums",
88 "Print enum values for a class"),
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +000089 clEnumValN(PrintSets, "print-sets",
90 "Print expanded sets for testing DAG exprs"),
Michael J. Spencer41ee0412012-12-05 00:29:32 +000091 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
92 "Generate option definitions"),
Sean Silvacdd21b32013-03-21 23:40:38 +000093 clEnumValN(GenCTags, "gen-ctags",
94 "Generate ctags-compatible index"),
Akira Hatanakad9326792015-11-11 20:35:42 +000095 clEnumValN(GenAttributes, "gen-attrs",
96 "Generate attributes"),
Tim Northovere6ae6762016-07-05 21:23:04 +000097 clEnumValN(GenSearchableTables, "gen-searchable-tables",
Ahmed Bougacha36f70352016-12-21 23:26:20 +000098 "Generate generic binary-searchable table"),
99 clEnumValN(GenGlobalISel, "gen-global-isel",
Daniel Sandersd64d50242017-01-19 11:15:55 +0000100 "Generate GlobalISel selector"),
Ayman Musa850fc972017-03-07 08:11:19 +0000101 clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables",
102 "Generate X86 EVEX to VEX compress tables"),
Ayman Musa993339b2017-10-08 09:20:32 +0000103 clEnumValN(GenX86FoldTables, "gen-x86-fold-tables",
104 "Generate X86 fold tables"),
Daniel Sandersd64d50242017-01-19 11:15:55 +0000105 clEnumValN(GenRegisterBank, "gen-register-bank",
106 "Generate registers bank descriptions")));
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000107
Daniel Sanders0848b232017-03-27 13:15:13 +0000108 cl::OptionCategory PrintEnumsCat("Options for -print-enums");
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000109 cl::opt<std::string>
110 Class("class", cl::desc("Print Enum list for this class"),
Daniel Sanders0848b232017-03-27 13:15:13 +0000111 cl::value_desc("class name"), cl::cat(PrintEnumsCat));
Jakob Stoklund Olesene6aed132012-06-11 15:37:55 +0000112
Sean Silvaa3bf5612012-10-03 21:29:19 +0000113bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
114 switch (Action) {
115 case PrintRecords:
116 OS << Records; // No argument, dump all contents
117 break;
118 case GenEmitter:
119 EmitCodeEmitter(Records, OS);
120 break;
121 case GenRegisterInfo:
122 EmitRegisterInfo(Records, OS);
123 break;
124 case GenInstrInfo:
125 EmitInstrInfo(Records, OS);
126 break;
127 case GenCallingConv:
128 EmitCallingConv(Records, OS);
129 break;
130 case GenAsmWriter:
131 EmitAsmWriter(Records, OS);
132 break;
133 case GenAsmMatcher:
134 EmitAsmMatcher(Records, OS);
135 break;
136 case GenDisassembler:
137 EmitDisassembler(Records, OS);
138 break;
139 case GenPseudoLowering:
140 EmitPseudoLowering(Records, OS);
141 break;
142 case GenDAGISel:
143 EmitDAGISel(Records, OS);
144 break;
145 case GenDFAPacketizer:
146 EmitDFAPacketizer(Records, OS);
147 break;
148 case GenFastISel:
149 EmitFastISel(Records, OS);
150 break;
151 case GenSubtarget:
152 EmitSubtarget(Records, OS);
153 break;
154 case GenIntrinsic:
155 EmitIntrinsics(Records, OS);
156 break;
157 case GenTgtIntrinsic:
158 EmitIntrinsics(Records, OS, true);
159 break;
Michael J. Spencer41ee0412012-12-05 00:29:32 +0000160 case GenOptParserDefs:
161 EmitOptParser(Records, OS);
162 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000163 case PrintEnums:
164 {
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000165 for (Record *Rec : Records.getAllDerivedDefinitions(Class))
166 OS << Rec->getName() << ", ";
Sean Silvaa3bf5612012-10-03 21:29:19 +0000167 OS << "\n";
168 break;
169 }
170 case PrintSets:
171 {
172 SetTheory Sets;
173 Sets.addFieldExpander("Set", "Elements");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000174 for (Record *Rec : Records.getAllDerivedDefinitions("Set")) {
175 OS << Rec->getName() << " = [";
176 const std::vector<Record*> *Elts = Sets.expand(Rec);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000177 assert(Elts && "Couldn't expand Set instance");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000178 for (Record *Elt : *Elts)
179 OS << ' ' << Elt->getName();
Sean Silvaa3bf5612012-10-03 21:29:19 +0000180 OS << " ]\n";
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +0000181 }
Sean Silvaa3bf5612012-10-03 21:29:19 +0000182 break;
183 }
Sean Silvacdd21b32013-03-21 23:40:38 +0000184 case GenCTags:
185 EmitCTags(Records, OS);
186 break;
Akira Hatanakad9326792015-11-11 20:35:42 +0000187 case GenAttributes:
188 EmitAttributes(Records, OS);
189 break;
Tim Northovere6ae6762016-07-05 21:23:04 +0000190 case GenSearchableTables:
191 EmitSearchableTables(Records, OS);
192 break;
Ahmed Bougacha36f70352016-12-21 23:26:20 +0000193 case GenGlobalISel:
194 EmitGlobalISel(Records, OS);
Daniel Sanders320f79c2017-02-03 14:18:35 +0000195 break;
Daniel Sandersd64d50242017-01-19 11:15:55 +0000196 case GenRegisterBank:
197 EmitRegisterBank(Records, OS);
Ahmed Bougacha36f70352016-12-21 23:26:20 +0000198 break;
Ayman Musa850fc972017-03-07 08:11:19 +0000199 case GenX86EVEX2VEXTables:
200 EmitX86EVEX2VEXTables(Records, OS);
201 break;
Ayman Musa993339b2017-10-08 09:20:32 +0000202 case GenX86FoldTables:
203 EmitX86FoldTables(Records, OS);
204 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000205 }
206
207 return false;
208}
David Blaikiea379b1812011-12-20 02:50:00 +0000209}
Alexis Huntf4cdc842010-05-05 04:13:08 +0000210
Peter Collingbourne84c287e2011-10-01 16:41:13 +0000211int main(int argc, char **argv) {
Richard Smith2ad6d482016-06-09 00:53:21 +0000212 sys::PrintStackTraceOnErrorSignal(argv[0]);
Peter Collingbourne84c287e2011-10-01 16:41:13 +0000213 PrettyStackTraceProgram X(argc, argv);
214 cl::ParseCommandLineOptions(argc, argv);
215
Craig Topperdc6c3fc2016-01-04 04:51:51 +0000216 llvm_shutdown_obj Y;
217
Sean Silvaa3bf5612012-10-03 21:29:19 +0000218 return TableGenMain(argv[0], &LLVMTableGenMain);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000219}
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000220
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000221#ifdef __has_feature
222#if __has_feature(address_sanitizer)
223#include <sanitizer/lsan_interface.h>
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000224// Disable LeakSanitizer for this binary as it has too many leaks that are not
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000225// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
Francis Ricci8a1c2b42017-09-11 13:50:39 +0000226LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; }
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000227#endif // __has_feature(address_sanitizer)
228#endif // defined(__has_feature)