forked from OSchip/llvm-project
[ELF] - Never use std::sort.
It turns out we should not use the std::sort anymore. r327219 added a new wrapper llvm::sort (D39245). When EXPENSIVE_CHECKS is defined, it shuffles the input container and that helps to find non-deterministic ordering. Patch changes code to use llvm::sort and std::stable_sort instead of std::sort Differential revision: https://reviews.llvm.org/D45969 llvm-svn: 330702
This commit is contained in:
parent
19f9b814dd
commit
de83cbf37e
|
@ -219,10 +219,10 @@ void CallGraphSort::groupClusters() {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Sort by density.
|
// Sort by density.
|
||||||
std::sort(Clusters.begin(), Clusters.end(),
|
std::stable_sort(Clusters.begin(), Clusters.end(),
|
||||||
[](const Cluster &A, const Cluster &B) {
|
[](const Cluster &A, const Cluster &B) {
|
||||||
return A.getDensity() > B.getDensity();
|
return A.getDensity() > B.getDensity();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
DenseMap<const InputSectionBase *, int> CallGraphSort::run() {
|
DenseMap<const InputSectionBase *, int> CallGraphSort::run() {
|
||||||
|
|
|
@ -90,8 +90,9 @@ static SymbolMapTy getSectionSyms(ArrayRef<Symbol *> Syms) {
|
||||||
// in the input files.
|
// in the input files.
|
||||||
for (auto &It : Ret) {
|
for (auto &It : Ret) {
|
||||||
SmallVectorImpl<Symbol *> &V = It.second;
|
SmallVectorImpl<Symbol *> &V = It.second;
|
||||||
std::sort(V.begin(), V.end(),
|
std::stable_sort(V.begin(), V.end(), [](Symbol *A, Symbol *B) {
|
||||||
[](Symbol *A, Symbol *B) { return A->getVA() < B->getVA(); });
|
return A->getVA() < B->getVA();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1393,10 +1393,10 @@ bool AndroidPackedRelocationSection<ELFT>::updateAllocSize() {
|
||||||
NonRelatives.push_back(R);
|
NonRelatives.push_back(R);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort(Relatives.begin(), Relatives.end(),
|
llvm::sort(Relatives.begin(), Relatives.end(),
|
||||||
[](const Elf_Rel &A, const Elf_Rel &B) {
|
[](const Elf_Rel &A, const Elf_Rel &B) {
|
||||||
return A.r_offset < B.r_offset;
|
return A.r_offset < B.r_offset;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Try to find groups of relative relocations which are spaced one word
|
// Try to find groups of relative relocations which are spaced one word
|
||||||
// apart from one another. These generally correspond to vtable entries. The
|
// apart from one another. These generally correspond to vtable entries. The
|
||||||
|
@ -1474,10 +1474,10 @@ bool AndroidPackedRelocationSection<ELFT>::updateAllocSize() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally the non-relative relocations.
|
// Finally the non-relative relocations.
|
||||||
std::sort(NonRelatives.begin(), NonRelatives.end(),
|
llvm::sort(NonRelatives.begin(), NonRelatives.end(),
|
||||||
[](const Elf_Rela &A, const Elf_Rela &B) {
|
[](const Elf_Rela &A, const Elf_Rela &B) {
|
||||||
return A.r_offset < B.r_offset;
|
return A.r_offset < B.r_offset;
|
||||||
});
|
});
|
||||||
if (!NonRelatives.empty()) {
|
if (!NonRelatives.empty()) {
|
||||||
Add(NonRelatives.size());
|
Add(NonRelatives.size());
|
||||||
Add(HasAddendIfRela);
|
Add(HasAddendIfRela);
|
||||||
|
|
|
@ -1106,7 +1106,7 @@ sortISDBySectionOrder(InputSectionDescription *ISD,
|
||||||
}
|
}
|
||||||
OrderedSections.push_back({IS, I->second});
|
OrderedSections.push_back({IS, I->second});
|
||||||
}
|
}
|
||||||
std::sort(
|
llvm::sort(
|
||||||
OrderedSections.begin(), OrderedSections.end(),
|
OrderedSections.begin(), OrderedSections.end(),
|
||||||
[&](std::pair<InputSection *, int> A, std::pair<InputSection *, int> B) {
|
[&](std::pair<InputSection *, int> A, std::pair<InputSection *, int> B) {
|
||||||
return A.second < B.second;
|
return A.second < B.second;
|
||||||
|
@ -2056,10 +2056,10 @@ struct SectionOffset {
|
||||||
// Check whether sections overlap for a specific address range (file offsets,
|
// Check whether sections overlap for a specific address range (file offsets,
|
||||||
// load and virtual adresses).
|
// load and virtual adresses).
|
||||||
static void checkOverlap(StringRef Name, std::vector<SectionOffset> &Sections) {
|
static void checkOverlap(StringRef Name, std::vector<SectionOffset> &Sections) {
|
||||||
std::sort(Sections.begin(), Sections.end(),
|
llvm::sort(Sections.begin(), Sections.end(),
|
||||||
[=](const SectionOffset &A, const SectionOffset &B) {
|
[=](const SectionOffset &A, const SectionOffset &B) {
|
||||||
return A.Offset < B.Offset;
|
return A.Offset < B.Offset;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Finding overlap is easy given a vector is sorted by start position.
|
// Finding overlap is easy given a vector is sorted by start position.
|
||||||
// If an element starts before the end of the previous element, they overlap.
|
// If an element starts before the end of the previous element, they overlap.
|
||||||
|
|
Loading…
Reference in New Issue