1 //===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains the main function for LLVM's TableGen. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "TableGenBackends.h" // Declares all backends. 15 #include "llvm/Support/CommandLine.h" 16 #include "llvm/Support/ManagedStatic.h" 17 #include "llvm/Support/PrettyStackTrace.h" 18 #include "llvm/Support/Signals.h" 19 #include "llvm/TableGen/Error.h" 20 #include "llvm/TableGen/Main.h" 21 #include "llvm/TableGen/Record.h" 22 #include "llvm/TableGen/SetTheory.h" 23 24 using namespace llvm; 25 26 enum ActionType { 27 PrintRecords, 28 GenEmitter, 29 GenRegisterInfo, 30 GenInstrInfo, 31 GenAsmWriter, 32 GenAsmMatcher, 33 GenDisassembler, 34 GenPseudoLowering, 35 GenCallingConv, 36 GenDAGISel, 37 GenDFAPacketizer, 38 GenFastISel, 39 GenSubtarget, 40 GenIntrinsic, 41 GenTgtIntrinsic, 42 PrintEnums, 43 PrintSets, 44 GenOptParserDefs, 45 GenCTags, 46 GenAttributes, 47 GenSearchableTables, 48 GenGlobalISel, 49 GenX86EVEX2VEXTables, 50 GenRegisterBank, 51 }; 52 53 namespace { 54 cl::opt<ActionType> 55 Action(cl::desc("Action to perform:"), 56 cl::values(clEnumValN(PrintRecords, "print-records", 57 "Print all records to stdout (default)"), 58 clEnumValN(GenEmitter, "gen-emitter", 59 "Generate machine code emitter"), 60 clEnumValN(GenRegisterInfo, "gen-register-info", 61 "Generate registers and register classes info"), 62 clEnumValN(GenInstrInfo, "gen-instr-info", 63 "Generate instruction descriptions"), 64 clEnumValN(GenCallingConv, "gen-callingconv", 65 "Generate calling convention descriptions"), 66 clEnumValN(GenAsmWriter, "gen-asm-writer", 67 "Generate assembly writer"), 68 clEnumValN(GenDisassembler, "gen-disassembler", 69 "Generate disassembler"), 70 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering", 71 "Generate pseudo instruction lowering"), 72 clEnumValN(GenAsmMatcher, "gen-asm-matcher", 73 "Generate assembly instruction matcher"), 74 clEnumValN(GenDAGISel, "gen-dag-isel", 75 "Generate a DAG instruction selector"), 76 clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer", 77 "Generate DFA Packetizer for VLIW targets"), 78 clEnumValN(GenFastISel, "gen-fast-isel", 79 "Generate a \"fast\" instruction selector"), 80 clEnumValN(GenSubtarget, "gen-subtarget", 81 "Generate subtarget enumerations"), 82 clEnumValN(GenIntrinsic, "gen-intrinsic", 83 "Generate intrinsic information"), 84 clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic", 85 "Generate target intrinsic information"), 86 clEnumValN(PrintEnums, "print-enums", 87 "Print enum values for a class"), 88 clEnumValN(PrintSets, "print-sets", 89 "Print expanded sets for testing DAG exprs"), 90 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 91 "Generate option definitions"), 92 clEnumValN(GenCTags, "gen-ctags", 93 "Generate ctags-compatible index"), 94 clEnumValN(GenAttributes, "gen-attrs", 95 "Generate attributes"), 96 clEnumValN(GenSearchableTables, "gen-searchable-tables", 97 "Generate generic binary-searchable table"), 98 clEnumValN(GenGlobalISel, "gen-global-isel", 99 "Generate GlobalISel selector"), 100 clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables", 101 "Generate X86 EVEX to VEX compress tables"), 102 clEnumValN(GenRegisterBank, "gen-register-bank", 103 "Generate registers bank descriptions"))); 104 105 cl::opt<std::string> 106 Class("class", cl::desc("Print Enum list for this class"), 107 cl::value_desc("class name")); 108 109 bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 110 switch (Action) { 111 case PrintRecords: 112 OS << Records; // No argument, dump all contents 113 break; 114 case GenEmitter: 115 EmitCodeEmitter(Records, OS); 116 break; 117 case GenRegisterInfo: 118 EmitRegisterInfo(Records, OS); 119 break; 120 case GenInstrInfo: 121 EmitInstrInfo(Records, OS); 122 break; 123 case GenCallingConv: 124 EmitCallingConv(Records, OS); 125 break; 126 case GenAsmWriter: 127 EmitAsmWriter(Records, OS); 128 break; 129 case GenAsmMatcher: 130 EmitAsmMatcher(Records, OS); 131 break; 132 case GenDisassembler: 133 EmitDisassembler(Records, OS); 134 break; 135 case GenPseudoLowering: 136 EmitPseudoLowering(Records, OS); 137 break; 138 case GenDAGISel: 139 EmitDAGISel(Records, OS); 140 break; 141 case GenDFAPacketizer: 142 EmitDFAPacketizer(Records, OS); 143 break; 144 case GenFastISel: 145 EmitFastISel(Records, OS); 146 break; 147 case GenSubtarget: 148 EmitSubtarget(Records, OS); 149 break; 150 case GenIntrinsic: 151 EmitIntrinsics(Records, OS); 152 break; 153 case GenTgtIntrinsic: 154 EmitIntrinsics(Records, OS, true); 155 break; 156 case GenOptParserDefs: 157 EmitOptParser(Records, OS); 158 break; 159 case PrintEnums: 160 { 161 for (Record *Rec : Records.getAllDerivedDefinitions(Class)) 162 OS << Rec->getName() << ", "; 163 OS << "\n"; 164 break; 165 } 166 case PrintSets: 167 { 168 SetTheory Sets; 169 Sets.addFieldExpander("Set", "Elements"); 170 for (Record *Rec : Records.getAllDerivedDefinitions("Set")) { 171 OS << Rec->getName() << " = ["; 172 const std::vector<Record*> *Elts = Sets.expand(Rec); 173 assert(Elts && "Couldn't expand Set instance"); 174 for (Record *Elt : *Elts) 175 OS << ' ' << Elt->getName(); 176 OS << " ]\n"; 177 } 178 break; 179 } 180 case GenCTags: 181 EmitCTags(Records, OS); 182 break; 183 case GenAttributes: 184 EmitAttributes(Records, OS); 185 break; 186 case GenSearchableTables: 187 EmitSearchableTables(Records, OS); 188 break; 189 case GenGlobalISel: 190 EmitGlobalISel(Records, OS); 191 break; 192 case GenRegisterBank: 193 EmitRegisterBank(Records, OS); 194 break; 195 case GenX86EVEX2VEXTables: 196 EmitX86EVEX2VEXTables(Records, OS); 197 break; 198 } 199 200 return false; 201 } 202 } 203 204 int main(int argc, char **argv) { 205 sys::PrintStackTraceOnErrorSignal(argv[0]); 206 PrettyStackTraceProgram X(argc, argv); 207 cl::ParseCommandLineOptions(argc, argv); 208 209 llvm_shutdown_obj Y; 210 211 return TableGenMain(argv[0], &LLVMTableGenMain); 212 } 213 214 #ifdef __has_feature 215 #if __has_feature(address_sanitizer) 216 #include <sanitizer/lsan_interface.h> 217 // Disable LeakSanitizer for this binary as it has too many leaks that are not 218 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h . 219 int __lsan_is_turned_off() { return 1; } 220 #endif // __has_feature(address_sanitizer) 221 #endif // defined(__has_feature) 222