From 54d156d33324b7715453993f21684915a28e310a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 1 Aug 2003 05:59:20 +0000 Subject: [PATCH] Add the ability to emit register file enums git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7471 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../tools/TableGen/RegisterInfoEmitter.cpp | 53 +++++++++++++++++-- support/tools/TableGen/RegisterInfoEmitter.h | 3 ++ support/tools/TableGen/TableGen.cpp | 7 ++- utils/TableGen/RegisterInfoEmitter.cpp | 53 +++++++++++++++++-- utils/TableGen/RegisterInfoEmitter.h | 3 ++ utils/TableGen/TableGen.cpp | 7 ++- 6 files changed, 118 insertions(+), 8 deletions(-) diff --git a/support/tools/TableGen/RegisterInfoEmitter.cpp b/support/tools/TableGen/RegisterInfoEmitter.cpp index 200800fae62..66e7b1250f5 100644 --- a/support/tools/TableGen/RegisterInfoEmitter.cpp +++ b/support/tools/TableGen/RegisterInfoEmitter.cpp @@ -8,6 +8,7 @@ #include "RegisterInfoEmitter.h" #include "Record.h" +#include static void EmitSourceHeader(const std::string &Desc, std::ostream &o) { o << "//===- TableGen'erated file -------------------------------------*-" @@ -16,6 +17,29 @@ static void EmitSourceHeader(const std::string &Desc, std::ostream &o) { "----------------------------------===//\n\n"; } +// runEnums - Print out enum values for all of the registers. +void RegisterInfoEmitter::runEnums(std::ostream &OS) { + std::vector 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 RegisterInfos = Records.getAllDerivedDefinitions("RegisterInfo"); @@ -27,14 +51,37 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) { 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 RegisterClasses = + Records.getAllDerivedDefinitions("RegisterClass"); + + std::set RegistersFound; + + // Loop over all of the register classes... emitting each one. + OS << "namespace { // Register classes...\n"; + std::vector 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... } diff --git a/support/tools/TableGen/RegisterInfoEmitter.h b/support/tools/TableGen/RegisterInfoEmitter.h index 2a5d70a0fd7..e58da63565c 100644 --- a/support/tools/TableGen/RegisterInfoEmitter.h +++ b/support/tools/TableGen/RegisterInfoEmitter.h @@ -22,6 +22,9 @@ public: // 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: }; diff --git a/support/tools/TableGen/TableGen.cpp b/support/tools/TableGen/TableGen.cpp index 218797ba284..4b0cd9d2a33 100644 --- a/support/tools/TableGen/TableGen.cpp +++ b/support/tools/TableGen/TableGen.cpp @@ -19,7 +19,7 @@ enum ActionType { PrintRecords, GenEmitter, - GenRegister, GenRegisterHeader, + GenRegisterEnums, GenRegister, GenRegisterHeader, PrintEnums, Parse, }; @@ -31,6 +31,8 @@ namespace { "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", @@ -411,6 +413,9 @@ int main(int argc, char **argv) { case GenEmitter: CodeEmitterGen(Records).run(*Out); break; + case GenRegisterEnums: + RegisterInfoEmitter(Records).runEnums(*Out); + break; case GenRegister: RegisterInfoEmitter(Records).run(*Out); break; diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp index 200800fae62..66e7b1250f5 100644 --- a/utils/TableGen/RegisterInfoEmitter.cpp +++ b/utils/TableGen/RegisterInfoEmitter.cpp @@ -8,6 +8,7 @@ #include "RegisterInfoEmitter.h" #include "Record.h" +#include static void EmitSourceHeader(const std::string &Desc, std::ostream &o) { o << "//===- TableGen'erated file -------------------------------------*-" @@ -16,6 +17,29 @@ static void EmitSourceHeader(const std::string &Desc, std::ostream &o) { "----------------------------------===//\n\n"; } +// runEnums - Print out enum values for all of the registers. +void RegisterInfoEmitter::runEnums(std::ostream &OS) { + std::vector 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 RegisterInfos = Records.getAllDerivedDefinitions("RegisterInfo"); @@ -27,14 +51,37 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) { 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 RegisterClasses = + Records.getAllDerivedDefinitions("RegisterClass"); + + std::set RegistersFound; + + // Loop over all of the register classes... emitting each one. + OS << "namespace { // Register classes...\n"; + std::vector 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... } diff --git a/utils/TableGen/RegisterInfoEmitter.h b/utils/TableGen/RegisterInfoEmitter.h index 2a5d70a0fd7..e58da63565c 100644 --- a/utils/TableGen/RegisterInfoEmitter.h +++ b/utils/TableGen/RegisterInfoEmitter.h @@ -22,6 +22,9 @@ public: // 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: }; diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp index 218797ba284..4b0cd9d2a33 100644 --- a/utils/TableGen/TableGen.cpp +++ b/utils/TableGen/TableGen.cpp @@ -19,7 +19,7 @@ enum ActionType { PrintRecords, GenEmitter, - GenRegister, GenRegisterHeader, + GenRegisterEnums, GenRegister, GenRegisterHeader, PrintEnums, Parse, }; @@ -31,6 +31,8 @@ namespace { "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", @@ -411,6 +413,9 @@ int main(int argc, char **argv) { case GenEmitter: CodeEmitterGen(Records).run(*Out); break; + case GenRegisterEnums: + RegisterInfoEmitter(Records).runEnums(*Out); + break; case GenRegister: RegisterInfoEmitter(Records).run(*Out); break; -- 2.34.1