Add the ability to emit register file enums
authorChris Lattner <sabre@nondot.org>
Fri, 1 Aug 2003 05:59:20 +0000 (05:59 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 1 Aug 2003 05:59:20 +0000 (05:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7471 91177308-0d34-0410-b5e6-96231b3b80d8

support/tools/TableGen/RegisterInfoEmitter.cpp
support/tools/TableGen/RegisterInfoEmitter.h
support/tools/TableGen/TableGen.cpp
utils/TableGen/RegisterInfoEmitter.cpp
utils/TableGen/RegisterInfoEmitter.h
utils/TableGen/TableGen.cpp

index 200800fae627faf136835d0cc0905fe86b2fa997..66e7b1250f57c75e00670d00ccc219207b1810dd 100644 (file)
@@ -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 @@ 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<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 @@ 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<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 2a5d70a0fd75a6f31b9e0b0f913128306eb847f7..e58da63565c5219ffe81e3e1e53f8ecc5a311534 100644 (file)
@@ -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:
 };
 
index 218797ba284fbe6e92a8779c57d52c13c21880bb..4b0cd9d2a33e2951d6b0b642c7dd3b31cb4a648d 100644 (file)
@@ -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;
index 200800fae627faf136835d0cc0905fe86b2fa997..66e7b1250f57c75e00670d00ccc219207b1810dd 100644 (file)
@@ -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 @@ 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<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 @@ 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<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 2a5d70a0fd75a6f31b9e0b0f913128306eb847f7..e58da63565c5219ffe81e3e1e53f8ecc5a311534 100644 (file)
@@ -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:
 };
 
index 218797ba284fbe6e92a8779c57d52c13c21880bb..4b0cd9d2a33e2951d6b0b642c7dd3b31cb4a648d 100644 (file)
@@ -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;