forked from OSchip/llvm-project
COFF, ELF: Adjust ICF hash computation to account for self relocations.
It turns out that sections in PGO instrumented object files on Windows contain a large number of relocations pointing to themselves. With r347429 this can cause many sections to receive the same hash (usually zero) as a result of a section's hash being xor'ed with itself. This patch causes the COFF and ELF linkers to avoid this problem by adding the hash of the relocated section instead of xor'ing it. On my machine this causes the regressing test case provided by Mozilla to terminate in 2m41s. Differential Revision: https://reviews.llvm.org/D56955 llvm-svn: 351898
This commit is contained in:
parent
881cae7a45
commit
3426111145
|
@ -271,7 +271,7 @@ void ICF::run(ArrayRef<Chunk *> Vec) {
|
|||
uint32_t Hash = SC->Class[1];
|
||||
for (Symbol *B : SC->symbols())
|
||||
if (auto *Sym = dyn_cast_or_null<DefinedRegular>(B))
|
||||
Hash ^= Sym->getChunk()->Class[1];
|
||||
Hash += Sym->getChunk()->Class[1];
|
||||
// Set MSB to 1 to avoid collisions with non-hash classs.
|
||||
SC->Class[0] = Hash | (1U << 31);
|
||||
});
|
||||
|
|
|
@ -431,7 +431,7 @@ static void combineRelocHashes(InputSection *IS, ArrayRef<RelTy> Rels) {
|
|||
Symbol &S = IS->template getFile<ELFT>()->getRelocTargetSym(Rel);
|
||||
if (auto *D = dyn_cast<Defined>(&S))
|
||||
if (auto *RelSec = dyn_cast_or_null<InputSection>(D->Section))
|
||||
Hash ^= RelSec->Class[1];
|
||||
Hash += RelSec->Class[1];
|
||||
}
|
||||
// Set MSB to 1 to avoid collisions with non-hash IDs.
|
||||
IS->Class[0] = Hash | (1U << 31);
|
||||
|
|
Loading…
Reference in New Issue