From 690d80eefeb522c8697ef39d9e6d19b0be276f0e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 26 Aug 2008 06:43:25 +0000 Subject: [PATCH] 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 --- utils/TableGen/Record.h | 17 +++++++++++++++++ utils/TableGen/RegisterInfoEmitter.cpp | 12 ++++++++---- utils/TableGen/SubtargetEmitter.cpp | 18 ------------------ 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h index c36d808213b..d597715cd1a 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 d514bf7deb8..7517c5eee55 100644 --- a/utils/TableGen/RegisterInfoEmitter.cpp +++ b/utils/TableGen/RegisterInfoEmitter.cpp @@ -422,7 +422,8 @@ void RegisterInfoEmitter::run(std::ostream &OS) { std::map > RegisterSuperRegs; std::map > RegisterAliases; std::map > > SubRegVectors; - std::map > DwarfRegNums; + typedef std::map, LessRecord> DwarfRegNumsMapTy; + DwarfRegNumsMapTy DwarfRegNums; const std::vector &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 >::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 >::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 1f833efcaac..9b5f6df4d4a 100644 --- a/utils/TableGen/SubtargetEmitter.cpp +++ b/utils/TableGen/SubtargetEmitter.cpp @@ -19,24 +19,6 @@ #include 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. //