TableGen.cpp revision 239462
1193323Sed//===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed// 10193323Sed// This file contains the main function for LLVM's TableGen. 11193323Sed// 12193323Sed//===----------------------------------------------------------------------===// 13193323Sed 14193323Sed#include "TableGenBackends.h" // Declares all backends. 15193323Sed 16193323Sed#include "SetTheory.h" 17193323Sed#include "llvm/Support/CommandLine.h" 18198090Srdivacky#include "llvm/Support/PrettyStackTrace.h" 19193323Sed#include "llvm/Support/Signals.h" 20193323Sed#include "llvm/TableGen/Error.h" 21198090Srdivacky#include "llvm/TableGen/Main.h" 22193323Sed#include "llvm/TableGen/Record.h" 23193323Sed#include "llvm/TableGen/TableGenAction.h" 24193323Sed 25193323Sedusing namespace llvm; 26193323Sed 27198090Srdivackyenum ActionType { 28193323Sed PrintRecords, 29193323Sed GenEmitter, 30193323Sed GenRegisterInfo, 31193323Sed GenInstrInfo, 32193323Sed GenAsmWriter, 33193323Sed GenAsmMatcher, 34193323Sed GenDisassembler, 35193323Sed GenPseudoLowering, 36193323Sed GenCallingConv, 37193323Sed GenDAGISel, 38193323Sed GenDFAPacketizer, 39193323Sed GenFastISel, 40193323Sed GenSubtarget, 41193323Sed GenIntrinsic, 42193323Sed GenTgtIntrinsic, 43193323Sed GenEDInfo, 44193323Sed PrintEnums, 45193323Sed PrintSets 46193323Sed}; 47193323Sed 48193323Sednamespace { 49193323Sed cl::opt<ActionType> 50193323Sed Action(cl::desc("Action to perform:"), 51193323Sed cl::values(clEnumValN(PrintRecords, "print-records", 52193323Sed "Print all records to stdout (default)"), 53193323Sed clEnumValN(GenEmitter, "gen-emitter", 54193323Sed "Generate machine code emitter"), 55193323Sed clEnumValN(GenRegisterInfo, "gen-register-info", 56193323Sed "Generate registers and register classes info"), 57193323Sed clEnumValN(GenInstrInfo, "gen-instr-info", 58193323Sed "Generate instruction descriptions"), 59193323Sed clEnumValN(GenCallingConv, "gen-callingconv", 60193323Sed "Generate calling convention descriptions"), 61193323Sed clEnumValN(GenAsmWriter, "gen-asm-writer", 62193323Sed "Generate assembly writer"), 63193323Sed clEnumValN(GenDisassembler, "gen-disassembler", 64193323Sed "Generate disassembler"), 65193323Sed clEnumValN(GenPseudoLowering, "gen-pseudo-lowering", 66193323Sed "Generate pseudo instruction lowering"), 67193323Sed clEnumValN(GenAsmMatcher, "gen-asm-matcher", 68193323Sed "Generate assembly instruction matcher"), 69193323Sed clEnumValN(GenDAGISel, "gen-dag-isel", 70193323Sed "Generate a DAG instruction selector"), 71193323Sed clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer", 72193323Sed "Generate DFA Packetizer for VLIW targets"), 73193323Sed clEnumValN(GenFastISel, "gen-fast-isel", 74193323Sed "Generate a \"fast\" instruction selector"), 75193323Sed clEnumValN(GenSubtarget, "gen-subtarget", 76193323Sed "Generate subtarget enumerations"), 77193323Sed clEnumValN(GenIntrinsic, "gen-intrinsic", 78193323Sed "Generate intrinsic information"), 79193323Sed clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic", 80193323Sed "Generate target intrinsic information"), 81193323Sed clEnumValN(GenEDInfo, "gen-enhanced-disassembly-info", 82193323Sed "Generate enhanced disassembly info"), 83193323Sed clEnumValN(PrintEnums, "print-enums", 84193323Sed "Print enum values for a class"), 85193323Sed clEnumValN(PrintSets, "print-sets", 86193323Sed "Print expanded sets for testing DAG exprs"), 87193323Sed clEnumValEnd)); 88193323Sed 89193323Sed cl::opt<std::string> 90193323Sed Class("class", cl::desc("Print Enum list for this class"), 91193323Sed cl::value_desc("class name")); 92193323Sed 93193323Sed class LLVMTableGenAction : public TableGenAction { 94193323Sed public: 95193323Sed bool operator()(raw_ostream &OS, RecordKeeper &Records) { 96193323Sed switch (Action) { 97193323Sed case PrintRecords: 98193323Sed OS << Records; // No argument, dump all contents 99193323Sed break; 100193323Sed case GenEmitter: 101193323Sed EmitCodeEmitter(Records, OS); 102193323Sed break; 103193323Sed case GenRegisterInfo: 104193323Sed EmitRegisterInfo(Records, OS); 105193323Sed break; 106193323Sed case GenInstrInfo: 107193323Sed EmitInstrInfo(Records, OS); 108193323Sed break; 109193323Sed case GenCallingConv: 110193323Sed EmitCallingConv(Records, OS); 111193323Sed break; 112193323Sed case GenAsmWriter: 113193323Sed EmitAsmWriter(Records, OS); 114193323Sed break; 115193323Sed case GenAsmMatcher: 116193323Sed EmitAsmMatcher(Records, OS); 117193323Sed break; 118193323Sed case GenDisassembler: 119193323Sed EmitDisassembler(Records, OS); 120193323Sed break; 121193323Sed case GenPseudoLowering: 122193323Sed EmitPseudoLowering(Records, OS); 123193323Sed break; 124193323Sed case GenDAGISel: 125193323Sed EmitDAGISel(Records, OS); 126193323Sed break; 127198090Srdivacky case GenDFAPacketizer: 128193323Sed EmitDFAPacketizer(Records, OS); 129193323Sed break; 130193323Sed case GenFastISel: 131193323Sed EmitFastISel(Records, OS); 132193323Sed break; 133193323Sed case GenSubtarget: 134193323Sed EmitSubtarget(Records, OS); 135193323Sed break; 136193323Sed case GenIntrinsic: 137193323Sed EmitIntrinsics(Records, OS); 138193323Sed break; 139193323Sed case GenTgtIntrinsic: 140193323Sed EmitIntrinsics(Records, OS, true); 141193323Sed break; 142193323Sed case GenEDInfo: 143193323Sed EmitEnhancedDisassemblerInfo(Records, OS); 144193323Sed break; 145193323Sed case PrintEnums: 146193323Sed { 147193323Sed std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class); 148193323Sed for (unsigned i = 0, e = Recs.size(); i != e; ++i) 149193323Sed OS << Recs[i]->getName() << ", "; 150193323Sed OS << "\n"; 151193323Sed break; 152193323Sed } 153193323Sed case PrintSets: 154193323Sed { 155193323Sed SetTheory Sets; 156193323Sed Sets.addFieldExpander("Set", "Elements"); 157193323Sed std::vector<Record*> Recs = Records.getAllDerivedDefinitions("Set"); 158193323Sed for (unsigned i = 0, e = Recs.size(); i != e; ++i) { 159193323Sed OS << Recs[i]->getName() << " = ["; 160193323Sed const std::vector<Record*> *Elts = Sets.expand(Recs[i]); 161193323Sed assert(Elts && "Couldn't expand Set instance"); 162193323Sed for (unsigned ei = 0, ee = Elts->size(); ei != ee; ++ei) 163193323Sed OS << ' ' << (*Elts)[ei]->getName(); 164193323Sed OS << " ]\n"; 165193323Sed } 166193323Sed break; 167193323Sed } 168193323Sed } 169193323Sed 170193323Sed return false; 171193323Sed } 172193323Sed }; 173193323Sed} 174193323Sed 175193323Sedint main(int argc, char **argv) { 176193323Sed sys::PrintStackTraceOnErrorSignal(); 177193323Sed PrettyStackTraceProgram X(argc, argv); 178193323Sed cl::ParseCommandLineOptions(argc, argv); 179193323Sed 180193323Sed LLVMTableGenAction Action; 181193323Sed return TableGenMain(argv[0], Action); 182193323Sed} 183193323Sed