[lld] r249195 - [ELF2/AArch64] Add support for R_AARCH64_ADR_PREL_PG_H121

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 2 15:09:04 PDT 2015


On Fri, Oct 2, 2015 at 3:00 PM, Davide Italiano via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: davide
> Date: Fri Oct  2 17:00:42 2015
> New Revision: 249195
>
> URL: http://llvm.org/viewvc/llvm-project?rev=249195&view=rev
> Log:
> [ELF2/AArch64] Add support for R_AARCH64_ADR_PREL_PG_H121
>
> Modified:
>     lld/trunk/ELF/Target.cpp
>     lld/trunk/test/elf2/aarch64-relocs.s
>
> Modified: lld/trunk/ELF/Target.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=249195&r1=249194&r2=249195&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/Target.cpp (original)
> +++ lld/trunk/ELF/Target.cpp Fri Oct  2 17:00:42 2015
> @@ -253,16 +253,31 @@ bool AArch64TargetInfo::relocNeedsPlt(ui
>    return false;
>  }
>
> +static void AArch64UpdateAdr(uint8_t *Location, uint64_t Imm) {
> +  uint32_t ImmLo = (Imm & 0x3) << 29;
> +  uint32_t ImmHi = ((Imm & 0x1FFFFC) >> 2) << 5;
> +  uint64_t Mask = (0x3 << 29) | (0x7FFFF << 5);
> +  write32le(Location, (read32le(Location) & ~Mask) | ImmLo | ImmHi);
> +}
> +
> +static uint64_t AArch64GetPage(uint64_t Address) {
> +  return (Address & (~static_cast<uint64_t>(0xFFF)));
>

nit: we usually don't enclose an expression after return with () even if
with &?

+}
> +
>  static void handle_ADR_PREL_LO21(uint8_t *Location, uint64_t S, int64_t A,
>                                   uint64_t P) {
>    uint64_t X = S + A - P;
>    if (!isInt<21>(X))
>      error("Relocation R_AARCH64_ADR_PREL_LO21 out of range");
> -  uint32_t Imm = X & 0x1FFFFF;
> -  uint32_t ImmLo = (Imm & 0x3) << 29;
> -  uint32_t ImmHi = ((Imm & 0x1FFFFC) >> 2) << 5;
> -  uint64_t Mask = (0x3 << 29) | (0x7FFFF << 5);
> -  write32le(Location, (read32le(Location) & ~Mask) | ImmLo | ImmHi);
> +  AArch64UpdateAdr(Location, X & 0x1FFFFF);
> +}
> +
> +static void handle_ADR_PREL_PG_HI21(uint8_t *Location, uint64_t S,
> int64_t A,
> +                                    uint64_t P) {
> +  uint64_t X = AArch64GetPage(S + A) - AArch64GetPage(P);
> +  if (!isInt<33>(X))
> +    error("Relocation R_AARCH64_ADR_PREL_PG_HI21 out of range");
> +  AArch64UpdateAdr(Location, (X >> 12) & 0x1FFFFF); // X[32:12]
>  }
>
>  void AArch64TargetInfo::relocateOne(uint8_t *Buf, const void *RelP,
> @@ -279,6 +294,9 @@ void AArch64TargetInfo::relocateOne(uint
>    case R_AARCH64_ADR_PREL_LO21:
>      handle_ADR_PREL_LO21(Location, S, A, P);
>      break;
> +  case R_AARCH64_ADR_PREL_PG_HI21:
> +    handle_ADR_PREL_PG_HI21(Location, S, A, P);
> +    break;
>    default:
>      error(Twine("unrecognized reloc ") + Twine(Type));
>      break;
>
> Modified: lld/trunk/test/elf2/aarch64-relocs.s
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/aarch64-relocs.s?rev=249195&r1=249194&r2=249195&view=diff
>
> ==============================================================================
> --- lld/trunk/test/elf2/aarch64-relocs.s (original)
> +++ lld/trunk/test/elf2/aarch64-relocs.s Fri Oct  2 17:00:42 2015
> @@ -16,3 +16,17 @@ msgend:
>  # CHECK: msg:
>  # CHECK:        4:
>  # #4 is the adr immediate value.
> +
> +.section .R_AARCH64_ADR_PREL_PG_H121,"ax", at progbits
> +  adrp x1,mystr
> +mystr:
> +  .asciz "blah"
> +  .size mystr, 4
> +
> +# S = 0x11012, A = 0x4, P = 0x11012
> +# PAGE(S + A) = 0x11000
> +# PAGE(P) = 0x11000
> +#
> +# CHECK: Disassembly of section .R_AARCH64_ADR_PREL_PG_H121:
> +# CHECK-NEXT: $x.2:
> +# CHECK-NEXT:   11012:       01 00 00 90     adrp    x1, #0
>
>
> _______________________________________________
> 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/20151002/e58da926/attachment.html>


More information about the llvm-commits mailing list