[llvm-bugs] [Bug 44451] New: lld generates strange and incorrect thunk for aarch64 weak function call
    via llvm-bugs 
    llvm-bugs at lists.llvm.org
       
    Fri Jan  3 03:09:03 PST 2020
    
    
  
https://bugs.llvm.org/show_bug.cgi?id=44451
            Bug ID: 44451
           Summary: lld generates strange and incorrect thunk for aarch64
                    weak function call
           Product: lld
           Version: unspecified
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: ELF
          Assignee: unassignedbugs at nondot.org
          Reporter: john.brawn at arm.com
                CC: llvm-bugs at lists.llvm.org, peter.smith at linaro.org
If you have:
example.c
  extern void weakfn() __attribute__((weak));
  int call_weak() {
    weakfn();
    return 0;
  }
script.ld
  SECTIONS
  {
    .text 0x10000000 : { *(.text) }
  }
and do:
  clang --target=aarch64-none-eabi example.c -c -O1
  ld.lld -T script.ld example.o
  llvm-objdump --disassemble a.out
the llvm-objdump disassembly is:
0000000010000000 call_weak:
10000000: fd 7b bf a9                   stp     x29, x30, [sp, #-16]!
10000004: fd 03 00 91                   mov     x29, sp
10000008: 04 00 00 94                   bl      #16
<__AArch64AbsLongThunk_weakfn>
1000000c: e0 03 1f 2a                   mov     w0, wzr
10000010: fd 7b c1 a8                   ldp     x29, x30, [sp], #16
10000014: c0 03 5f d6                   ret
0000000010000018 __AArch64AbsLongThunk_weakfn:
10000018: 50 00 00 58                   ldr     x16, #8
1000001c: 00 02 1f d6                   br      x16
0000000010000020 $d:
10000020:       00 00 00 00     .word   0x00000000
10000024:       00 00 00 00     .word   0x00000000
The weak function call has been converted into a branch to a thunk which
branches to address zero, which is both strange and wrong.
Reducing the address of .text in the linker script to 0x1000000 gives something
more like what I'd expect, i.e. a branch to the next instruction (though a nop
would be better):
0000000001000000 call_weak:
 1000000: fd 7b bf a9                   stp     x29, x30, [sp, #-16]!
 1000004: fd 03 00 91                   mov     x29, sp
 1000008: 01 00 00 94                   bl      #4 <call_weak+0xc>
 100000c: e0 03 1f 2a                   mov     w0, wzr
 1000010: fd 7b c1 a8                   ldp     x29, x30, [sp], #16
 1000014: c0 03 5f d6                   ret
-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200103/becd0019/attachment.html>
    
    
More information about the llvm-bugs
mailing list