Stabilize 'getDwarfRegNumFull' output to not depend on random memory
authorChris Lattner <sabre@nondot.org>
Tue, 26 Aug 2008 06:43:25 +0000 (06:43 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 26 Aug 2008 06:43:25 +0000 (06:43 +0000)
orders, part of PR2590

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55359 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/Record.h
utils/TableGen/RegisterInfoEmitter.cpp
utils/TableGen/SubtargetEmitter.cpp

index c36d808213b9590f865398ebc346aa99de70b782..d597715cd1af76286b78624eaf5c342b87963a96 100644 (file)
@@ -1175,6 +1175,23 @@ public:
   void dump() const;
 };
 
+/// LessRecord - Sorting predicate to sort record pointers by name.
+///
+struct LessRecord {
+  bool operator()(const Record *Rec1, const Record *Rec2) const {
+    return Rec1->getName() < Rec2->getName();
+  }
+};
+
+/// LessRecord - Sorting predicate to sort record pointers by their name field.
+///
+struct LessRecordFieldName {
+  bool operator()(const Record *Rec1, const Record *Rec2) const {
+    return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name");
+  }
+};
+
+  
 std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK);
 
 extern RecordKeeper Records;
index d514bf7deb8fc02e5a7fb0ce9e1725cc9f855dae..7517c5eee556feb6501c726e198a3fdd89c5dea7 100644 (file)
@@ -422,7 +422,8 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   std::map<Record*, std::set<Record*> > RegisterSuperRegs;
   std::map<Record*, std::set<Record*> > RegisterAliases;
   std::map<Record*, std::vector<std::pair<int, Record*> > > SubRegVectors;
-  std::map<Record*, std::vector<int> > DwarfRegNums;
+  typedef std::map<Record*, std::vector<int>, LessRecord> DwarfRegNumsMapTy;
+  DwarfRegNumsMapTy DwarfRegNums;
   
   const std::vector<CodeGenRegister> &Regs = Target.getRegisters();
 
@@ -693,8 +694,8 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   }
 
   // Now we know maximal length of number list. Append -1's, where needed
-  for (std::map<Record*, std::vector<int> >::iterator 
-        I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I)
+  for (DwarfRegNumsMapTy::iterator 
+       I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I)
     for (unsigned i = I->second.size(), e = maxLength; i != e; ++i)
       I->second.push_back(-1);
 
@@ -712,8 +713,11 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
        << "    default:\n"
        << "      assert(0 && \"Invalid RegNum\");\n"
        << "      return -1;\n";
+    
+    // Sort by name to get a stable order.
+    
 
-    for (std::map<Record*, std::vector<int> >::iterator 
+    for (DwarfRegNumsMapTy::iterator 
            I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) {
       int RegNo = I->second[i];
       if (RegNo != -2)
index 1f833efcaac897d44968bef1ae033a4e750c2072..9b5f6df4d4abf5f6038d2851004f463534fe7414 100644 (file)
 #include <algorithm>
 using namespace llvm;
 
-//
-// Record sort by name function.
-//
-struct LessRecord {
-  bool operator()(const Record *Rec1, const Record *Rec2) const {
-    return Rec1->getName() < Rec2->getName();
-  }
-};
-
-//
-// Record sort by field "Name" function.
-//
-struct LessRecordFieldName {
-  bool operator()(const Record *Rec1, const Record *Rec2) const {
-    return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name");
-  }
-};
-
 //
 // Enumeration - Emit the specified class as an enumeration.
 //