blob: 086560e7b2657dff139226726442d59c71f6e303 [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,
Jonas Devlieghere64ada7a2019-11-22 14:07:21 -080048 GenOptRST,
Akira Hatanakad9326792015-11-11 20:35:42 +000049 GenCTags,
Tim Northovere6ae6762016-07-05 21:23:04 +000050 GenAttributes,
51 GenSearchableTables,
Ahmed Bougacha36f70352016-12-21 23:26:20 +000052 GenGlobalISel,
Daniel Sanders505d7f32019-10-02 21:13:07 +000053 GenGICombiner,
Ayman Musa850fc972017-03-07 08:11:19 +000054 GenX86EVEX2VEXTables,
Ayman Musa993339b2017-10-08 09:20:32 +000055 GenX86FoldTables,
Daniel Sandersd64d50242017-01-19 11:15:55 +000056 GenRegisterBank,
Clement Courbet41c8af32018-10-25 07:44:01 +000057 GenExegesis,
James Molloye6674012019-10-04 09:03:36 +000058 GenAutomata,
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000059};
60
Daniel Sanders6cbc9292019-02-11 23:02:02 +000061namespace llvm {
62/// Storage for TimeRegionsOpt as a global so that backends aren't required to
63/// include CommandLine.h
64bool TimeRegions = false;
65} // end namespace llvm
66
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000067namespace {
Daniel Sanders9ac0cda2019-10-02 19:56:04 +000068cl::opt<ActionType> Action(
69 cl::desc("Action to perform:"),
70 cl::values(
71 clEnumValN(PrintRecords, "print-records",
72 "Print all records to stdout (default)"),
73 clEnumValN(DumpJSON, "dump-json",
74 "Dump all records as machine-readable JSON"),
75 clEnumValN(GenEmitter, "gen-emitter", "Generate machine code emitter"),
76 clEnumValN(GenRegisterInfo, "gen-register-info",
77 "Generate registers and register classes info"),
78 clEnumValN(GenInstrInfo, "gen-instr-info",
79 "Generate instruction descriptions"),
80 clEnumValN(GenInstrDocs, "gen-instr-docs",
81 "Generate instruction documentation"),
82 clEnumValN(GenCallingConv, "gen-callingconv",
83 "Generate calling convention descriptions"),
84 clEnumValN(GenAsmWriter, "gen-asm-writer", "Generate assembly writer"),
85 clEnumValN(GenDisassembler, "gen-disassembler",
86 "Generate disassembler"),
87 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
88 "Generate pseudo instruction lowering"),
89 clEnumValN(GenCompressInst, "gen-compress-inst-emitter",
90 "Generate RISCV compressed instructions."),
91 clEnumValN(GenAsmMatcher, "gen-asm-matcher",
92 "Generate assembly instruction matcher"),
93 clEnumValN(GenDAGISel, "gen-dag-isel",
94 "Generate a DAG instruction selector"),
95 clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
96 "Generate DFA Packetizer for VLIW targets"),
97 clEnumValN(GenFastISel, "gen-fast-isel",
98 "Generate a \"fast\" instruction selector"),
99 clEnumValN(GenSubtarget, "gen-subtarget",
100 "Generate subtarget enumerations"),
101 clEnumValN(GenIntrinsicEnums, "gen-intrinsic-enums",
102 "Generate intrinsic enums"),
103 clEnumValN(GenIntrinsicImpl, "gen-intrinsic-impl",
104 "Generate intrinsic information"),
105 clEnumValN(GenTgtIntrinsicEnums, "gen-tgt-intrinsic-enums",
106 "Generate target intrinsic enums"),
107 clEnumValN(GenTgtIntrinsicImpl, "gen-tgt-intrinsic-impl",
108 "Generate target intrinsic information"),
109 clEnumValN(PrintEnums, "print-enums", "Print enum values for a class"),
110 clEnumValN(PrintSets, "print-sets",
111 "Print expanded sets for testing DAG exprs"),
112 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
113 "Generate option definitions"),
Jonas Devlieghere64ada7a2019-11-22 14:07:21 -0800114 clEnumValN(GenOptRST, "gen-opt-rst", "Generate option RST"),
Daniel Sanders9ac0cda2019-10-02 19:56:04 +0000115 clEnumValN(GenCTags, "gen-ctags", "Generate ctags-compatible index"),
116 clEnumValN(GenAttributes, "gen-attrs", "Generate attributes"),
117 clEnumValN(GenSearchableTables, "gen-searchable-tables",
118 "Generate generic binary-searchable table"),
119 clEnumValN(GenGlobalISel, "gen-global-isel",
120 "Generate GlobalISel selector"),
Daniel Sanders505d7f32019-10-02 21:13:07 +0000121 clEnumValN(GenGICombiner, "gen-global-isel-combiner",
122 "Generate GlobalISel combiner"),
Daniel Sanders9ac0cda2019-10-02 19:56:04 +0000123 clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables",
124 "Generate X86 EVEX to VEX compress tables"),
125 clEnumValN(GenX86FoldTables, "gen-x86-fold-tables",
126 "Generate X86 fold tables"),
127 clEnumValN(GenRegisterBank, "gen-register-bank",
128 "Generate registers bank descriptions"),
129 clEnumValN(GenExegesis, "gen-exegesis",
James Molloye6674012019-10-04 09:03:36 +0000130 "Generate llvm-exegesis tables"),
Jonas Devlieghere64ada7a2019-11-22 14:07:21 -0800131 clEnumValN(GenAutomata, "gen-automata", "Generate generic automata")));
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000132
Daniel Sanders9ac0cda2019-10-02 19:56:04 +0000133cl::OptionCategory PrintEnumsCat("Options for -print-enums");
134cl::opt<std::string> Class("class", cl::desc("Print Enum list for this class"),
135 cl::value_desc("class name"),
136 cl::cat(PrintEnumsCat));
Jakob Stoklund Olesene6aed132012-06-11 15:37:55 +0000137
Daniel Sanders6cbc9292019-02-11 23:02:02 +0000138cl::opt<bool, true>
139 TimeRegionsOpt("time-regions",
140 cl::desc("Time regions of tablegens execution"),
141 cl::location(TimeRegions));
142
Sean Silvaa3bf5612012-10-03 21:29:19 +0000143bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
144 switch (Action) {
145 case PrintRecords:
146 OS << Records; // No argument, dump all contents
147 break;
Simon Tatham6a8c6ca2018-07-11 08:40:19 +0000148 case DumpJSON:
149 EmitJSON(Records, OS);
150 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000151 case GenEmitter:
152 EmitCodeEmitter(Records, OS);
153 break;
154 case GenRegisterInfo:
155 EmitRegisterInfo(Records, OS);
156 break;
157 case GenInstrInfo:
158 EmitInstrInfo(Records, OS);
159 break;
Oliver Stannard174fdef2017-11-14 15:35:15 +0000160 case GenInstrDocs:
161 EmitInstrDocs(Records, OS);
162 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000163 case GenCallingConv:
164 EmitCallingConv(Records, OS);
165 break;
166 case GenAsmWriter:
167 EmitAsmWriter(Records, OS);
168 break;
169 case GenAsmMatcher:
170 EmitAsmMatcher(Records, OS);
171 break;
172 case GenDisassembler:
173 EmitDisassembler(Records, OS);
174 break;
175 case GenPseudoLowering:
176 EmitPseudoLowering(Records, OS);
177 break;
Sameer AbuAsalc1b0e662018-04-06 21:07:05 +0000178 case GenCompressInst:
179 EmitCompressInst(Records, OS);
180 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000181 case GenDAGISel:
182 EmitDAGISel(Records, OS);
183 break;
184 case GenDFAPacketizer:
185 EmitDFAPacketizer(Records, OS);
186 break;
187 case GenFastISel:
188 EmitFastISel(Records, OS);
189 break;
190 case GenSubtarget:
191 EmitSubtarget(Records, OS);
192 break;
Reid Klecknerf5890e42018-06-23 02:02:38 +0000193 case GenIntrinsicEnums:
194 EmitIntrinsicEnums(Records, OS);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000195 break;
Reid Klecknerf5890e42018-06-23 02:02:38 +0000196 case GenIntrinsicImpl:
197 EmitIntrinsicImpl(Records, OS);
198 break;
199 case GenTgtIntrinsicEnums:
200 EmitIntrinsicEnums(Records, OS, true);
201 break;
202 case GenTgtIntrinsicImpl:
203 EmitIntrinsicImpl(Records, OS, true);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000204 break;
Michael J. Spencer41ee0412012-12-05 00:29:32 +0000205 case GenOptParserDefs:
206 EmitOptParser(Records, OS);
207 break;
Jonas Devlieghere64ada7a2019-11-22 14:07:21 -0800208 case GenOptRST:
209 EmitOptRST(Records, OS);
210 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000211 case PrintEnums:
212 {
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000213 for (Record *Rec : Records.getAllDerivedDefinitions(Class))
214 OS << Rec->getName() << ", ";
Sean Silvaa3bf5612012-10-03 21:29:19 +0000215 OS << "\n";
216 break;
217 }
218 case PrintSets:
219 {
220 SetTheory Sets;
221 Sets.addFieldExpander("Set", "Elements");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000222 for (Record *Rec : Records.getAllDerivedDefinitions("Set")) {
223 OS << Rec->getName() << " = [";
224 const std::vector<Record*> *Elts = Sets.expand(Rec);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000225 assert(Elts && "Couldn't expand Set instance");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000226 for (Record *Elt : *Elts)
227 OS << ' ' << Elt->getName();
Sean Silvaa3bf5612012-10-03 21:29:19 +0000228 OS << " ]\n";
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +0000229 }
Sean Silvaa3bf5612012-10-03 21:29:19 +0000230 break;
231 }
Sean Silvacdd21b32013-03-21 23:40:38 +0000232 case GenCTags:
233 EmitCTags(Records, OS);
234 break;
Akira Hatanakad9326792015-11-11 20:35:42 +0000235 case GenAttributes:
236 EmitAttributes(Records, OS);
237 break;
Tim Northovere6ae6762016-07-05 21:23:04 +0000238 case GenSearchableTables:
239 EmitSearchableTables(Records, OS);
240 break;
Ahmed Bougacha36f70352016-12-21 23:26:20 +0000241 case GenGlobalISel:
242 EmitGlobalISel(Records, OS);
Daniel Sanders320f79c2017-02-03 14:18:35 +0000243 break;
Daniel Sanders505d7f32019-10-02 21:13:07 +0000244 case GenGICombiner:
245 EmitGICombiner(Records, OS);
246 break;
Daniel Sandersd64d50242017-01-19 11:15:55 +0000247 case GenRegisterBank:
248 EmitRegisterBank(Records, OS);
Ahmed Bougacha36f70352016-12-21 23:26:20 +0000249 break;
Ayman Musa850fc972017-03-07 08:11:19 +0000250 case GenX86EVEX2VEXTables:
251 EmitX86EVEX2VEXTables(Records, OS);
252 break;
Ayman Musa993339b2017-10-08 09:20:32 +0000253 case GenX86FoldTables:
254 EmitX86FoldTables(Records, OS);
255 break;
Clement Courbet41c8af32018-10-25 07:44:01 +0000256 case GenExegesis:
257 EmitExegesis(Records, OS);
258 break;
James Molloye6674012019-10-04 09:03:36 +0000259 case GenAutomata:
260 EmitAutomata(Records, OS);
261 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000262 }
263
264 return false;
265}
David Blaikiea379b1812011-12-20 02:50:00 +0000266}
Alexis Huntf4cdc842010-05-05 04:13:08 +0000267
Peter Collingbourne84c287e2011-10-01 16:41:13 +0000268int main(int argc, char **argv) {
Richard Smith2ad6d482016-06-09 00:53:21 +0000269 sys::PrintStackTraceOnErrorSignal(argv[0]);
Peter Collingbourne84c287e2011-10-01 16:41:13 +0000270 PrettyStackTraceProgram X(argc, argv);
271 cl::ParseCommandLineOptions(argc, argv);
272
Craig Topperdc6c3fc2016-01-04 04:51:51 +0000273 llvm_shutdown_obj Y;
274
Sean Silvaa3bf5612012-10-03 21:29:19 +0000275 return TableGenMain(argv[0], &LLVMTableGenMain);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000276}
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000277
Kamil Rytarowskib2077fd2019-09-24 11:22:34 +0000278#ifndef __has_feature
279#define __has_feature(x) 0
280#endif
281
282#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) || \
283 __has_feature(leak_sanitizer)
284
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000285#include <sanitizer/lsan_interface.h>
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000286// Disable LeakSanitizer for this binary as it has too many leaks that are not
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000287// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
Francis Ricci8a1c2b42017-09-11 13:50:39 +0000288LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; }
Kamil Rytarowskib2077fd2019-09-24 11:22:34 +0000289
290#endif