From d37edd0c7946a203961cc3f66b10f1fc1593039e Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 10 Jul 2019 16:42:20 +0000 Subject: [PATCH] ELF: Add support for R_AARCH64_ADR_PREL_PG_HI21_NC relocation. Differential Revision: https://reviews.llvm.org/D64456 llvm-svn: 365662 --- lld/ELF/Arch/AArch64.cpp | 3 +++ lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s | 2 ++ lld/test/ELF/aarch64-hi21-nc.s | 8 ++++++++ 3 files changed, 13 insertions(+) create mode 100644 lld/test/ELF/aarch64-hi21-nc.s diff --git a/lld/ELF/Arch/AArch64.cpp b/lld/ELF/Arch/AArch64.cpp index 47371c2..9b6599b 100644 --- a/lld/ELF/Arch/AArch64.cpp +++ b/lld/ELF/Arch/AArch64.cpp @@ -103,6 +103,7 @@ RelExpr AArch64::getRelExpr(RelType type, const Symbol &s, case R_AARCH64_LD_PREL_LO19: return R_PC; case R_AARCH64_ADR_PREL_PG_HI21: + case R_AARCH64_ADR_PREL_PG_HI21_NC: return R_AARCH64_PAGE_PC; case R_AARCH64_LD64_GOT_LO12_NC: case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: @@ -270,6 +271,8 @@ void AArch64::relocateOne(uint8_t *loc, RelType type, uint64_t val) const { case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: case R_AARCH64_TLSDESC_ADR_PAGE21: checkInt(loc, val, 33, type); + LLVM_FALLTHROUGH; + case R_AARCH64_ADR_PREL_PG_HI21_NC: write32AArch64Addr(loc, val >> 12); break; case R_AARCH64_ADR_PREL_LO21: diff --git a/lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s b/lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s index 651a32e..8be6e5a 100644 --- a/lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s +++ b/lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s @@ -4,8 +4,10 @@ // CHECK: relocation R_AARCH64_ADR_PREL_PG_HI21 cannot be used against symbol dat; recompile with -fPIC // CHECK: >>> defined in {{.*}}.o // CHECK: >>> referenced by {{.*}}.o:(.text+0x0) +// CHECK: relocation R_AARCH64_ADR_PREL_PG_HI21_NC cannot be used against symbol dat; recompile with -fPIC adrp x0, dat + adrp x0, :pg_hi21_nc:dat .data .globl dat dat: diff --git a/lld/test/ELF/aarch64-hi21-nc.s b/lld/test/ELF/aarch64-hi21-nc.s new file mode 100644 index 0000000..154f98c --- /dev/null +++ b/lld/test/ELF/aarch64-hi21-nc.s @@ -0,0 +1,8 @@ +// REQUIRES: aarch64 +// RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-linux %s -o %t.o +// RUN: ld.lld %t.o -o %t +// RUN: llvm-objdump -d %t | FileCheck %s + +foo = . + 0x1100000000000000 +// CHECK: adrp x0, #0 +adrp x0, :pg_hi21_nc:foo -- 2.7.4