[llvm-commits] CVS: llvm/utils/TableGen/TableGen.cpp
Chris Lattner
lattner at cs.uiuc.edu
Thu Jul 31 23:40:00 PDT 2003
Changes in directory llvm/utils/TableGen:
TableGen.cpp updated: 1.10 -> 1.11
---
Log message:
Add file comment
Add register info emitter
Simplify code by using "high-level" methods.
---
Diffs of the changes:
Index: llvm/utils/TableGen/TableGen.cpp
diff -u llvm/utils/TableGen/TableGen.cpp:1.10 llvm/utils/TableGen/TableGen.cpp:1.11
--- llvm/utils/TableGen/TableGen.cpp:1.10 Wed Jul 30 23:38:26 2003
+++ llvm/utils/TableGen/TableGen.cpp Thu Jul 31 23:39:05 2003
@@ -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 <algorithm>
#include <fstream>
enum ActionType {
PrintRecords,
GenEmitter,
+ GenRegister, GenRegisterHeader,
PrintEnums,
Parse,
};
@@ -19,6 +31,10 @@
"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 @@
for (unsigned i = 0, e = getNumBits(Inst); i != e; ++i)
if (BitInit *BI = dynamic_cast<BitInit*>(getBit(Inst, i)))
if (getMemoryBit(M, i) != BI->getValue())
- return 0;
+ throw std::string("Parse failed!\n");
return Inst;
}
@@ -353,24 +369,11 @@
};
#endif
- std::vector<Record*> Insts;
-
- const std::map<std::string, Record*> &Defs = Records.getDefs();
- Record *Inst = Records.getClass("Instruction");
- assert(Inst && "Couldn't find Instruction class!");
-
- for (std::map<std::string, Record*>::const_iterator I = Defs.begin(),
- E = Defs.end(); I != E; ++I)
- if (I->second->isSubClassOf(Inst))
- Insts.push_back(I->second);
+ std::vector<Record*> 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 @@
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<std::string, Record*> &Defs = Records.getDefs();
- for (std::map<std::string, Record*>::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();
}
- }
- *Out << "\n";
- break;
+
+ std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class);
+
+ for (unsigned i = 0, e = Recs.size(); i != e; ++i)
+ *Out << Recs[i] << ", ";
+ *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;
}
More information about the llvm-commits
mailing list