From fca9789b2c1e517f1b85ad53180780906ce6a4f6 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 1 Aug 2003 04:39:05 +0000 Subject: [PATCH] Add file comment Add register info emitter Simplify code by using "high-level" methods. llvm-svn: 7466 --- support/tools/TableGen/TableGen.cpp | 92 ++++++++++++++++------------- 1 file changed, 52 insertions(+), 40 deletions(-) diff --git a/support/tools/TableGen/TableGen.cpp b/support/tools/TableGen/TableGen.cpp index 922ebbcbcc1..90169e89431 100644 --- a/support/tools/TableGen/TableGen.cpp +++ b/support/tools/TableGen/TableGen.cpp @@ -1,13 +1,25 @@ +//===- TableGen.cpp - Top-Level TableGen implementation -------------------===// +// +// TableGen is a tool which can be used to build up a description of something, +// then invoke one or more "tablegen backends" to emit information about the +// description in some predefined format. In practice, this is used by the LLVM +// code generators to automate generation of a code generator through a +// high-level description of the target. +// +//===----------------------------------------------------------------------===// + #include "Record.h" #include "Support/CommandLine.h" #include "Support/Signals.h" #include "CodeEmitterGen.h" +#include "RegisterInfoEmitter.h" #include #include enum ActionType { PrintRecords, GenEmitter, + GenRegister, GenRegisterHeader, PrintEnums, Parse, }; @@ -19,6 +31,10 @@ namespace { "Print all records to stdout (default)"), clEnumValN(GenEmitter, "gen-emitter", "Generate machine code emitter"), + clEnumValN(GenRegister, "gen-register-desc", + "Generate a register info description"), + clEnumValN(GenRegisterHeader, "gen-register-desc-header", + "Generate a register info description header"), clEnumValN(PrintEnums, "print-enums", "Print enum values for a class"), clEnumValN(Parse, "parse", @@ -174,7 +190,7 @@ static Record *ParseMachineCode(std::vector::iterator InstsB, for (unsigned i = 0, e = getNumBits(Inst); i != e; ++i) if (BitInit *BI = dynamic_cast(getBit(Inst, i))) if (getMemoryBit(M, i) != BI->getValue()) - return 0; + throw std::string("Parse failed!\n"); return Inst; } @@ -353,24 +369,11 @@ static void ParseMachineCode() { }; #endif - std::vector Insts; - - const std::map &Defs = Records.getDefs(); - Record *Inst = Records.getClass("Instruction"); - assert(Inst && "Couldn't find Instruction class!"); - - for (std::map::const_iterator I = Defs.begin(), - E = Defs.end(); I != E; ++I) - if (I->second->isSubClassOf(Inst)) - Insts.push_back(I->second); + std::vector Insts = Records.getAllDerivedDefinitions("Instruction"); unsigned char *BuffPtr = Buffer; while (1) { Record *R = ParseMachineCode(Insts.begin(), Insts.end(), BuffPtr); - if (R == 0) { - std::cout << "Parse failed!\n"; - return; - } PrintInstruction(R, BuffPtr); unsigned Bits = getNumBits(R); @@ -397,34 +400,43 @@ int main(int argc, char **argv) { RemoveFileOnSignal(OutputFilename); } - int ErrorCode = 0; - - switch (Action) { - case Parse: ParseMachineCode(); break; - case GenEmitter: - ErrorCode = CodeEmitterGen(Records).run(*Out); - break; - case PrintRecords: - *Out << Records; // No argument, dump all contents - break; - case PrintEnums: - Record *R = Records.getClass(Class); - if (R == 0) { - std::cerr << "Cannot find class '" << Class << "'!\n"; - abort(); - } - - const std::map &Defs = Records.getDefs(); - for (std::map::const_iterator I = Defs.begin(), - E = Defs.end(); I != E; ++I) { - if (I->second->isSubClassOf(R)) { - *Out << I->first << ", "; + try { + switch (Action) { + case Parse: + ParseMachineCode(); + break; + case GenEmitter: + CodeEmitterGen(Records).run(*Out); + break; + case GenRegister: + RegisterInfoEmitter(Records).run(*Out); + break; + case GenRegisterHeader: + RegisterInfoEmitter(Records).runHeader(*Out); + break; + case PrintRecords: + *Out << Records; // No argument, dump all contents + break; + case PrintEnums: + Record *R = Records.getClass(Class); + if (R == 0) { + std::cerr << "Cannot find class '" << Class << "'!\n"; + abort(); } + + std::vector Recs = Records.getAllDerivedDefinitions(Class); + + for (unsigned i = 0, e = Recs.size(); i != e; ++i) + *Out << Recs[i] << ", "; + *Out << "\n"; + break; } - *Out << "\n"; - break; + } catch (const std::string &Error) { + std::cerr << Error << "\n"; + if (Out != &std::cout) delete Out; + return 1; } if (Out != &std::cout) delete Out; - return ErrorCode; + return 0; }