summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-08-26 06:43:25 +0000
committerChris Lattner <sabre@nondot.org>2008-08-26 06:43:25 +0000
commit690d80eefeb522c8697ef39d9e6d19b0be276f0e (patch)
tree08551a11eb6121cb91dd1b818ab5a9dc4771c138 /utils
parent6ba50a92525521b46ef5c72ee5a0f80ba0263c01 (diff)
downloadllvm-690d80eefeb522c8697ef39d9e6d19b0be276f0e.tar.gz
llvm-690d80eefeb522c8697ef39d9e6d19b0be276f0e.tar.bz2
llvm-690d80eefeb522c8697ef39d9e6d19b0be276f0e.tar.xz
Stabilize 'getDwarfRegNumFull' output to not depend on random memory
orders, part of PR2590 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55359 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/Record.h17
-rw-r--r--utils/TableGen/RegisterInfoEmitter.cpp12
-rw-r--r--utils/TableGen/SubtargetEmitter.cpp18
3 files changed, 25 insertions, 22 deletions
diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h
index c36d808213..d597715cd1 100644
--- a/utils/TableGen/Record.h
+++ b/utils/TableGen/Record.h
@@ -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;
diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp
index d514bf7deb..7517c5eee5 100644
--- a/utils/TableGen/RegisterInfoEmitter.cpp
+++ b/utils/TableGen/RegisterInfoEmitter.cpp
@@ -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)
diff --git a/utils/TableGen/SubtargetEmitter.cpp b/utils/TableGen/SubtargetEmitter.cpp
index 1f833efcaa..9b5f6df4d4 100644
--- a/utils/TableGen/SubtargetEmitter.cpp
+++ b/utils/TableGen/SubtargetEmitter.cpp
@@ -20,24 +20,6 @@
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.
//
void SubtargetEmitter::Enumeration(std::ostream &OS,