[llvm] r255902 - Avoid explicit relocation sorting most of the time.
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 8 15:07:00 PST 2016
On Thu, Dec 17, 2015 at 8:22 AM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> 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;
>
This dropped the unreachable present in the prior version (which I just
commented on as well) - intentionally?
> +}
> +
> 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: ]
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160108/49ceade9/attachment.html>
More information about the llvm-commits
mailing list