[llvm-commits] CVS: llvm/utils/TableGen/RegisterInfoEmitter.cpp RegisterInfoEmitter.h TableGen.cpp
Chris Lattner
lattner at cs.uiuc.edu
Fri Aug 1 01:00:10 PDT 2003
Changes in directory llvm/utils/TableGen:
RegisterInfoEmitter.cpp updated: 1.1 -> 1.2
RegisterInfoEmitter.h updated: 1.1 -> 1.2
TableGen.cpp updated: 1.12 -> 1.13
---
Log message:
Add the ability to emit register file enums
---
Diffs of the changes:
Index: llvm/utils/TableGen/RegisterInfoEmitter.cpp
diff -u llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.1 llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.2
--- llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.1 Thu Jul 31 23:38:38 2003
+++ llvm/utils/TableGen/RegisterInfoEmitter.cpp Fri Aug 1 00:59:20 2003
@@ -8,6 +8,7 @@
#include "RegisterInfoEmitter.h"
#include "Record.h"
+#include <set>
static void EmitSourceHeader(const std::string &Desc, std::ostream &o) {
o << "//===- TableGen'erated file -------------------------------------*-"
@@ -16,6 +17,29 @@
"----------------------------------===//\n\n";
}
+// runEnums - Print out enum values for all of the registers.
+void RegisterInfoEmitter::runEnums(std::ostream &OS) {
+ std::vector<Record*> Registers = Records.getAllDerivedDefinitions("Register");
+
+ if (Registers.size() == 0)
+ throw std::string("No 'Register' subclasses defined!");
+
+ std::string Namespace = Registers[0]->getValueAsString("Namespace");
+
+ EmitSourceHeader("Target Register Enum Values", OS);
+
+ if (!Namespace.empty())
+ OS << "namespace " << Namespace << " {\n";
+ OS << " enum {\n NoRegister,\n";
+
+ for (unsigned i = 0, e = Registers.size(); i != e; ++i)
+ OS << " " << Registers[i]->getName() << ",\n";
+
+ OS << " };\n";
+ if (!Namespace.empty())
+ OS << "}\n";
+}
+
void RegisterInfoEmitter::runHeader(std::ostream &OS) {
std::vector<Record*> RegisterInfos =
Records.getAllDerivedDefinitions("RegisterInfo");
@@ -27,14 +51,37 @@
std::string ClassName = RegisterInfos[0]->getValueAsString("ClassName");
- OS << "#include \"llvm/CodeGen/MRegisterInfo.h\"\n\n";
+ OS << "#include \"llvm/Target/MRegisterInfo.h\"\n\n";
- OS << "struct " << ClassName << ": public MRegisterInfo {\n"
+ OS << "struct " << ClassName << " : public MRegisterInfo {\n"
<< " " << ClassName << "();\n"
<< " const unsigned* getCalleeSaveRegs() const;\n"
<< "};\n\n";
}
-void RegisterInfoEmitter::run(std::ostream &o) {
+// RegisterInfoEmitter::run - Main register file description emitter.
+//
+void RegisterInfoEmitter::run(std::ostream &OS) {
+ EmitSourceHeader("Register Information Source Fragment", OS);
+
+ // Start out by emitting each of the register classes... to do this, we build
+ // a set of registers which belong to a register class, this is to ensure that
+ // each register is only in a single register class.
+ //
+ std::vector<Record*> RegisterClasses =
+ Records.getAllDerivedDefinitions("RegisterClass");
+
+ std::set<Record*> RegistersFound;
+
+ // Loop over all of the register classes... emitting each one.
+ OS << "namespace { // Register classes...\n";
+ std::vector<std::string> RegisterClassNames;
+ for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
+ Record *RC = RegisterClasses[rc];
+ std::string Name = RC->getName();
+ //if (Name[
+
+ }
+ OS << "}\n"; // End of anonymous namespace...
}
Index: llvm/utils/TableGen/RegisterInfoEmitter.h
diff -u llvm/utils/TableGen/RegisterInfoEmitter.h:1.1 llvm/utils/TableGen/RegisterInfoEmitter.h:1.2
--- llvm/utils/TableGen/RegisterInfoEmitter.h:1.1 Thu Jul 31 23:38:38 2003
+++ llvm/utils/TableGen/RegisterInfoEmitter.h Fri Aug 1 00:59:20 2003
@@ -22,6 +22,9 @@
// runHeader - Emit a header fragment for the register info emitter.
void runHeader(std::ostream &o);
+
+ // runEnums - Print out enum values for all of the registers.
+ void runEnums(std::ostream &o);
private:
};
Index: llvm/utils/TableGen/TableGen.cpp
diff -u llvm/utils/TableGen/TableGen.cpp:1.12 llvm/utils/TableGen/TableGen.cpp:1.13
--- llvm/utils/TableGen/TableGen.cpp:1.12 Thu Jul 31 23:47:20 2003
+++ llvm/utils/TableGen/TableGen.cpp Fri Aug 1 00:59:20 2003
@@ -19,7 +19,7 @@
enum ActionType {
PrintRecords,
GenEmitter,
- GenRegister, GenRegisterHeader,
+ GenRegisterEnums, GenRegister, GenRegisterHeader,
PrintEnums,
Parse,
};
@@ -31,6 +31,8 @@
"Print all records to stdout (default)"),
clEnumValN(GenEmitter, "gen-emitter",
"Generate machine code emitter"),
+ clEnumValN(GenRegisterEnums, "gen-register-enums",
+ "Generate enum values for registers"),
clEnumValN(GenRegister, "gen-register-desc",
"Generate a register info description"),
clEnumValN(GenRegisterHeader, "gen-register-desc-header",
@@ -410,6 +412,9 @@
break;
case GenEmitter:
CodeEmitterGen(Records).run(*Out);
+ break;
+ case GenRegisterEnums:
+ RegisterInfoEmitter(Records).runEnums(*Out);
break;
case GenRegister:
RegisterInfoEmitter(Records).run(*Out);
More information about the llvm-commits
mailing list