diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp --- a/bolt/lib/Rewrite/RewriteInstance.cpp +++ b/bolt/lib/Rewrite/RewriteInstance.cpp @@ -2350,7 +2350,7 @@ continue; } - if (BC->getDynamicRelocationAt(Rel.getOffset())) { + if (!IsAArch64 && BC->getDynamicRelocationAt(Rel.getOffset())) { LLVM_DEBUG( dbgs() << "BOLT-DEBUG: address 0x" << Twine::utohexstr(Rel.getOffset()) diff --git a/bolt/test/AArch64/constant_island_pie_update.s b/bolt/test/AArch64/constant_island_pie_update.s new file mode 100644 --- /dev/null +++ b/bolt/test/AArch64/constant_island_pie_update.s @@ -0,0 +1,31 @@ +// This test checks that the constant island value is updated if it +// has dynamic relocation. + +# RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown \ +# RUN: %s -o %t.o +# RUN: %clang %cflags -fPIC -pie %t.o -o %t.exe -Wl,-q \ +# RUN: -nostartfiles -nodefaultlibs -lc +# RUN: llvm-bolt %t.exe -o %t.bolt -use-old-text=0 -lite=0 +# RUN: llvm-objdump -j .text -d %t.bolt | FileCheck %s + +# CHECK: bl 0x[[#%x,ADDR:]] +# CHECK: {{.*}} <$d>: +# CHECK-NEXT: {{.*}} .word 0x{{[0]+}}[[#ADDR]] + +.global +.type exitLocal, %function +exitLocal: + bl exit + +.global _start +.type _start, %function +_start: + mov x0, #0 + adr x1, .Lci + ldr x1, [x1] + blr x1 + mov x0, #1 + bl exitLocal + nop +.Lci: + .xword exitLocal