mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
9d1da81b26
For the lui and auipc relaxations, since the symbol value of an undefined weak symbol is always be zero, we can optimize the patterns into a single LI/MV/ADDI instruction. bfd/ * elfnn-riscv.c (riscv_pcgp_hi_reloc): Add new field undefined_weak. (riscv_record_pcgp_hi_reloc): New parameter undefined_weak. Set undefined_weak field from it. (relax_func_t): New parameter undefined_weak. (_bfd_riscv_relax_call): New ignored parameter undefined_weak. (_bfd_riscv_relax_tls_le): Likewise. (_bfd_riscv_relax_align): Likewise. (_bfd_riscv_relax_delete): Likewise. (_bfd_riscv_relax_lui): New parameter undefined_weak. If true, allow relaxing. For LO12* relocs, set rs1 to x0 when undefined_weak. (_bfd_riscv_relax_pc): New parameter undefined_weak. For LO12* relocs, set undefined_weak from hi_reloc. If true, allow relaxing. For LO12* relocs, set rs1 to x0 when undefined_weak and change to non-pcrel reloc. (_bfd_riscv_relax_section): New local undefined_weak. Set for undef weak relocs that can be relaxed. Pass to relax_func call. ld/ * testsuite/ld-riscv-elf/weakref32.s: Add relaxable undef weak code. * testsuite/ld-riscv-elf/weakref64.s: Likewise. * testsuite/ld-riscv-elf/weakref32.d: Updated. * testsuite/ld-riscv-elf/weakref64.d: Updated.
22 lines
270 B
ArmAsm
22 lines
270 B
ArmAsm
.option nopic
|
|
.text
|
|
.align 1
|
|
.globl _start
|
|
.type _start, @function
|
|
_start:
|
|
lui a5,%hi(f)
|
|
addi a5,a5,%lo(f)
|
|
beq a5,zero,.L1
|
|
lla a5,f
|
|
beqz a5,.L1
|
|
addi sp,sp,-16
|
|
sd ra,8(sp)
|
|
call f
|
|
ld ra,8(sp)
|
|
addi sp,sp,16
|
|
tail f
|
|
.L1:
|
|
ret
|
|
.size _start, .-_start
|
|
.weak f
|