blob: 02fe4dc98bea67a7683be81a86b8c3c19b60bbca [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"
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/Error.h"
19#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,
30 GenAsmWriter,
31 GenAsmMatcher,
Daniel Dunbare5024332009-11-25 02:13:23 +000032 GenDisassembler,
Jim Grosbachbcb36be2011-07-08 17:36:35 +000033 GenPseudoLowering,
Chris Lattnercbebe462007-02-27 22:08:27 +000034 GenCallingConv,
Chris Lattner90d00042005-09-03 01:14:03 +000035 GenDAGISel,
Anshuman Dasgupta08ebdc12011-12-01 21:10:21 +000036 GenDFAPacketizer,
Dan Gohmanb2226e22008-08-13 20:19:35 +000037 GenFastISel,
Jim Laskey9ed90322005-10-21 19:05:19 +000038 GenSubtarget,
Chris Lattnerc313d0b2006-03-03 02:32:46 +000039 GenIntrinsic,
Dale Johannesenb842d522009-02-05 01:49:45 +000040 GenTgtIntrinsic,
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +000041 PrintEnums,
Michael J. Spencer41ee0412012-12-05 00:29:32 +000042 PrintSets,
Sean Silvacdd21b32013-03-21 23:40:38 +000043 GenOptParserDefs,
44 GenCTags
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000045};
46
47namespace {
48 cl::opt<ActionType>
49 Action(cl::desc("Action to perform:"),
50 cl::values(clEnumValN(PrintRecords, "print-records",
51 "Print all records to stdout (default)"),
52 clEnumValN(GenEmitter, "gen-emitter",
53 "Generate machine code emitter"),
Evan Cheng24753312011-06-24 01:44:41 +000054 clEnumValN(GenRegisterInfo, "gen-register-info",
Evan Chengd9997ac2011-06-27 18:32:37 +000055 "Generate registers and register classes info"),
Evan Cheng1e210d02011-06-28 20:07:07 +000056 clEnumValN(GenInstrInfo, "gen-instr-info",
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000057 "Generate instruction descriptions"),
Chris Lattnercbebe462007-02-27 22:08:27 +000058 clEnumValN(GenCallingConv, "gen-callingconv",
59 "Generate calling convention descriptions"),
Chris Lattner1c4ae852004-08-01 05:59:33 +000060 clEnumValN(GenAsmWriter, "gen-asm-writer",
61 "Generate assembly writer"),
Daniel Dunbare5024332009-11-25 02:13:23 +000062 clEnumValN(GenDisassembler, "gen-disassembler",
63 "Generate disassembler"),
Jim Grosbachbcb36be2011-07-08 17:36:35 +000064 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
65 "Generate pseudo instruction lowering"),
Daniel Dunbar3085b572009-07-11 19:39:44 +000066 clEnumValN(GenAsmMatcher, "gen-asm-matcher",
67 "Generate assembly instruction matcher"),
Chris Lattner90d00042005-09-03 01:14:03 +000068 clEnumValN(GenDAGISel, "gen-dag-isel",
69 "Generate a DAG instruction selector"),
Anshuman Dasgupta08ebdc12011-12-01 21:10:21 +000070 clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
71 "Generate DFA Packetizer for VLIW targets"),
Dan Gohmanb2226e22008-08-13 20:19:35 +000072 clEnumValN(GenFastISel, "gen-fast-isel",
73 "Generate a \"fast\" instruction selector"),
Jim Laskey9ed90322005-10-21 19:05:19 +000074 clEnumValN(GenSubtarget, "gen-subtarget",
75 "Generate subtarget enumerations"),
Chris Lattnerc313d0b2006-03-03 02:32:46 +000076 clEnumValN(GenIntrinsic, "gen-intrinsic",
77 "Generate intrinsic information"),
Dale Johannesenb842d522009-02-05 01:49:45 +000078 clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
79 "Generate target intrinsic information"),
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000080 clEnumValN(PrintEnums, "print-enums",
81 "Print enum values for a class"),
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +000082 clEnumValN(PrintSets, "print-sets",
83 "Print expanded sets for testing DAG exprs"),
Michael J. Spencer41ee0412012-12-05 00:29:32 +000084 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
85 "Generate option definitions"),
Sean Silvacdd21b32013-03-21 23:40:38 +000086 clEnumValN(GenCTags, "gen-ctags",
87 "Generate ctags-compatible index"),
Chris Lattner89ae1152004-07-16 00:02:21 +000088 clEnumValEnd));
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000089
90 cl::opt<std::string>
91 Class("class", cl::desc("Print Enum list for this class"),
David Blaikiea379b1812011-12-20 02:50:00 +000092 cl::value_desc("class name"));
Jakob Stoklund Olesene6aed132012-06-11 15:37:55 +000093
Sean Silvaa3bf5612012-10-03 21:29:19 +000094bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
95 switch (Action) {
96 case PrintRecords:
97 OS << Records; // No argument, dump all contents
98 break;
99 case GenEmitter:
100 EmitCodeEmitter(Records, OS);
101 break;
102 case GenRegisterInfo:
103 EmitRegisterInfo(Records, OS);
104 break;
105 case GenInstrInfo:
106 EmitInstrInfo(Records, OS);
107 break;
108 case GenCallingConv:
109 EmitCallingConv(Records, OS);
110 break;
111 case GenAsmWriter:
112 EmitAsmWriter(Records, OS);
113 break;
114 case GenAsmMatcher:
115 EmitAsmMatcher(Records, OS);
116 break;
117 case GenDisassembler:
118 EmitDisassembler(Records, OS);
119 break;
120 case GenPseudoLowering:
121 EmitPseudoLowering(Records, OS);
122 break;
123 case GenDAGISel:
124 EmitDAGISel(Records, OS);
125 break;
126 case GenDFAPacketizer:
127 EmitDFAPacketizer(Records, OS);
128 break;
129 case GenFastISel:
130 EmitFastISel(Records, OS);
131 break;
132 case GenSubtarget:
133 EmitSubtarget(Records, OS);
134 break;
135 case GenIntrinsic:
136 EmitIntrinsics(Records, OS);
137 break;
138 case GenTgtIntrinsic:
139 EmitIntrinsics(Records, OS, true);
140 break;
Michael J. Spencer41ee0412012-12-05 00:29:32 +0000141 case GenOptParserDefs:
142 EmitOptParser(Records, OS);
143 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000144 case PrintEnums:
145 {
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000146 for (Record *Rec : Records.getAllDerivedDefinitions(Class))
147 OS << Rec->getName() << ", ";
Sean Silvaa3bf5612012-10-03 21:29:19 +0000148 OS << "\n";
149 break;
150 }
151 case PrintSets:
152 {
153 SetTheory Sets;
154 Sets.addFieldExpander("Set", "Elements");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000155 for (Record *Rec : Records.getAllDerivedDefinitions("Set")) {
156 OS << Rec->getName() << " = [";
157 const std::vector<Record*> *Elts = Sets.expand(Rec);
Sean Silvaa3bf5612012-10-03 21:29:19 +0000158 assert(Elts && "Couldn't expand Set instance");
Craig Topper5fcc5ab2014-12-11 07:04:54 +0000159 for (Record *Elt : *Elts)
160 OS << ' ' << Elt->getName();
Sean Silvaa3bf5612012-10-03 21:29:19 +0000161 OS << " ]\n";
Jakob Stoklund Olesenfc205a52011-06-04 04:11:37 +0000162 }
Sean Silvaa3bf5612012-10-03 21:29:19 +0000163 break;
164 }
Sean Silvacdd21b32013-03-21 23:40:38 +0000165 case GenCTags:
166 EmitCTags(Records, OS);
167 break;
Sean Silvaa3bf5612012-10-03 21:29:19 +0000168 }
169
170 return false;
171}
David Blaikiea379b1812011-12-20 02:50:00 +0000172}
Alexis Huntf4cdc842010-05-05 04:13:08 +0000173
Peter Collingbourne84c287e2011-10-01 16:41:13 +0000174int main(int argc, char **argv) {
175 sys::PrintStackTraceOnErrorSignal();
176 PrettyStackTraceProgram X(argc, argv);
177 cl::ParseCommandLineOptions(argc, argv);
178
Sean Silvaa3bf5612012-10-03 21:29:19 +0000179 return TableGenMain(argv[0], &LLVMTableGenMain);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000180}
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000181
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000182#ifdef __has_feature
183#if __has_feature(address_sanitizer)
184#include <sanitizer/lsan_interface.h>
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000185// Disable LeakSanitizer for this binary as it has too many leaks that are not
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000186// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
187int __lsan_is_turned_off() { return 1; }
188#endif // __has_feature(address_sanitizer)
189#endif // defined(__has_feature)