[PATCH] D55599: [LLD][ELF][AArch64] Fix ADRP relocations to undefined weak reference.

Peter Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 12 06:14:01 PST 2018


peter.smith created this revision.
peter.smith added reviewers: ruiu, grimar.
Herald added subscribers: kristof.beyls, arichardson, javed.absar, emaste.
Herald added a reviewer: espindola.

In the ABI for the 64-bit Arm architecture the section on weak references states:

  During linking, the symbol value of an undefined weak reference is:
      - Zero if the relocation type is absolute
      - The address of the place if the relocation type is pc-relative.

The relocations associated with an ADRP are relative so we should resolve the undefined weak reference to the place instead of 0. This matches GNU ld.bfd behaviour.

      

fixes pr34928 (https://bugs.llvm.org/show_bug.cgi?id=34928)


https://reviews.llvm.org/D55599

Files:
  ELF/InputSection.cpp
  test/ELF/aarch64-undefined-weak.s


Index: test/ELF/aarch64-undefined-weak.s
===================================================================
--- test/ELF/aarch64-undefined-weak.s
+++ test/ELF/aarch64-undefined-weak.s
@@ -40,7 +40,7 @@
 // CHECK-NEXT:    210008: {{.*}} b.eq    #4
 // CHECK-NEXT:    21000c: {{.*}} cbz     x1, #4
 // CHECK-NEXT:    210010: {{.*}} adr     x0, #0
-// CHECK-NEXT:    210014: {{.*}} adrp    x0, #-2162688
+// CHECK-NEXT:    210014: {{.*}} adrp    x0, #0
 // CHECK:         210018: {{.*}} .word   0x00000000
 // CHECK-NEXT:    21001c: {{.*}} .word   0x00000000
 // CHECK-NEXT:    210020: {{.*}} .word   0x00000000
Index: ELF/InputSection.cpp
===================================================================
--- ELF/InputSection.cpp
+++ ELF/InputSection.cpp
@@ -671,11 +671,11 @@
     return In.MipsGot->getVA() + In.MipsGot->getTlsIndexOffset(File) -
            In.MipsGot->getGp(File);
   case R_AARCH64_PAGE_PC: {
-    uint64_t Val = Sym.isUndefWeak() ? A : Sym.getVA(A);
+    uint64_t Val = Sym.isUndefWeak() ? P + A : Sym.getVA(A);
     return getAArch64Page(Val) - getAArch64Page(P);
   }
   case R_AARCH64_PLT_PAGE_PC: {
-    uint64_t Val = Sym.isUndefWeak() ? A : Sym.getPltVA() + A;
+    uint64_t Val = Sym.isUndefWeak() ? P + A : Sym.getPltVA() + A;
     return getAArch64Page(Val) - getAArch64Page(P);
   }
   case R_RISCV_PC_INDIRECT: {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55599.177845.patch
Type: text/x-patch
Size: 1348 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181212/6015df99/attachment.bin>


More information about the llvm-commits mailing list