Always sort by offset first. NFC.

Every target changing sortRelocs was first calling the parent
implementation. Just run that first.

llvm-svn: 255898
This commit is contained in:
Rafael Espindola 2015-12-17 15:08:24 +00:00
parent 8561841875
commit d0e16522c7
4 changed files with 16 additions and 22 deletions

View File

@ -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);

View File

@ -29,23 +29,7 @@ bool MCELFObjectTargetWriter::needsRelocateWithSymbol(const MCSymbol &Sym,
return false;
}
// 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
MCELFObjectTargetWriter::sortRelocs(const MCAssembler &Asm,
std::vector<ELFRelocationEntry> &Relocs) {
array_pod_sort(Relocs.begin(), Relocs.end(), cmpRel);
}

View File

@ -332,9 +332,6 @@ void MipsELFObjectWriter::sortRelocs(const MCAssembler &Asm,
if (Relocs.size() < 2)
return;
// The default function sorts entries by Offset in descending order.
MCELFObjectTargetWriter::sortRelocs(Asm, Relocs);
// Init MipsRelocs from Relocs.
std::vector<MipsRelocationEntry> MipsRelocs;
for (unsigned I = 0, E = Relocs.size(); I != E; ++I)

View File

@ -156,9 +156,6 @@ unsigned SystemZObjectWriter::GetRelocType(const MCValue &Target,
void SystemZObjectWriter::sortRelocs(const MCAssembler &Asm,
std::vector<ELFRelocationEntry> &Relocs) {
// The default function sorts entries by Offset in descending order.
MCELFObjectTargetWriter::sortRelocs(Asm, Relocs);
// This is OK for SystemZ, except for R_390_TLS_GDCALL/LDCALL relocs.
// There is typically another reloc, a R_390_PLT32DBL, on the same
// instruction. This other reloc must come *before* the GDCALL reloc,