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/Main.h" 20 #include "llvm/TableGen/Record.h" 21 #include "llvm/TableGen/SetTheory.h" 22 23 using namespace llvm; 24 25 enum ActionType { 26 PrintRecords, 27 GenEmitter, 28 GenRegisterInfo, 29 GenInstrInfo, 30 GenInstrDocs, 31 GenAsmWriter, 32 GenAsmMatcher, 33 GenDisassembler, 34 GenPseudoLowering, 35 GenCompressInst, 36 GenCallingConv, 37 GenDAGISel, 38 GenDFAPacketizer, 39 GenFastISel, 40 GenSubtarget, 41 GenIntrinsicEnums, 42 GenIntrinsicImpl, 43 GenTgtIntrinsicEnums, 44 GenTgtIntrinsicImpl, 45 PrintEnums, 46 PrintSets, 47 GenOptParserDefs, 48 GenCTags, 49 GenAttributes, 50 GenSearchableTables, 51 GenGlobalISel, 52 GenX86EVEX2VEXTables, 53 GenX86FoldTables, 54 GenRegisterBank, 55 }; 56 57 namespace { 58 cl::opt<ActionType> 59 Action(cl::desc("Action to perform:"), 60 cl::values(clEnumValN(PrintRecords, "print-records", 61 "Print all records to stdout (default)"), 62 clEnumValN(GenEmitter, "gen-emitter", 63 "Generate machine code emitter"), 64 clEnumValN(GenRegisterInfo, "gen-register-info", 65 "Generate registers and register classes info"), 66 clEnumValN(GenInstrInfo, "gen-instr-info", 67 "Generate instruction descriptions"), 68 clEnumValN(GenInstrDocs, "gen-instr-docs", 69 "Generate instruction documentation"), 70 clEnumValN(GenCallingConv, "gen-callingconv", 71 "Generate calling convention descriptions"), 72 clEnumValN(GenAsmWriter, "gen-asm-writer", 73 "Generate assembly writer"), 74 clEnumValN(GenDisassembler, "gen-disassembler", 75 "Generate disassembler"), 76 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering", 77 "Generate pseudo instruction lowering"), 78 clEnumValN(GenCompressInst, "gen-compress-inst-emitter", 79 "Generate RISCV compressed instructions."), 80 clEnumValN(GenAsmMatcher, "gen-asm-matcher", 81 "Generate assembly instruction matcher"), 82 clEnumValN(GenDAGISel, "gen-dag-isel", 83 "Generate a DAG instruction selector"), 84 clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer", 85 "Generate DFA Packetizer for VLIW targets"), 86 clEnumValN(GenFastISel, "gen-fast-isel", 87 "Generate a \"fast\" instruction selector"), 88 clEnumValN(GenSubtarget, "gen-subtarget", 89 "Generate subtarget enumerations"), 90 clEnumValN(GenIntrinsicEnums, "gen-intrinsic-enums", 91 "Generate intrinsic enums"), 92 clEnumValN(GenIntrinsicImpl, "gen-intrinsic-impl", 93 "Generate intrinsic information"), 94 clEnumValN(GenTgtIntrinsicEnums, "gen-tgt-intrinsic-enums", 95 "Generate target intrinsic enums"), 96 clEnumValN(GenTgtIntrinsicImpl, "gen-tgt-intrinsic-impl", 97 "Generate target intrinsic information"), 98 clEnumValN(PrintEnums, "print-enums", 99 "Print enum values for a class"), 100 clEnumValN(PrintSets, "print-sets", 101 "Print expanded sets for testing DAG exprs"), 102 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 103 "Generate option definitions"), 104 clEnumValN(GenCTags, "gen-ctags", 105 "Generate ctags-compatible index"), 106 clEnumValN(GenAttributes, "gen-attrs", 107 "Generate attributes"), 108 clEnumValN(GenSearchableTables, "gen-searchable-tables", 109 "Generate generic binary-searchable table"), 110 clEnumValN(GenGlobalISel, "gen-global-isel", 111 "Generate GlobalISel selector"), 112 clEnumValN(GenX86EVEX2VEXTables, "gen-x86-EVEX2VEX-tables", 113 "Generate X86 EVEX to VEX compress tables"), 114 clEnumValN(GenX86FoldTables, "gen-x86-fold-tables", 115 "Generate X86 fold tables"), 116 clEnumValN(GenRegisterBank, "gen-register-bank", 117 "Generate registers bank descriptions"))); 118 119 cl::OptionCategory PrintEnumsCat("Options for -print-enums"); 120 cl::opt<std::string> 121 Class("class", cl::desc("Print Enum list for this class"), 122 cl::value_desc("class name"), cl::cat(PrintEnumsCat)); 123 124 bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 125 switch (Action) { 126 case PrintRecords: 127 OS << Records; // No argument, dump all contents 128 break; 129 case GenEmitter: 130 EmitCodeEmitter(Records, OS); 131 break; 132 case GenRegisterInfo: 133 EmitRegisterInfo(Records, OS); 134 break; 135 case GenInstrInfo: 136 EmitInstrInfo(Records, OS); 137 break; 138 case GenInstrDocs: 139 EmitInstrDocs(Records, OS); 140 break; 141 case GenCallingConv: 142 EmitCallingConv(Records, OS); 143 break; 144 case GenAsmWriter: 145 EmitAsmWriter(Records, OS); 146 break; 147 case GenAsmMatcher: 148 EmitAsmMatcher(Records, OS); 149 break; 150 case GenDisassembler: 151 EmitDisassembler(Records, OS); 152 break; 153 case GenPseudoLowering: 154 EmitPseudoLowering(Records, OS); 155 break; 156 case GenCompressInst: 157 EmitCompressInst(Records, OS); 158 break; 159 case GenDAGISel: 160 EmitDAGISel(Records, OS); 161 break; 162 case GenDFAPacketizer: 163 EmitDFAPacketizer(Records, OS); 164 break; 165 case GenFastISel: 166 EmitFastISel(Records, OS); 167 break; 168 case GenSubtarget: 169 EmitSubtarget(Records, OS); 170 break; 171 case GenIntrinsicEnums: 172 EmitIntrinsicEnums(Records, OS); 173 break; 174 case GenIntrinsicImpl: 175 EmitIntrinsicImpl(Records, OS); 176 break; 177 case GenTgtIntrinsicEnums: 178 EmitIntrinsicEnums(Records, OS, true); 179 break; 180 case GenTgtIntrinsicImpl: 181 EmitIntrinsicImpl(Records, OS, true); 182 break; 183 case GenOptParserDefs: 184 EmitOptParser(Records, OS); 185 break; 186 case PrintEnums: 187 { 188 for (Record *Rec : Records.getAllDerivedDefinitions(Class)) 189 OS << Rec->getName() << ", "; 190 OS << "\n"; 191 break; 192 } 193 case PrintSets: 194 { 195 SetTheory Sets; 196 Sets.addFieldExpander("Set", "Elements"); 197 for (Record *Rec : Records.getAllDerivedDefinitions("Set")) { 198 OS << Rec->getName() << " = ["; 199 const std::vector<Record*> *Elts = Sets.expand(Rec); 200 assert(Elts && "Couldn't expand Set instance"); 201 for (Record *Elt : *Elts) 202 OS << ' ' << Elt->getName(); 203 OS << " ]\n"; 204 } 205 break; 206 } 207 case GenCTags: 208 EmitCTags(Records, OS); 209 break; 210 case GenAttributes: 211 EmitAttributes(Records, OS); 212 break; 213 case GenSearchableTables: 214 EmitSearchableTables(Records, OS); 215 break; 216 case GenGlobalISel: 217 EmitGlobalISel(Records, OS); 218 break; 219 case GenRegisterBank: 220 EmitRegisterBank(Records, OS); 221 break; 222 case GenX86EVEX2VEXTables: 223 EmitX86EVEX2VEXTables(Records, OS); 224 break; 225 case GenX86FoldTables: 226 EmitX86FoldTables(Records, OS); 227 break; 228 } 229 230 return false; 231 } 232 } 233 234 int main(int argc, char **argv) { 235 sys::PrintStackTraceOnErrorSignal(argv[0]); 236 PrettyStackTraceProgram X(argc, argv); 237 cl::ParseCommandLineOptions(argc, argv); 238 239 llvm_shutdown_obj Y; 240 241 return TableGenMain(argv[0], &LLVMTableGenMain); 242 } 243 244 #ifdef __has_feature 245 #if __has_feature(address_sanitizer) 246 #include <sanitizer/lsan_interface.h> 247 // Disable LeakSanitizer for this binary as it has too many leaks that are not 248 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h . 249 LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; } 250 #endif // __has_feature(address_sanitizer) 251 #endif // defined(__has_feature) 252