diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-12-17 15:08:24 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-12-17 15:08:24 +0000 |
| commit | f50f96be5dc098d05c47aaaded0d58ed6393847c (patch) | |
| tree | 2c60602522750c6875f0ae64993b09af2431ab79 /lib/MC/ELFObjectWriter.cpp | |
| parent | b8e9fb8816ecedf720f2085098e76c836e9f8434 (diff) | |
Always sort by offset first. NFC.
Every target changing sortRelocs was first calling the parent
implementation. Just run that first.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255898 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/ELFObjectWriter.cpp')
| -rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index df7a606a717f..a92b049d8985 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -1046,10 +1046,26 @@ void ELFObjectWriter::WriteSecHdrEntry(uint32_t Name, uint32_t Type, WriteWord(EntrySize); // sh_entsize } +// ELF doesn't require relocations to be in any order. We sort by the Offset, +// just to match gnu as for easier comparison. The use type is an arbitrary way +// of making the sort deterministic. +static int cmpRel(const ELFRelocationEntry *AP, const ELFRelocationEntry *BP) { + const ELFRelocationEntry &A = *AP; + const ELFRelocationEntry &B = *BP; + if (A.Offset != B.Offset) + return B.Offset - A.Offset; + if (B.Type != A.Type) + return A.Type - B.Type; + llvm_unreachable("ELFRelocs might be unstable!"); + return 0; +} + void ELFObjectWriter::writeRelocations(const MCAssembler &Asm, const MCSectionELF &Sec) { std::vector<ELFRelocationEntry> &Relocs = Relocations[&Sec]; + array_pod_sort(Relocs.begin(), Relocs.end(), cmpRel); + // Sort the relocation entries. Most targets just sort by Offset, but some // (e.g., MIPS) have additional constraints. TargetObjectWriter->sortRelocs(Asm, Relocs); |
