[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