[PATCH] D56666: [LLD][ELF][AArch64] Add missing PLT relocations to isStaticLinkTimeConstant

Peter Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 15 03:21:07 PST 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL351186: [ELF][AArch64] Add missing PLT relocations to isStaticLinkTimeConstant (authored by psmith, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D56666?vs=181559&id=181762#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D56666/new/

https://reviews.llvm.org/D56666

Files:
  lld/trunk/ELF/Relocations.cpp
  lld/trunk/test/ELF/aarch64-gnu-ifunc-address.s


Index: lld/trunk/test/ELF/aarch64-gnu-ifunc-address.s
===================================================================
--- lld/trunk/test/ELF/aarch64-gnu-ifunc-address.s
+++ lld/trunk/test/ELF/aarch64-gnu-ifunc-address.s
@@ -0,0 +1,40 @@
+# REQUIRES: aarch64
+# RUN: llvm-mc -filetype=obj -triple=aarch64-none-linux-gnu %s -o %t.o
+# RUN: ld.lld -shared %t.o -o %tout
+# RUN: llvm-objdump -D %tout | FileCheck %s
+# RUN: llvm-readobj -r %tout | FileCheck %s --check-prefix=CHECK-RELOCS
+
+# Test that when we take the address of a preemptible ifunc in a shared object
+# we get R_AARCH64_GLOB_DAT to the symbol as it could be defined in another
+# link unit and preempt our definition.
+.text
+.globl myfunc
+.type myfunc, at gnu_indirect_function
+myfunc:
+ ret
+
+.text
+.globl main
+.type main, at function
+main:
+ adrp x8, :got:myfunc
+ ldr  x8, [x8, :got_lo12:myfunc]
+ ret
+# CHECK:   0000000000010004 main:
+# x8 = 0x30000
+# CHECK-NEXT:    10004: 08 01 00 90     adrp    x8, #131072
+# x8 = 0x300e0 = .got entry for myfunc with R_AARCH64_GLOB_DAT
+# CHECK-NEXT:    10008: 08 71 40 f9     ldr     x8, [x8, #224]
+# CHECK-NEXT:    1000c: c0 03 5f d6     ret
+
+# CHECK: Disassembly of section .got:
+# CHECK-NEXT: 00000000000300e0 .got:
+
+# CHECK-RELOCS: Relocations [
+# CHECK-RELOCS-NEXT:   Section {{.*}} .rela.dyn {
+# CHECK-RELOCS-NEXT:     0x300E0 R_AARCH64_GLOB_DAT myfunc 0x0
+# CHECK-RELOCS-NEXT:   }
+# CHECK-RELOCS-NEXT:   Section {{.*}} .rela.plt {
+# CHECK-RELOCS-NEXT:     0x20018 R_AARCH64_JUMP_SLOT myfunc 0x0
+# CHECK-RELOCS-NEXT:   }
+# CHECK-RELOCS-NEXT: ]
Index: lld/trunk/ELF/Relocations.cpp
===================================================================
--- lld/trunk/ELF/Relocations.cpp
+++ lld/trunk/ELF/Relocations.cpp
@@ -374,8 +374,8 @@
   if (isRelExprOneOf<R_GOT_FROM_END, R_GOT_OFF, R_HEXAGON_GOT, R_TLSLD_GOT_OFF,
                      R_MIPS_GOT_LOCAL_PAGE, R_MIPS_GOTREL, R_MIPS_GOT_OFF,
                      R_MIPS_GOT_OFF32, R_MIPS_GOT_GP_PC, R_MIPS_TLSGD,
-                     R_AARCH64_GOT_PAGE_PC, R_GOT_PC, R_GOTONLY_PC,
-                     R_GOTONLY_PC_FROM_END, R_PLT_PC, R_TLSGD_GOT,
+                     R_AARCH64_GOT_PAGE_PC, R_AARCH64_GOT_PAGE_PC_PLT, R_GOT_PC,
+                     R_GOTONLY_PC, R_GOTONLY_PC_FROM_END, R_PLT_PC, R_TLSGD_GOT,
                      R_TLSGD_GOT_FROM_END, R_TLSGD_PC, R_PPC_CALL_PLT,
                      R_TLSDESC_CALL, R_AARCH64_TLSDESC_PAGE, R_HINT,
                      R_TLSLD_HINT, R_TLSIE_HINT>(E))
@@ -383,7 +383,7 @@
 
   // These never do, except if the entire file is position dependent or if
   // only the low bits are used.
-  if (E == R_GOT || E == R_PLT || E == R_TLSDESC)
+  if (E == R_GOT || E == R_GOT_PLT || E == R_PLT || E == R_TLSDESC)
     return Target->usesOnlyLowPageBits(Type) || !Config->Pic;
 
   if (Sym.IsPreemptible)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56666.181762.patch
Type: text/x-patch
Size: 2843 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190115/8d0bf2f9/attachment-0001.bin>


More information about the llvm-commits mailing list