1226633Sdim//===- 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// 10226633Sdim// This file contains the main function for LLVM's TableGen. 11193323Sed// 12193323Sed//===----------------------------------------------------------------------===// 13193323Sed 14239462Sdim#include "TableGenBackends.h" // Declares all backends. 15223017Sdim#include "SetTheory.h" 16198090Srdivacky#include "llvm/Support/CommandLine.h" 17198090Srdivacky#include "llvm/Support/PrettyStackTrace.h" 18218893Sdim#include "llvm/Support/Signals.h" 19226633Sdim#include "llvm/TableGen/Error.h" 20226633Sdim#include "llvm/TableGen/Main.h" 21226633Sdim#include "llvm/TableGen/Record.h" 22226633Sdim 23193323Sedusing namespace llvm; 24193323Sed 25193323Sedenum ActionType { 26193323Sed PrintRecords, 27193323Sed GenEmitter, 28224145Sdim GenRegisterInfo, 29224145Sdim GenInstrInfo, 30224145Sdim GenAsmWriter, 31224145Sdim GenAsmMatcher, 32199989Srdivacky GenDisassembler, 33224145Sdim GenPseudoLowering, 34193323Sed GenCallingConv, 35193323Sed GenDAGISel, 36234353Sdim GenDFAPacketizer, 37193323Sed GenFastISel, 38193323Sed GenSubtarget, 39193323Sed GenIntrinsic, 40193323Sed GenTgtIntrinsic, 41223017Sdim PrintEnums, 42249423Sdim PrintSets, 43249423Sdim GenOptParserDefs, 44249423Sdim GenCTags 45193323Sed}; 46193323Sed 47193323Sednamespace { 48193323Sed cl::opt<ActionType> 49193323Sed Action(cl::desc("Action to perform:"), 50193323Sed cl::values(clEnumValN(PrintRecords, "print-records", 51193323Sed "Print all records to stdout (default)"), 52193323Sed clEnumValN(GenEmitter, "gen-emitter", 53193323Sed "Generate machine code emitter"), 54224145Sdim clEnumValN(GenRegisterInfo, "gen-register-info", 55224145Sdim "Generate registers and register classes info"), 56224145Sdim clEnumValN(GenInstrInfo, "gen-instr-info", 57193323Sed "Generate instruction descriptions"), 58193323Sed clEnumValN(GenCallingConv, "gen-callingconv", 59193323Sed "Generate calling convention descriptions"), 60193323Sed clEnumValN(GenAsmWriter, "gen-asm-writer", 61193323Sed "Generate assembly writer"), 62199989Srdivacky clEnumValN(GenDisassembler, "gen-disassembler", 63199989Srdivacky "Generate disassembler"), 64224145Sdim clEnumValN(GenPseudoLowering, "gen-pseudo-lowering", 65224145Sdim "Generate pseudo instruction lowering"), 66198090Srdivacky clEnumValN(GenAsmMatcher, "gen-asm-matcher", 67198090Srdivacky "Generate assembly instruction matcher"), 68193323Sed clEnumValN(GenDAGISel, "gen-dag-isel", 69193323Sed "Generate a DAG instruction selector"), 70234353Sdim clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer", 71234353Sdim "Generate DFA Packetizer for VLIW targets"), 72193323Sed clEnumValN(GenFastISel, "gen-fast-isel", 73193323Sed "Generate a \"fast\" instruction selector"), 74193323Sed clEnumValN(GenSubtarget, "gen-subtarget", 75193323Sed "Generate subtarget enumerations"), 76193323Sed clEnumValN(GenIntrinsic, "gen-intrinsic", 77193323Sed "Generate intrinsic information"), 78193323Sed clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic", 79193323Sed "Generate target intrinsic information"), 80193323Sed clEnumValN(PrintEnums, "print-enums", 81193323Sed "Print enum values for a class"), 82223017Sdim clEnumValN(PrintSets, "print-sets", 83223017Sdim "Print expanded sets for testing DAG exprs"), 84249423Sdim clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 85249423Sdim "Generate option definitions"), 86249423Sdim clEnumValN(GenCTags, "gen-ctags", 87249423Sdim "Generate ctags-compatible index"), 88193323Sed clEnumValEnd)); 89193323Sed 90193323Sed cl::opt<std::string> 91193323Sed Class("class", cl::desc("Print Enum list for this class"), 92234353Sdim cl::value_desc("class name")); 93239462Sdim 94243830Sdimbool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 95243830Sdim switch (Action) { 96243830Sdim case PrintRecords: 97243830Sdim OS << Records; // No argument, dump all contents 98243830Sdim break; 99243830Sdim case GenEmitter: 100243830Sdim EmitCodeEmitter(Records, OS); 101243830Sdim break; 102243830Sdim case GenRegisterInfo: 103243830Sdim EmitRegisterInfo(Records, OS); 104243830Sdim break; 105243830Sdim case GenInstrInfo: 106243830Sdim EmitInstrInfo(Records, OS); 107243830Sdim break; 108243830Sdim case GenCallingConv: 109243830Sdim EmitCallingConv(Records, OS); 110243830Sdim break; 111243830Sdim case GenAsmWriter: 112243830Sdim EmitAsmWriter(Records, OS); 113243830Sdim break; 114243830Sdim case GenAsmMatcher: 115243830Sdim EmitAsmMatcher(Records, OS); 116243830Sdim break; 117243830Sdim case GenDisassembler: 118243830Sdim EmitDisassembler(Records, OS); 119243830Sdim break; 120243830Sdim case GenPseudoLowering: 121243830Sdim EmitPseudoLowering(Records, OS); 122243830Sdim break; 123243830Sdim case GenDAGISel: 124243830Sdim EmitDAGISel(Records, OS); 125243830Sdim break; 126243830Sdim case GenDFAPacketizer: 127243830Sdim EmitDFAPacketizer(Records, OS); 128243830Sdim break; 129243830Sdim case GenFastISel: 130243830Sdim EmitFastISel(Records, OS); 131243830Sdim break; 132243830Sdim case GenSubtarget: 133243830Sdim EmitSubtarget(Records, OS); 134243830Sdim break; 135243830Sdim case GenIntrinsic: 136243830Sdim EmitIntrinsics(Records, OS); 137243830Sdim break; 138243830Sdim case GenTgtIntrinsic: 139243830Sdim EmitIntrinsics(Records, OS, true); 140243830Sdim break; 141249423Sdim case GenOptParserDefs: 142249423Sdim EmitOptParser(Records, OS); 143243830Sdim break; 144243830Sdim case PrintEnums: 145243830Sdim { 146243830Sdim std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class); 147243830Sdim for (unsigned i = 0, e = Recs.size(); i != e; ++i) 148243830Sdim OS << Recs[i]->getName() << ", "; 149243830Sdim OS << "\n"; 150243830Sdim break; 151243830Sdim } 152243830Sdim case PrintSets: 153243830Sdim { 154243830Sdim SetTheory Sets; 155243830Sdim Sets.addFieldExpander("Set", "Elements"); 156243830Sdim std::vector<Record*> Recs = Records.getAllDerivedDefinitions("Set"); 157243830Sdim for (unsigned i = 0, e = Recs.size(); i != e; ++i) { 158243830Sdim OS << Recs[i]->getName() << " = ["; 159243830Sdim const std::vector<Record*> *Elts = Sets.expand(Recs[i]); 160243830Sdim assert(Elts && "Couldn't expand Set instance"); 161243830Sdim for (unsigned ei = 0, ee = Elts->size(); ei != ee; ++ei) 162243830Sdim OS << ' ' << (*Elts)[ei]->getName(); 163243830Sdim OS << " ]\n"; 164243830Sdim } 165243830Sdim break; 166243830Sdim } 167249423Sdim case GenCTags: 168249423Sdim EmitCTags(Records, OS); 169249423Sdim break; 170243830Sdim } 171239462Sdim 172243830Sdim return false; 173234353Sdim} 174243830Sdim} 175208599Srdivacky 176226633Sdimint main(int argc, char **argv) { 177226633Sdim sys::PrintStackTraceOnErrorSignal(); 178226633Sdim PrettyStackTraceProgram X(argc, argv); 179226633Sdim cl::ParseCommandLineOptions(argc, argv); 180226633Sdim 181243830Sdim return TableGenMain(argv[0], &LLVMTableGenMain); 182193323Sed} 183