[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