blob: 817663b06e29b33058120263af882a9473687f06 [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//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Misha Brukman650ba8e2005-04-22 00:00:37 +00006//
John Criswelld3032032003-10-20 20:20:30 +00007//===----------------------------------------------------------------------===//
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00008//
Peter Collingbourne84c287e2011-10-01 16:41:13 +00009// This file contains the main function for LLVM's TableGen.
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000010//
11//===----------------------------------------------------------------------===//
12
Jakob Stoklund Olesene6aed132012-06-11 15:37:55 +000013#include "TableGenBackends.h" // Declares all backends.
Chris Lattneree3c74f2009-07-08 18:44:05 +000014#include "llvm/Support/CommandLine.h"
Craig Topperdc6c3fc2016-01-04 04:51:51 +000015#include "llvm/Support/ManagedStatic.h"
Chris Lattneree3c74f2009-07-08 18:44:05 +000016#include "llvm/Support/PrettyStackTrace.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000017#include "llvm/Support/Signals.h"
Peter Collingbourne84c287e2011-10-01 16:41:13 +000018#include "llvm/TableGen/Main.h"
19#include "llvm/TableGen/Record.h"
James Molloyf1653b52014-06-17 13:10:38 +000020#include "llvm/TableGen/SetTheory.h"
Peter Collingbourne84c287e2011-10-01 16:41:13 +000021
Chris Lattner68478662004-08-01 03:55:39 +000022using namespace llvm;
Brian Gaeke960707c2003-11-11 22:41:34 +000023
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000024enum ActionType {
25 PrintRecords,
Simon Tatham6a8c6ca2018-07-11 08:40:19 +000026 DumpJSON,
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000027 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,
Daniel Sanders505d7f32019-10-02 21:13:07 +000052 GenGICombiner,
Ayman Musa850fc972017-03-07 08:11:19 +000053 GenX86EVEX2VEXTables,
Ayman Musa993339b2017-10-08 09:20:32 +000054 GenX86FoldTables,
Daniel Sandersd64d50242017-01-19 11:15:55 +000055 GenRegisterBank,
Clement Courbet41c8af32018-10-25 07:44:01 +000056 GenExegesis,
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000057};
58
Daniel Sanders6cbc9292019-02-11 23:02:02 +000059namespace llvm {
60/// Storage for TimeRegionsOpt as a global so that backends aren't required to
61/// include CommandLine.h
62bool TimeRegions = false;
63} // end namespace llvm
64
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000065namespace {
Daniel Sanders9ac0cda2019-10-02 19:56:04 +000066cl::opt<ActionType> Action(
67 cl::desc("Action to perform:"),
68 cl::values(
69 clEnumValN(PrintRecords, "print-records",
70 "Print all records to stdout (default)"),
71 clEnumValN(DumpJSON, "dump-json",
72 "Dump all records as machine-readable JSON"),
73 clEnumValN(GenEmitter, "gen-emitter", "Generate machine code emitter"),
74 clEnumValN(GenRegisterInfo, "gen-register-info",
75 "Generate registers and register classes info"),
76 clEnumValN(GenInstrInfo, "gen-instr-info",
77 "Generate instruction descriptions"),
78 clEnumValN(GenInstrDocs, "gen-instr-docs",
79 "Generate instruction documentation"),
80 clEnumValN(GenCallingConv, "gen-callingconv",
81 "Generate calling convention descriptions"),
82 clEnumValN(GenAsmWriter, "gen-asm-writer", "Generate assembly writer"),
83 clEnumValN(GenDisassembler, "gen-disassembler",
84 "Generate disassembler"),
85 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
86 "Generate pseudo instruction lowering"),
87 clEnumValN(GenCompressInst, "gen-compress-inst-emitter",
88 "Generate RISCV compressed instructions."),
89 clEnumValN(GenAsmMatcher, "gen-asm-matcher",
90 "Generate assembly instruction matcher"),
91 clEnumValN(GenDAGISel, "gen-dag-isel",
92 "Generate a DAG instruction selector"),
93 clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
94 "Generate DFA Packetizer for VLIW targets"),
95 clEnumValN(GenFastISel, "gen-fast-isel",
96 "Generate a \"fast\" instruction selector"),
97 clEnumValN(GenSubtarget, "gen-subtarget",
98 "Generate subtarget enumerations"),
99 clEnumValN(GenIntrinsicEnums, "gen-intrinsic-enums",
100 "Generate intrinsic enums"),
101 clEnumValN(GenIntrinsicImpl, "gen-intrinsic-impl",
102 "Generate intrinsic information"),
103 clEnumValN(GenTgtIntrinsicEnums, "gen-tgt-intrinsic-enums",
104 "Generate target intrinsic enums"),
105 clEnumValN(GenTgtIntrinsicImpl, "gen-tgt-intrinsic-impl",
106 "Generate target intrinsic information"),
107 clEnumValN(PrintEnums, "print-enums", "Print enum values for a class"),
108 clEnumValN(PrintSets, "print-sets",
109 "Print expanded sets for testing DAG exprs"),
110 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
111 "Generate option definitions"),
112 clEnumValN(GenCTags, "gen-ctags", "Generate ctags-compatible index"),
113 clEnumValN(GenAttributes, "gen-attrs", "Generate attributes"),
114 clEnumValN(GenSearchableTables, "gen-searchable-tables",
115 "Generate generic binary-searchable table"),
116 clEnumValN(GenGlobalISel, "gen-global-isel",
117 "Generate GlobalISel selector"),
Daniel Sanders505d7f32019-10-02 21:13:07 +0000118 clEnumValN(GenGICombiner, "gen-global-isel-combiner",
119 "Generate GlobalISel combiner"),
Daniel Sanders9ac0cda2019-10-02 19:56:04 +0000120 clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables",
121 "Generate X86 EVEX to VEX compress tables"),
122 clEnumValN(GenX86FoldTables, "gen-x86-fold-tables",
123 "Generate X86 fold tables"),
124 clEnumValN(GenRegisterBank, "gen-register-bank",
125 "Generate registers bank descriptions"),
126 clEnumValN(GenExegesis, "gen-exegesis",
127 "Generate llvm-exegesis tables")));
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000128
Daniel Sanders9ac0cda2019-10-02 19:56:04 +0000129cl::OptionCategory PrintEnumsCat("Options for -print-enums");
130cl::opt<std::string> Class("class", cl::desc("Print Enum list for this class"),
131 cl::value_desc("class name"),
132 cl::cat(PrintEnumsCat));
Jakob Stoklund Olesene6aed132012-06-11 15:37:55 +0000133
Daniel Sanders6cbc9292019-02-11 23:02:02 +0000134cl::opt<bool, true>
135 TimeRegionsOpt("time-regions",
136 cl::desc("Time regions of tablegens execution"),
137 cl::location(TimeRegions));
138
Sean Silvaa3bf5612012-10-03 21:29:19 +0000139bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
140 switch (Action) {
141 case PrintRecords:
142 OS << Records; // No argument, dump all contents
143 break;
Simon Tatham6a8c6ca2018-07-11 08:40:19 +0000144 case DumpJSON:
145 EmitJSON(Records, OS);
146 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000147 case GenEmitter:
148 EmitCodeEmitter(Records, OS);
149 break;
150 case GenRegisterInfo:
151 EmitRegisterInfo(Records, OS);
152 break;
153 case GenInstrInfo:
154 EmitInstrInfo(Records, OS);
155 break;
Oliver Stannard174fdef2017-11-14 15:35:15 +0000156 case GenInstrDocs:
157 EmitInstrDocs(Records, OS);
158 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000159 case GenCallingConv:
160 EmitCallingConv(Records, OS);
161 break;
162 case GenAsmWriter:
163 EmitAsmWriter(Records, OS);
164 break;
165 case GenAsmMatcher:
166 EmitAsmMatcher(Records, OS);
167 break;
168 case GenDisassembler:
169 EmitDisassembler(Records, OS);
170 break;
171 case GenPseudoLowering:
172 EmitPseudoLowering(Records, OS);
173 break;
Sameer AbuAsalc1b0e662018-04-06 21:07:05 +0000174 case GenCompressInst:
175 EmitCompressInst(Records, OS);
176 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000177 case GenDAGISel:
178 EmitDAGISel(Records, OS);
179 break;
180 case GenDFAPacketizer:
181 EmitDFAPacketizer(Records, OS);
182 break;
183 case GenFastISel:
184 EmitFastISel(Records, OS);
185 break;
186 case GenSubtarget:
187 EmitSubtarget(Records, OS);
188 break;
Reid Klecknerf5890e42018-06-23 02:02:38 +0000189 case GenIntrinsicEnums:
190 EmitIntrinsicEnums(Records, OS);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000191 break;
Reid Klecknerf5890e42018-06-23 02:02:38 +0000192 case GenIntrinsicImpl:
193 EmitIntrinsicImpl(Records, OS);
194 break;
195 case GenTgtIntrinsicEnums:
196 EmitIntrinsicEnums(Records, OS, true);
197 break;
198 case GenTgtIntrinsicImpl:
199 EmitIntrinsicImpl(Records, OS, true);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000200 break;
Michael J. Spencer41ee0412012-12-05 00:29:32 +0000201 case GenOptParserDefs:
202 EmitOptParser(Records, OS);
203 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000204 case PrintEnums:
205 {
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000206 for (Record *Rec : Records.getAllDerivedDefinitions(Class))
207 OS << Rec->getName() << ", ";
Sean Silvaa3bf5612012-10-03 21:29:19 +0000208 OS << "\n";
209 break;
210 }
211 case PrintSets:
212 {
213 SetTheory Sets;
214 Sets.addFieldExpander("Set", "Elements");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000215 for (Record *Rec : Records.getAllDerivedDefinitions("Set")) {
216 OS << Rec->getName() << " = [";
217 const std::vector<Record*> *Elts = Sets.expand(Rec);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000218 assert(Elts && "Couldn't expand Set instance");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000219 for (Record *Elt : *Elts)
220 OS << ' ' << Elt->getName();
Sean Silvaa3bf5612012-10-03 21:29:19 +0000221 OS << " ]\n";
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +0000222 }
Sean Silvaa3bf5612012-10-03 21:29:19 +0000223 break;
224 }
Sean Silvacdd21b32013-03-21 23:40:38 +0000225 case GenCTags:
226 EmitCTags(Records, OS);
227 break;
Akira Hatanakad9326792015-11-11 20:35:42 +0000228 case GenAttributes:
229 EmitAttributes(Records, OS);
230 break;
Tim Northovere6ae6762016-07-05 21:23:04 +0000231 case GenSearchableTables:
232 EmitSearchableTables(Records, OS);
233 break;
Ahmed Bougacha36f70352016-12-21 23:26:20 +0000234 case GenGlobalISel:
235 EmitGlobalISel(Records, OS);
Daniel Sanders320f79c2017-02-03 14:18:35 +0000236 break;
Daniel Sanders505d7f32019-10-02 21:13:07 +0000237 case GenGICombiner:
238 EmitGICombiner(Records, OS);
239 break;
Daniel Sandersd64d50242017-01-19 11:15:55 +0000240 case GenRegisterBank:
241 EmitRegisterBank(Records, OS);
Ahmed Bougacha36f70352016-12-21 23:26:20 +0000242 break;
Ayman Musa850fc972017-03-07 08:11:19 +0000243 case GenX86EVEX2VEXTables:
244 EmitX86EVEX2VEXTables(Records, OS);
245 break;
Ayman Musa993339b2017-10-08 09:20:32 +0000246 case GenX86FoldTables:
247 EmitX86FoldTables(Records, OS);
248 break;
Clement Courbet41c8af32018-10-25 07:44:01 +0000249 case GenExegesis:
250 EmitExegesis(Records, OS);
251 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000252 }
253
254 return false;
255}
David Blaikiea379b1812011-12-20 02:50:00 +0000256}
Alexis Huntf4cdc842010-05-05 04:13:08 +0000257
Peter Collingbourne84c287e2011-10-01 16:41:13 +0000258int main(int argc, char **argv) {
Richard Smith2ad6d482016-06-09 00:53:21 +0000259 sys::PrintStackTraceOnErrorSignal(argv[0]);
Peter Collingbourne84c287e2011-10-01 16:41:13 +0000260 PrettyStackTraceProgram X(argc, argv);
261 cl::ParseCommandLineOptions(argc, argv);
262
Craig Topperdc6c3fc2016-01-04 04:51:51 +0000263 llvm_shutdown_obj Y;
264
Sean Silvaa3bf5612012-10-03 21:29:19 +0000265 return TableGenMain(argv[0], &LLVMTableGenMain);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000266}
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000267
Kamil Rytarowskib2077fd2019-09-24 11:22:34 +0000268#ifndef __has_feature
269#define __has_feature(x) 0
270#endif
271
272#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) || \
273 __has_feature(leak_sanitizer)
274
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000275#include <sanitizer/lsan_interface.h>
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000276// Disable LeakSanitizer for this binary as it has too many leaks that are not
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000277// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
Francis Ricci8a1c2b42017-09-11 13:50:39 +0000278LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; }
Kamil Rytarowskib2077fd2019-09-24 11:22:34 +0000279
280#endif