RISC-V: Fix ld relax failure with calls and align directives.
Make _bfd_riscv_relax_call handle section alignment padding same as the _bfd_riscv_relax_lui and _bfd_riscv_relax_pc functions already do. Use the max section alignment if section boundaries are crossed, otherwise the alignment of the containing section. bfd/ PR 25181 * elfnn-riscv.c (_bfd_riscv_relax_call): Always add max_alignment to foff. If sym_sec->output_section and sec->output_section are the same and not *ABS* then set max_alignment to that section's alignment. ld/ PR 25181 * testsuite/ld-riscv-elf/call-relax-0.s: New file. * testsuite/ld-riscv-elf/call-relax-1.s: New file. * testsuite/ld-riscv-elf/call-relax-2.s: New file. * testsuite/ld-riscv-elf/call-relax-3.s: New file. * testsuite/ld-riscv-elf/call-relax.d: New test. * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Run call-relax test. Change-Id: Iaf65cee52345abf1955f36e8e72c4f6cc0db8d9a
This commit is contained in:
parent
e06f3d6eba
commit
c6261a00c3
9 changed files with 68 additions and 3 deletions
|
@ -1,3 +1,10 @@
|
|||
2019-11-12 Jim Wilson <jimw@sifive.com>
|
||||
|
||||
PR 25181
|
||||
* elfnn-riscv.c (_bfd_riscv_relax_call): Always add max_alignment to
|
||||
foff. If sym_sec->output_section and sec->output_section are the same
|
||||
and not *ABS* then set max_alignment to that section's alignment.
|
||||
|
||||
2019-11-07 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* cpu-cr16c.c: Delete.
|
||||
|
|
|
@ -3494,9 +3494,16 @@ _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
|
|||
int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
|
||||
|
||||
/* If the call crosses section boundaries, an alignment directive could
|
||||
cause the PC-relative offset to later increase. */
|
||||
if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section)
|
||||
foff += (foff < 0 ? -max_alignment : max_alignment);
|
||||
cause the PC-relative offset to later increase, so we need to add in the
|
||||
max alignment of any section inclusive from the call to the target.
|
||||
Otherwise, we only need to use the alignment of the current section. */
|
||||
if (VALID_UJTYPE_IMM (foff))
|
||||
{
|
||||
if (sym_sec->output_section == sec->output_section
|
||||
&& sym_sec->output_section != bfd_abs_section_ptr)
|
||||
max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
|
||||
foff += (foff < 0 ? -max_alignment : max_alignment);
|
||||
}
|
||||
|
||||
/* See if this function call can be shortened. */
|
||||
if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
|
||||
|
|
10
ld/ChangeLog
10
ld/ChangeLog
|
@ -1,3 +1,13 @@
|
|||
2019-11-12 Jim Wilson <jimw@sifive.com>
|
||||
|
||||
PR 25181
|
||||
* testsuite/ld-riscv-elf/call-relax-0.s: New file.
|
||||
* testsuite/ld-riscv-elf/call-relax-1.s: New file.
|
||||
* testsuite/ld-riscv-elf/call-relax-2.s: New file.
|
||||
* testsuite/ld-riscv-elf/call-relax-3.s: New file.
|
||||
* testsuite/ld-riscv-elf/call-relax.d: New test.
|
||||
* testsuite/ld-riscv-elf/ld-riscv-elf.exp: Run call-relax test.
|
||||
|
||||
2019-11-08 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* emulparams/aarch64elf.sh: Revert 2019-11-05 change.
|
||||
|
|
9
ld/testsuite/ld-riscv-elf/call-relax-0.s
Normal file
9
ld/testsuite/ld-riscv-elf/call-relax-0.s
Normal file
|
@ -0,0 +1,9 @@
|
|||
.globl _start
|
||||
|
||||
.section .text.hot
|
||||
_start:
|
||||
call cc
|
||||
|
||||
.text
|
||||
ff:
|
||||
call dd
|
6
ld/testsuite/ld-riscv-elf/call-relax-1.s
Normal file
6
ld/testsuite/ld-riscv-elf/call-relax-1.s
Normal file
|
@ -0,0 +1,6 @@
|
|||
.globl align1
|
||||
|
||||
.text
|
||||
.balign 32
|
||||
align1:
|
||||
csrr a0, sie
|
7
ld/testsuite/ld-riscv-elf/call-relax-2.s
Normal file
7
ld/testsuite/ld-riscv-elf/call-relax-2.s
Normal file
|
@ -0,0 +1,7 @@
|
|||
.globl align2
|
||||
|
||||
.text
|
||||
.balign 4
|
||||
align2:
|
||||
csrr a0, sie
|
||||
.fill 0xfffb6
|
9
ld/testsuite/ld-riscv-elf/call-relax-3.s
Normal file
9
ld/testsuite/ld-riscv-elf/call-relax-3.s
Normal file
|
@ -0,0 +1,9 @@
|
|||
.globl cc
|
||||
.globl dd
|
||||
|
||||
.text
|
||||
cc:
|
||||
csrr a0, sie
|
||||
csrr a1, sie
|
||||
dd:
|
||||
ret
|
9
ld/testsuite/ld-riscv-elf/call-relax.d
Normal file
9
ld/testsuite/ld-riscv-elf/call-relax.d
Normal file
|
@ -0,0 +1,9 @@
|
|||
#name: call relaxation with alignment
|
||||
#source: call-relax-0.s
|
||||
#source: call-relax-1.s
|
||||
#source: call-relax-2.s
|
||||
#source: call-relax-3.s
|
||||
#as: -march=rv32ic
|
||||
#ld: -melf32lriscv
|
||||
#objdump: -d
|
||||
#pass
|
|
@ -20,6 +20,7 @@
|
|||
#
|
||||
|
||||
if [istarget "riscv*-*-*"] {
|
||||
run_dump_test "call-relax"
|
||||
run_dump_test "c-lui"
|
||||
run_dump_test "c-lui-2"
|
||||
run_dump_test "disas-jalr"
|
||||
|
|
Loading…
Add table
Reference in a new issue