[lld] r250421 - Centralize the handling of r_addend. NFC.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 15 09:53:34 PDT 2015


Single letter variables such as S, A or P are chosen after the ELF spec, so
that as long as readers are familiar with the spec, it's very easy to
digest.

Now S is actually S+A. That can be a source of confusion. You want to
change the variable name accordingly. I'd name SA.

On Thu, Oct 15, 2015 at 8:52 AM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: rafael
> Date: Thu Oct 15 10:52:12 2015
> New Revision: 250421
>
> URL: http://llvm.org/viewvc/llvm-project?rev=250421&view=rev
> Log:
> Centralize the handling of r_addend. NFC.
>
> When a relocation points to a SHF_MERGE section, the addend has special
> meaning.
> It should be used to find what in the section the relocation points to. It
> should not be added to the output position.
>
> Centralizing it means that the above rule will be implemented once, not
> once
> per target.
>
> Modified:
>     lld/trunk/ELF/InputSection.cpp
>     lld/trunk/ELF/InputSection.h
>     lld/trunk/ELF/Target.cpp
>
> Modified: lld/trunk/ELF/InputSection.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=250421&r1=250420&r2=250421&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/InputSection.cpp (original)
> +++ lld/trunk/ELF/InputSection.cpp Thu Oct 15 10:52:12 2015
> @@ -26,6 +26,23 @@ InputSection<ELFT>::InputSection(ObjectF
>      : File(F), Header(Header) {}
>
>  template <class ELFT>
> +void InputSection<ELFT>::relocateOne(uint8_t *Buf, uint8_t *BufEnd,
> +                                     const Elf_Rel &Rel, uint32_t Type,
> +                                     uintX_t BaseAddr, uintX_t SymVA) {
> +  Target->relocateOne(Buf, BufEnd, reinterpret_cast<const void *>(&Rel),
> Type,
> +                      BaseAddr, SymVA);
> +}
> +
> +template <class ELFT>
> +void InputSection<ELFT>::relocateOne(uint8_t *Buf, uint8_t *BufEnd,
> +                                     const Elf_Rela &Rel, uint32_t Type,
> +                                     uintX_t BaseAddr, uintX_t SymVA) {
> +  SymVA += Rel.r_addend;
> +  Target->relocateOne(Buf, BufEnd, reinterpret_cast<const void *>(&Rel),
> Type,
> +                      BaseAddr, SymVA);
> +}
> +
> +template <class ELFT>
>  template <bool isRela>
>  void InputSection<ELFT>::relocate(
>      uint8_t *Buf, uint8_t *BufEnd,
> @@ -42,8 +59,7 @@ void InputSection<ELFT>::relocate(
>      const Elf_Shdr *SymTab = File.getSymbolTable();
>      if (SymIndex < SymTab->sh_info) {
>        uintX_t SymVA = getLocalRelTarget(File, RI);
> -      Target->relocateOne(Buf, BufEnd, reinterpret_cast<const void
> *>(&RI),
> -                          Type, BaseAddr, SymVA);
> +      relocateOne(Buf, BufEnd, RI, Type, BaseAddr, SymVA);
>        continue;
>      }
>
> @@ -61,8 +77,7 @@ void InputSection<ELFT>::relocate(
>      } else if (isa<SharedSymbol<ELFT>>(Body)) {
>        continue;
>      }
> -    Target->relocateOne(Buf, BufEnd, reinterpret_cast<const void *>(&RI),
> Type,
> -                        BaseAddr, SymVA);
> +    relocateOne(Buf, BufEnd, RI, Type, BaseAddr, SymVA);
>    }
>  }
>
>
> Modified: lld/trunk/ELF/InputSection.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.h?rev=250421&r1=250420&r2=250421&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/InputSection.h (original)
> +++ lld/trunk/ELF/InputSection.h Thu Oct 15 10:52:12 2015
> @@ -60,6 +60,12 @@ public:
>    static InputSection<ELFT> Discarded;
>
>  private:
> +  static void relocateOne(uint8_t *Buf, uint8_t *BufEnd, const Elf_Rel
> &Rel,
> +                          uint32_t Type, uintX_t BaseAddr, uintX_t SymVA);
> +
> +  static void relocateOne(uint8_t *Buf, uint8_t *BufEnd, const Elf_Rela
> &Rel,
> +                          uint32_t Type, uintX_t BaseAddr, uintX_t SymVA);
> +
>    template <bool isRela>
>    void relocate(uint8_t *Buf, uint8_t *BufEnd,
>                  llvm::iterator_range<
>
> Modified: lld/trunk/ELF/Target.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=250421&r1=250420&r2=250421&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/Target.cpp (original)
> +++ lld/trunk/ELF/Target.cpp Thu Oct 15 10:52:12 2015
> @@ -294,14 +294,14 @@ void X86_64TargetInfo::relocateOne(uint8
>    switch (Type) {
>    case R_X86_64_PC32:
>    case R_X86_64_GOTPCREL:
> -    write32le(Loc, SymVA + Rel.r_addend - (BaseAddr + Offset));
> +    write32le(Loc, SymVA - (BaseAddr + Offset));
>      break;
>    case R_X86_64_64:
> -    write64le(Loc, SymVA + Rel.r_addend);
> +    write64le(Loc, SymVA);
>      break;
>    case R_X86_64_32: {
>    case R_X86_64_32S:
> -    uint64_t VA = SymVA + Rel.r_addend;
> +    uint64_t VA = SymVA;
>      if (Type == R_X86_64_32 && !isUInt<32>(VA))
>        error("R_X86_64_32 out of range");
>      else if (!isInt<32>(VA))
> @@ -441,7 +441,6 @@ void PPC64TargetInfo::relocateOne(uint8_
>
>    uint8_t *L = Buf + Rel.r_offset;
>    uint64_t S = SymVA;
> -  int64_t A = Rel.r_addend;
>    uint64_t P = BaseAddr + Rel.r_offset;
>    uint64_t TB = getPPC64TocBase();
>
> @@ -453,16 +452,16 @@ void PPC64TargetInfo::relocateOne(uint8_
>    // For a TOC-relative relocation, adjust the addend and proceed in
> terms of
>    // the corresponding ADDR16 relocation type.
>    switch (Type) {
> -  case R_PPC64_TOC16:       Type = R_PPC64_ADDR16;       A -= TB; break;
> -  case R_PPC64_TOC16_DS:    Type = R_PPC64_ADDR16_DS;    A -= TB; break;
> -  case R_PPC64_TOC16_LO:    Type = R_PPC64_ADDR16_LO;    A -= TB; break;
> -  case R_PPC64_TOC16_LO_DS: Type = R_PPC64_ADDR16_LO_DS; A -= TB; break;
> -  case R_PPC64_TOC16_HI:    Type = R_PPC64_ADDR16_HI;    A -= TB; break;
> -  case R_PPC64_TOC16_HA:    Type = R_PPC64_ADDR16_HA;    A -= TB; break;
> +  case R_PPC64_TOC16:       Type = R_PPC64_ADDR16;       S -= TB; break;
> +  case R_PPC64_TOC16_DS:    Type = R_PPC64_ADDR16_DS;    S -= TB; break;
> +  case R_PPC64_TOC16_LO:    Type = R_PPC64_ADDR16_LO;    S -= TB; break;
> +  case R_PPC64_TOC16_LO_DS: Type = R_PPC64_ADDR16_LO_DS; S -= TB; break;
> +  case R_PPC64_TOC16_HI:    Type = R_PPC64_ADDR16_HI;    S -= TB; break;
> +  case R_PPC64_TOC16_HA:    Type = R_PPC64_ADDR16_HA;    S -= TB; break;
>    default: break;
>    }
>
> -  uint64_t R = S + A;
> +  uint64_t R = S;
>
>    switch (Type) {
>    case R_PPC64_ADDR16:
> @@ -616,36 +615,35 @@ void AArch64TargetInfo::relocateOne(uint
>
>    uint8_t *L = Buf + Rel.r_offset;
>    uint64_t S = SymVA;
> -  int64_t A = Rel.r_addend;
>    uint64_t P = BaseAddr + Rel.r_offset;
>    switch (Type) {
>    case R_AARCH64_ABS16:
> -    if (!isInt<16>(S + A))
> +    if (!isInt<16>(S))
>        error("Relocation R_AARCH64_ABS16 out of range");
> -    write16le(L, S + A);
> +    write16le(L, S);
>      break;
>    case R_AARCH64_ABS32:
> -    if (!isInt<32>(S + A))
> +    if (!isInt<32>(S))
>        error("Relocation R_AARCH64_ABS32 out of range");
> -    write32le(L, S + A);
> +    write32le(L, S);
>      break;
>    case R_AARCH64_ABS64:
>      // No overflow check needed.
> -    write64le(L, S + A);
> +    write64le(L, S);
>      break;
>    case R_AARCH64_ADD_ABS_LO12_NC:
>      // No overflow check needed.
> -    or32le(L, ((S + A) & 0xFFF) << 10);
> +    or32le(L, (S & 0xFFF) << 10);
>      break;
>    case R_AARCH64_ADR_PREL_LO21: {
> -    uint64_t X = S + A - P;
> +    uint64_t X = S - P;
>      if (!isInt<21>(X))
>        error("Relocation R_AARCH64_ADR_PREL_LO21 out of range");
>      updateAArch64Adr(L, X & 0x1FFFFF);
>      break;
>    }
>    case R_AARCH64_ADR_PREL_PG_HI21: {
> -    uint64_t X = getAArch64Page(S + A) - getAArch64Page(P);
> +    uint64_t X = getAArch64Page(S) - getAArch64Page(P);
>      if (!isInt<33>(X))
>        error("Relocation R_AARCH64_ADR_PREL_PG_HI21 out of range");
>      updateAArch64Adr(L, (X >> 12) & 0x1FFFFF); // X[32:12]
>
>
> _______________________________________________
> 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/20151015/a4659cf9/attachment.html>


More information about the llvm-commits mailing list