ELF: Add support for R_AARCH64_ADR_PREL_PG_HI21_NC relocation.
authorPeter Collingbourne <peter@pcc.me.uk>
Wed, 10 Jul 2019 16:42:20 +0000 (16:42 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Wed, 10 Jul 2019 16:42:20 +0000 (16:42 +0000)
Differential Revision: https://reviews.llvm.org/D64456

llvm-svn: 365662

lld/ELF/Arch/AArch64.cpp
lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s
lld/test/ELF/aarch64-hi21-nc.s [new file with mode: 0644]

index 47371c2..9b6599b 100644 (file)
@@ -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:
index 651a32e..8be6e5a 100644 (file)
@@ -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 (file)
index 0000000..154f98c
--- /dev/null
@@ -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