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 GenX86FoldTables, 51 GenRegisterBank, 52 }; 53 54 namespace { 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"), 61 clEnumValN(GenRegisterInfo, "gen-register-info", 62 "Generate registers and register classes info"), 63 clEnumValN(GenInstrInfo, "gen-instr-info", 64 "Generate instruction descriptions"), 65 clEnumValN(GenCallingConv, "gen-callingconv", 66 "Generate calling convention descriptions"), 67 clEnumValN(GenAsmWriter, "gen-asm-writer", 68 "Generate assembly writer"), 69 clEnumValN(GenDisassembler, "gen-disassembler", 70 "Generate disassembler"), 71 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering", 72 "Generate pseudo instruction lowering"), 73 clEnumValN(GenAsmMatcher, "gen-asm-matcher", 74 "Generate assembly instruction matcher"), 75 clEnumValN(GenDAGISel, "gen-dag-isel", 76 "Generate a DAG instruction selector"), 77 clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer", 78 "Generate DFA Packetizer for VLIW targets"), 79 clEnumValN(GenFastISel, "gen-fast-isel", 80 "Generate a \"fast\" instruction selector"), 81 clEnumValN(GenSubtarget, "gen-subtarget", 82 "Generate subtarget enumerations"), 83 clEnumValN(GenIntrinsic, "gen-intrinsic", 84 "Generate intrinsic information"), 85 clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic", 86 "Generate target intrinsic information"), 87 clEnumValN(PrintEnums, "print-enums", 88 "Print enum values for a class"), 89 clEnumValN(PrintSets, "print-sets", 90 "Print expanded sets for testing DAG exprs"), 91 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 92 "Generate option definitions"), 93 clEnumValN(GenCTags, "gen-ctags", 94 "Generate ctags-compatible index"), 95 clEnumValN(GenAttributes, "gen-attrs", 96 "Generate attributes"), 97 clEnumValN(GenSearchableTables, "gen-searchable-tables", 98 "Generate generic binary-searchable table"), 99 clEnumValN(GenGlobalISel, "gen-global-isel", 100 "Generate GlobalISel selector"), 101 clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables", 102 "Generate X86 EVEX to VEX compress tables"), 103 clEnumValN(GenX86FoldTables, "gen-x86-fold-tables", 104 "Generate X86 fold tables"), 105 clEnumValN(GenRegisterBank, "gen-register-bank", 106 "Generate registers bank descriptions"))); 107 108 cl::OptionCategory PrintEnumsCat("Options for -print-enums"); 109 cl::opt<std::string> 110 Class("class", cl::desc("Print Enum list for this class"), 111 cl::value_desc("class name"), cl::cat(PrintEnumsCat)); 112 113 bool 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; 160 case GenOptParserDefs: 161 EmitOptParser(Records, OS); 162 break; 163 case PrintEnums: 164 { 165 for (Record *Rec : Records.getAllDerivedDefinitions(Class)) 166 OS << Rec->getName() << ", "; 167 OS << "\n"; 168 break; 169 } 170 case PrintSets: 171 { 172 SetTheory Sets; 173 Sets.addFieldExpander("Set", "Elements"); 174 for (Record *Rec : Records.getAllDerivedDefinitions("Set")) { 175 OS << Rec->getName() << " = ["; 176 const std::vector<Record*> *Elts = Sets.expand(Rec); 177 assert(Elts && "Couldn't expand Set instance"); 178 for (Record *Elt : *Elts) 179 OS << ' ' << Elt->getName(); 180 OS << " ]\n"; 181 } 182 break; 183 } 184 case GenCTags: 185 EmitCTags(Records, OS); 186 break; 187 case GenAttributes: 188 EmitAttributes(Records, OS); 189 break; 190 case GenSearchableTables: 191 EmitSearchableTables(Records, OS); 192 break; 193 case GenGlobalISel: 194 EmitGlobalISel(Records, OS); 195 break; 196 case GenRegisterBank: 197 EmitRegisterBank(Records, OS); 198 break; 199 case GenX86EVEX2VEXTables: 200 EmitX86EVEX2VEXTables(Records, OS); 201 break; 202 case GenX86FoldTables: 203 EmitX86FoldTables(Records, OS); 204 break; 205 } 206 207 return false; 208 } 209 } 210 211 int main(int argc, char **argv) { 212 sys::PrintStackTraceOnErrorSignal(argv[0]); 213 PrettyStackTraceProgram X(argc, argv); 214 cl::ParseCommandLineOptions(argc, argv); 215 216 llvm_shutdown_obj Y; 217 218 return TableGenMain(argv[0], &LLVMTableGenMain); 219 } 220 221 #ifdef __has_feature 222 #if __has_feature(address_sanitizer) 223 #include <sanitizer/lsan_interface.h> 224 // Disable LeakSanitizer for this binary as it has too many leaks that are not 225 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h . 226 LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; } 227 #endif // __has_feature(address_sanitizer) 228 #endif // defined(__has_feature) 229