Export the register classes so that the instruction selector can get at them as needed
authorChris Lattner <sabre@nondot.org>
Wed, 6 Aug 2003 21:47:14 +0000 (21:47 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 6 Aug 2003 21:47:14 +0000 (21:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7651 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 522cd11aaffdf29e1ce09e52db1cf3e11e591e20..e5bab478e9061c4f72f022ee40942f4f057ef797 100644 (file)
 
 NodeType::ArgResultTypes NodeType::Translate(Record *R) {
   const std::string &Name = R->getName();
-  if (Name == "DNRT_void") return Void;
-  if (Name == "DNRT_val" || Name == "DNAT_val") return Val;
-  if (Name == "DNRT_arg0" || Name == "DNAT_arg0") return Arg0;
-  if (Name == "DNAT_ptr") return Ptr;
-  throw "Unknown DagNodeResult Type '" + Name + "'!";
+  if (Name == "DNVT_void") return Void;
+  if (Name == "DNVT_val" ) return Val;
+  if (Name == "DNVT_arg0") return Arg0;
+  if (Name == "DNVT_ptr" ) return Ptr;
+  throw "Unknown DagNodeValType '" + Name + "'!";
 }
 
 
index a4ad8d5a734a599ec8084daa5184fc4f3bf47933..396f34094985a57b1b80dd7646554a7f1b87743f 100644 (file)
@@ -36,8 +36,8 @@ void RegisterInfoEmitter::runEnums(std::ostream &OS) {
 
 void RegisterInfoEmitter::runHeader(std::ostream &OS) {
   EmitSourceFileHeader("Register Information Header Fragment", OS);
-  
-  std::string ClassName = getTarget(Records)->getName() + "GenRegisterInfo";
+  const std::string &TargetName = getTarget(Records)->getName();
+  std::string ClassName = TargetName + "GenRegisterInfo";
 
   OS << "#include \"llvm/Target/MRegisterInfo.h\"\n\n";
 
@@ -46,6 +46,17 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) {
      << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
      << "  const unsigned* getCalleeSaveRegs() const;\n"
      << "};\n\n";
+
+  std::vector<Record*> RegisterClasses =
+    Records.getAllDerivedDefinitions("RegisterClass");
+
+  OS << "namespace " << TargetName << " { // Register classes\n";
+  for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
+    const std::string &Name = RegisterClasses[i]->getName();
+    if (Name.size() < 9 || Name[9] != '.')    // Ignore anonymous classes
+      OS << "  extern TargetRegisterClass *" << Name << "RegisterClass;\n";
+  }
+  OS << "} // end of namespace " << TargetName << "\n\n";
 }
 
 // RegisterInfoEmitter::run - Main register file description emitter.
@@ -183,6 +194,18 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   OS << "}\n\n";       // End of anonymous namespace...
 
   Record *Target = getTarget(Records);
+
+  OS << "namespace " << Target->getName() << " { // Register classes\n";
+  for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
+    const std::string &Name = RegisterClasses[i]->getName();
+    if (Name.size() < 9 || Name[9] != '.')    // Ignore anonymous classes
+      OS << "  TargetRegisterClass *" << Name << "RegisterClass = &"
+         << Name << "Instance;\n";
+  }
+  OS << "} // end of namespace " << Target->getName() << "\n\n";
+
+
+
   std::string ClassName = Target->getName() + "GenRegisterInfo";
   
   // Emit the constructor of the class...
index 522cd11aaffdf29e1ce09e52db1cf3e11e591e20..e5bab478e9061c4f72f022ee40942f4f057ef797 100644 (file)
 
 NodeType::ArgResultTypes NodeType::Translate(Record *R) {
   const std::string &Name = R->getName();
-  if (Name == "DNRT_void") return Void;
-  if (Name == "DNRT_val" || Name == "DNAT_val") return Val;
-  if (Name == "DNRT_arg0" || Name == "DNAT_arg0") return Arg0;
-  if (Name == "DNAT_ptr") return Ptr;
-  throw "Unknown DagNodeResult Type '" + Name + "'!";
+  if (Name == "DNVT_void") return Void;
+  if (Name == "DNVT_val" ) return Val;
+  if (Name == "DNVT_arg0") return Arg0;
+  if (Name == "DNVT_ptr" ) return Ptr;
+  throw "Unknown DagNodeValType '" + Name + "'!";
 }
 
 
index a4ad8d5a734a599ec8084daa5184fc4f3bf47933..396f34094985a57b1b80dd7646554a7f1b87743f 100644 (file)
@@ -36,8 +36,8 @@ void RegisterInfoEmitter::runEnums(std::ostream &OS) {
 
 void RegisterInfoEmitter::runHeader(std::ostream &OS) {
   EmitSourceFileHeader("Register Information Header Fragment", OS);
-  
-  std::string ClassName = getTarget(Records)->getName() + "GenRegisterInfo";
+  const std::string &TargetName = getTarget(Records)->getName();
+  std::string ClassName = TargetName + "GenRegisterInfo";
 
   OS << "#include \"llvm/Target/MRegisterInfo.h\"\n\n";
 
@@ -46,6 +46,17 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) {
      << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
      << "  const unsigned* getCalleeSaveRegs() const;\n"
      << "};\n\n";
+
+  std::vector<Record*> RegisterClasses =
+    Records.getAllDerivedDefinitions("RegisterClass");
+
+  OS << "namespace " << TargetName << " { // Register classes\n";
+  for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
+    const std::string &Name = RegisterClasses[i]->getName();
+    if (Name.size() < 9 || Name[9] != '.')    // Ignore anonymous classes
+      OS << "  extern TargetRegisterClass *" << Name << "RegisterClass;\n";
+  }
+  OS << "} // end of namespace " << TargetName << "\n\n";
 }
 
 // RegisterInfoEmitter::run - Main register file description emitter.
@@ -183,6 +194,18 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   OS << "}\n\n";       // End of anonymous namespace...
 
   Record *Target = getTarget(Records);
+
+  OS << "namespace " << Target->getName() << " { // Register classes\n";
+  for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
+    const std::string &Name = RegisterClasses[i]->getName();
+    if (Name.size() < 9 || Name[9] != '.')    // Ignore anonymous classes
+      OS << "  TargetRegisterClass *" << Name << "RegisterClass = &"
+         << Name << "Instance;\n";
+  }
+  OS << "} // end of namespace " << Target->getName() << "\n\n";
+
+
+
   std::string ClassName = Target->getName() + "GenRegisterInfo";
   
   // Emit the constructor of the class...