Add support for option aliases.
[oota-llvm.git] / utils / TableGen / RegisterInfoEmitter.cpp
index bb510ca01d36e5d453a83e7a20497a577083cf2f..b9253cfd3e84e408227a29e6361d265ae65fcca7 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -21,6 +21,7 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/Support/Streams.h"
 #include <set>
+#include <algorithm>
 using namespace llvm;
 
 // runEnums - Print out enum values for all of the registers.
@@ -52,17 +53,17 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) {
   const std::string &TargetName = Target.getName();
   std::string ClassName = TargetName + "GenRegisterInfo";
 
-  OS << "#include \"llvm/Target/MRegisterInfo.h\"\n";
+  OS << "#include \"llvm/Target/TargetRegisterInfo.h\"\n";
   OS << "#include <string>\n\n";
 
   OS << "namespace llvm {\n\n";
 
-  OS << "struct " << ClassName << " : public MRegisterInfo {\n"
-     << "  " << ClassName
+  OS << "struct " << ClassName << " : public TargetRegisterInfo {\n"
+     << "  explicit " << ClassName
      << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
      << "  virtual int getDwarfRegNumFull(unsigned RegNum, "
      << "unsigned Flavour) const;\n"
-     << "  virtual int getDwarfRegNum(unsigned RegNum) const = 0;\n"
+     << "  virtual int getDwarfRegNum(unsigned RegNum, bool isEH) const = 0;\n"
      << "  unsigned getSubReg(unsigned RegNo, unsigned Index) const;\n"
      << "};\n\n";
 
@@ -77,7 +78,7 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) {
     for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
       if (i) OS << ",\n";
       OS << "    " << RegisterClasses[i].getName() << "RegClassID";
-      if (!i) OS << " = 1";
+      OS << " = " << (i+1);
     }
     OS << "\n  };\n\n";
 
@@ -113,11 +114,10 @@ bool isSubRegisterClass(const CodeGenRegisterClass &RC,
 static void addSuperReg(Record *R, Record *S,
                         std::map<Record*, std::set<Record*> > &SubRegs,
                         std::map<Record*, std::set<Record*> > &SuperRegs,
-                        std::map<Record*, std::set<Record*> > &Aliases,
-                        RegisterInfoEmitter &RIE) {
+                        std::map<Record*, std::set<Record*> > &Aliases) {
   if (R == S) {
     cerr << "Error: recursive sub-register relationship between"
-         << " register " << RIE.getQualifiedName(R)
+         << " register " << getQualifiedName(R)
          << " and its sub-registers?\n";
     abort();
   }
@@ -129,32 +129,45 @@ static void addSuperReg(Record *R, Record *S,
   if (SuperRegs.count(S))
     for (std::set<Record*>::iterator I = SuperRegs[S].begin(),
            E = SuperRegs[S].end(); I != E; ++I)
-      addSuperReg(R, *I, SubRegs, SuperRegs, Aliases, RIE);
+      addSuperReg(R, *I, SubRegs, SuperRegs, Aliases);
 }
 
 static void addSubSuperReg(Record *R, Record *S,
                            std::map<Record*, std::set<Record*> > &SubRegs,
                            std::map<Record*, std::set<Record*> > &SuperRegs,
-                           std::map<Record*, std::set<Record*> > &Aliases,
-                           RegisterInfoEmitter &RIE) {
+                           std::map<Record*, std::set<Record*> > &Aliases) {
   if (R == S) {
     cerr << "Error: recursive sub-register relationship between"
-         << " register " << RIE.getQualifiedName(R)
+         << " register " << getQualifiedName(R)
          << " and its sub-registers?\n";
     abort();
   }
 
   if (!SubRegs[R].insert(S).second)
     return;
-  addSuperReg(S, R, SubRegs, SuperRegs, Aliases, RIE);
+  addSuperReg(S, R, SubRegs, SuperRegs, Aliases);
   Aliases[R].insert(S);
   Aliases[S].insert(R);
   if (SubRegs.count(S))
     for (std::set<Record*>::iterator I = SubRegs[S].begin(),
            E = SubRegs[S].end(); I != E; ++I)
-      addSubSuperReg(R, *I, SubRegs, SuperRegs, Aliases, RIE);
+      addSubSuperReg(R, *I, SubRegs, SuperRegs, Aliases);
 }
 
+class RegisterSorter {
+private:
+  std::map<Record*, std::set<Record*> > &RegisterSubRegs;
+
+public:
+  RegisterSorter(std::map<Record*, std::set<Record*> > &RS)
+    : RegisterSubRegs(RS) {};
+
+  bool operator()(Record *RegA, Record *RegB) {
+    // B is sub-register of A.
+    return RegisterSubRegs.count(RegA) && RegisterSubRegs[RegA].count(RegB);
+  }
+};
+
 // RegisterInfoEmitter::run - Main register file description emitter.
 //
 void RegisterInfoEmitter::run(std::ostream &OS) {
@@ -446,7 +459,7 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
              << " multiple times!\n";
       RegisterImmSubRegs[R].insert(SubReg);
       addSubSuperReg(R, SubReg, RegisterSubRegs, RegisterSuperRegs,
-                     RegisterAliases, *this);
+                     RegisterAliases);
     }
   }
 
@@ -476,9 +489,14 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   for (std::map<Record*, std::set<Record*> >::iterator
          I = RegisterSubRegs.begin(), E = RegisterSubRegs.end(); I != E; ++I) {
     OS << "  const unsigned " << I->first->getName() << "_SubRegsSet[] = { ";
+    std::vector<Record*> SubRegsVector;
     for (std::set<Record*>::iterator ASI = I->second.begin(),
            E = I->second.end(); ASI != E; ++ASI)
-      OS << getQualifiedName(*ASI) << ", ";
+      SubRegsVector.push_back(*ASI);
+    RegisterSorter RS(RegisterSubRegs);
+    std::stable_sort(SubRegsVector.begin(), SubRegsVector.end(), RS);
+    for (unsigned i = 0, e = SubRegsVector.size(); i != e; ++i)
+      OS << getQualifiedName(SubRegsVector[i]) << ", ";
     OS << "0 };\n";
   }
 
@@ -507,14 +525,20 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   for (std::map<Record*, std::set<Record*> >::iterator
          I = RegisterSuperRegs.begin(), E = RegisterSuperRegs.end(); I != E; ++I) {
     OS << "  const unsigned " << I->first->getName() << "_SuperRegsSet[] = { ";
+
+    std::vector<Record*> SuperRegsVector;
     for (std::set<Record*>::iterator ASI = I->second.begin(),
            E = I->second.end(); ASI != E; ++ASI)
-      OS << getQualifiedName(*ASI) << ", ";
+      SuperRegsVector.push_back(*ASI);
+    RegisterSorter RS(RegisterSubRegs);
+    std::stable_sort(SuperRegsVector.begin(), SuperRegsVector.end(), RS);
+    for (unsigned i = 0, e = SuperRegsVector.size(); i != e; ++i)
+      OS << getQualifiedName(SuperRegsVector[i]) << ", ";
     OS << "0 };\n";
   }
 
   OS<<"\n  const TargetRegisterDesc RegisterDescriptors[] = { // Descriptors\n";
-  OS << "    { \"NOREG\",\t0,\t0,\t0,\t0 },\n";
+  OS << "    { \"NOREG\",\t\"NOREG\",\t0,\t0,\t0,\t0 },\n";
 
   // Now that register alias and sub-registers sets have been emitted, emit the
   // register descriptors now.
@@ -522,10 +546,20 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
     const CodeGenRegister &Reg = Registers[i];
     OS << "    { \"";
-    if (!Reg.TheDef->getValueAsString("Name").empty())
-      OS << Reg.TheDef->getValueAsString("Name");
+    if (!Reg.TheDef->getValueAsString("AsmName").empty())
+      OS << Reg.TheDef->getValueAsString("AsmName");
     else
       OS << Reg.getName();
+    OS << "\",\t\"";
+    if (!Reg.TheDef->getValueAsString("Name").empty()) {
+      OS << Reg.TheDef->getValueAsString("Name");
+    } else {
+      // Default to "name".
+      if (!Reg.TheDef->getValueAsString("AsmName").empty())
+        OS << Reg.TheDef->getValueAsString("AsmName");
+      else
+        OS << Reg.getName();
+    }
     OS << "\",\t";
     if (RegisterAliases.count(Reg.TheDef))
       OS << Reg.getName() << "_AliasSet,\t";
@@ -590,7 +624,7 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   // Emit the constructor of the class...
   OS << ClassName << "::" << ClassName
      << "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n"
-     << "  : MRegisterInfo(RegisterDescriptors, " << Registers.size()+1
+     << "  : TargetRegisterInfo(RegisterDescriptors, " << Registers.size()+1
      << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n "
      << "                 CallFrameSetupOpcode, CallFrameDestroyOpcode) {}\n\n";
 
@@ -601,7 +635,7 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
     Record *Reg = Registers[i].TheDef;
     std::vector<int> RegNums = Reg->getValueAsListOfInts("DwarfNumbers");
-    maxLength = std::max(maxLength, RegNums.size());
+    maxLength = std::max((size_t)maxLength, RegNums.size());
     if (DwarfRegNums.count(Reg))
       cerr << "Warning: DWARF numbers for register " << getQualifiedName(Reg)
            << "specified multiple times\n";