[llvm] r255902 - Avoid explicit relocation sorting most of the time.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 17 08:22:06 PST 2015
Author: rafael
Date: Thu Dec 17 10:22:06 2015
New Revision: 255902
URL: http://llvm.org/viewvc/llvm-project?rev=255902&view=rev
Log:
Avoid explicit relocation sorting most of the time.
These days relocations are created and stored in a deterministic way.
The order they are created is also suitable for the .o file, so we don't
need an explicit sort.
The last remaining exception is MIPS.
Modified:
llvm/trunk/lib/MC/ELFObjectWriter.cpp
llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp
llvm/trunk/test/MC/ARM/eh-compact-pr0.s
llvm/trunk/test/MC/ARM/eh-compact-pr1.s
llvm/trunk/test/MC/ARM/eh-directive-handlerdata.s
llvm/trunk/test/MC/ARM/eh-directive-personalityindex.s
llvm/trunk/test/MC/ARM/eh-directive-text-section.s
Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=255902&r1=255901&r2=255902&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Thu Dec 17 10:22:06 2015
@@ -1046,28 +1046,17 @@ void ELFObjectWriter::WriteSecHdrEntry(u
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);
+ // We record relocations by pushing to the end of a vector. Reverse the vector
+ // to get the relocations in the order they were created.
+ // In most cases that is not important, but it can be for special sections
+ // (.eh_frame) or specific relocations (TLS optimizations on SystemZ).
+ std::reverse(Relocs.begin(), Relocs.end());
- // Sort the relocation entries. Most targets just sort by Offset, but some
- // (e.g., MIPS) have additional constraints.
+ // Sort the relocation entries. MIPS needs this.
TargetObjectWriter->sortRelocs(Asm, Relocs);
for (unsigned i = 0, e = Relocs.size(); i != e; ++i) {
Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp?rev=255902&r1=255901&r2=255902&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp Thu Dec 17 10:22:06 2015
@@ -327,11 +327,25 @@ static void setMatch(MipsRelocationEntry
// matching LO;
// - prefer LOs without a pair;
// - prefer LOs with higher offset;
+
+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;
+ return 0;
+}
+
void MipsELFObjectWriter::sortRelocs(const MCAssembler &Asm,
std::vector<ELFRelocationEntry> &Relocs) {
if (Relocs.size() < 2)
return;
+ // Sorts entries by Offset in descending order.
+ array_pod_sort(Relocs.begin(), Relocs.end(), cmpRel);
+
// Init MipsRelocs from Relocs.
std::vector<MipsRelocationEntry> MipsRelocs;
for (unsigned I = 0, E = Relocs.size(); I != E; ++I)
Modified: llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp?rev=255902&r1=255901&r2=255902&view=diff
==============================================================================
--- llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp (original)
+++ llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp Thu Dec 17 10:22:06 2015
@@ -26,8 +26,6 @@ protected:
// Override MCELFObjectTargetWriter.
unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
bool IsPCRel) const override;
- void sortRelocs(const MCAssembler &Asm,
- std::vector<ELFRelocationEntry> &Relocs) override;
};
} // end anonymous namespace
@@ -154,20 +152,6 @@ unsigned SystemZObjectWriter::GetRelocTy
}
}
-void SystemZObjectWriter::sortRelocs(const MCAssembler &Asm,
- std::vector<ELFRelocationEntry> &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,
- // or else the TLS linker optimization may generate incorrect code.
- for (unsigned i = 0, e = Relocs.size(); i + 1 < e; ++i) {
- if ((Relocs[i + 1].Type == ELF::R_390_TLS_GDCALL ||
- Relocs[i + 1].Type == ELF::R_390_TLS_LDCALL) &&
- Relocs[i].Offset == Relocs[i + 1].Offset + 2)
- std::swap(Relocs[i], Relocs[i + 1]);
- }
-}
-
MCObjectWriter *llvm::createSystemZObjectWriter(raw_pwrite_stream &OS,
uint8_t OSABI) {
MCELFObjectTargetWriter *MOTW = new SystemZObjectWriter(OSABI);
Modified: llvm/trunk/test/MC/ARM/eh-compact-pr0.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/eh-compact-pr0.s?rev=255902&r1=255901&r2=255902&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/eh-compact-pr0.s (original)
+++ llvm/trunk/test/MC/ARM/eh-compact-pr0.s Thu Dec 17 10:22:06 2015
@@ -68,8 +68,8 @@ func2:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.TEST1
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .TEST1 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr0 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .TEST1 0x0
@ RELOC: ]
@ RELOC: }
@@ -105,7 +105,7 @@ func2:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.TEST2
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .TEST2 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr0 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .TEST2 0x0
@ RELOC: ]
@ RELOC: }
Modified: llvm/trunk/test/MC/ARM/eh-compact-pr1.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/eh-compact-pr1.s?rev=255902&r1=255901&r2=255902&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/eh-compact-pr1.s (original)
+++ llvm/trunk/test/MC/ARM/eh-compact-pr1.s Thu Dec 17 10:22:06 2015
@@ -68,7 +68,7 @@ func1:
@ will keep __aeabi_unwind_cpp_pr1.
@-------------------------------------------------------------------------------
@ CHECK: Relocations [
-@ CHECK: 0x0 R_ARM_PREL31 .TEST1 0x0
@ CHECK: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr1 0x0
+@ CHECK: 0x0 R_ARM_PREL31 .TEST1 0x0
@ CHECK: 0x4 R_ARM_PREL31 .ARM.extab.TEST1 0x0
@ CHECK: ]
Modified: llvm/trunk/test/MC/ARM/eh-directive-handlerdata.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/eh-directive-handlerdata.s?rev=255902&r1=255901&r2=255902&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/eh-directive-handlerdata.s (original)
+++ llvm/trunk/test/MC/ARM/eh-directive-handlerdata.s Thu Dec 17 10:22:06 2015
@@ -48,8 +48,8 @@ func1:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.TEST1
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .TEST1 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr0 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .TEST1 0x0
@ RELOC: 0x4 R_ARM_PREL31 .ARM.extab.TEST1 0x0
@ RELOC: ]
@ RELOC: }
@@ -108,8 +108,8 @@ func2:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.TEST2
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .TEST2 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr1 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .TEST2 0x0
@ RELOC: 0x4 R_ARM_PREL31 .ARM.extab.TEST2 0x0
@ RELOC: ]
@ RELOC: }
Modified: llvm/trunk/test/MC/ARM/eh-directive-personalityindex.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/eh-directive-personalityindex.s?rev=255902&r1=255901&r2=255902&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/eh-directive-personalityindex.s (original)
+++ llvm/trunk/test/MC/ARM/eh-directive-personalityindex.s Thu Dec 17 10:22:06 2015
@@ -28,8 +28,8 @@ pr0:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.pr0
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .pr0 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr0 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .pr0 0x0
@ RELOC: ]
@ RELOC: }
@@ -57,8 +57,8 @@ pr0_nontrivial:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.pr0.nontrivial
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .pr0.nontrivial 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr0 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .pr0.nontrivial 0x0
@ RELOC: ]
@ RELOC: }
@@ -90,8 +90,8 @@ pr1:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.pr1
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .pr1 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr1 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .pr1 0x0
@ RELOC: 0x4 R_ARM_PREL31 .ARM.extab.pr1 0x0
@ RELOC: ]
@ RELOC: }
@@ -127,8 +127,8 @@ pr1_nontrivial:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.pr1.nontrivial
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .pr1.nontrivial 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr1 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .pr1.nontrivial 0x0
@ RELOC: 0x4 R_ARM_PREL31 .ARM.extab.pr1.nontrivial 0x0
@ RELOC: ]
@ RELOC: }
@@ -161,8 +161,8 @@ pr2:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.pr2
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .pr2 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr2 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .pr2 0x0
@ RELOC: 0x4 R_ARM_PREL31 .ARM.extab.pr2 0x0
@ RELOC: ]
@ RELOC: }
@@ -196,8 +196,8 @@ pr2_nontrivial:
@ RELOC: Section {
@ RELOC: Name: .rel.ARM.exidx.pr2.nontrivial
@ RELOC: Relocations [
-@ RELOC: 0x0 R_ARM_PREL31 .pr2.nontrivial 0x0
@ RELOC: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr2 0x0
+@ RELOC: 0x0 R_ARM_PREL31 .pr2.nontrivial 0x0
@ RELOC: 0x4 R_ARM_PREL31 .ARM.extab.pr2.nontrivial 0x0
@ RELOC: ]
@ RELOC: }
Modified: llvm/trunk/test/MC/ARM/eh-directive-text-section.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/eh-directive-text-section.s?rev=255902&r1=255901&r2=255902&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/eh-directive-text-section.s (original)
+++ llvm/trunk/test/MC/ARM/eh-directive-text-section.s Thu Dec 17 10:22:06 2015
@@ -77,6 +77,6 @@ func1:
@ add an relocation to __aeabi_unwind_cpp_pr0.
@-------------------------------------------------------------------------------
@ CHECK: Relocations [
-@ CHECK: 0x0 R_ARM_PREL31 .text 0x0
@ CHECK: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr0 0x0
+@ CHECK: 0x0 R_ARM_PREL31 .text 0x0
@ CHECK: ]
More information about the llvm-commits
mailing list