mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-16 12:24:44 +00:00
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
This commit is contained in:
parent
6ba50a9252
commit
690d80eefe
@ -1175,6 +1175,23 @@ public:
|
|||||||
void dump() const;
|
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);
|
std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK);
|
||||||
|
|
||||||
extern RecordKeeper Records;
|
extern RecordKeeper Records;
|
||||||
|
@ -422,7 +422,8 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
|
|||||||
std::map<Record*, std::set<Record*> > RegisterSuperRegs;
|
std::map<Record*, std::set<Record*> > RegisterSuperRegs;
|
||||||
std::map<Record*, std::set<Record*> > RegisterAliases;
|
std::map<Record*, std::set<Record*> > RegisterAliases;
|
||||||
std::map<Record*, std::vector<std::pair<int, Record*> > > SubRegVectors;
|
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();
|
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
|
// Now we know maximal length of number list. Append -1's, where needed
|
||||||
for (std::map<Record*, std::vector<int> >::iterator
|
for (DwarfRegNumsMapTy::iterator
|
||||||
I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I)
|
I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I)
|
||||||
for (unsigned i = I->second.size(), e = maxLength; i != e; ++i)
|
for (unsigned i = I->second.size(), e = maxLength; i != e; ++i)
|
||||||
I->second.push_back(-1);
|
I->second.push_back(-1);
|
||||||
|
|
||||||
@ -712,8 +713,11 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
|
|||||||
<< " default:\n"
|
<< " default:\n"
|
||||||
<< " assert(0 && \"Invalid RegNum\");\n"
|
<< " assert(0 && \"Invalid RegNum\");\n"
|
||||||
<< " return -1;\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) {
|
I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) {
|
||||||
int RegNo = I->second[i];
|
int RegNo = I->second[i];
|
||||||
if (RegNo != -2)
|
if (RegNo != -2)
|
||||||
|
@ -19,24 +19,6 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
using namespace llvm;
|
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.
|
// Enumeration - Emit the specified class as an enumeration.
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user