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:
Jim Wilson 2019-11-12 15:50:48 -08:00
parent e06f3d6eba
commit c6261a00c3
9 changed files with 68 additions and 3 deletions

View File

@ -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.

View File

@ -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))

View File

@ -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.

View File

@ -0,0 +1,9 @@
.globl _start
.section .text.hot
_start:
call cc
.text
ff:
call dd

View File

@ -0,0 +1,6 @@
.globl align1
.text
.balign 32
align1:
csrr a0, sie

View File

@ -0,0 +1,7 @@
.globl align2
.text
.balign 4
align2:
csrr a0, sie
.fill 0xfffb6

View File

@ -0,0 +1,9 @@
.globl cc
.globl dd
.text
cc:
csrr a0, sie
csrr a1, sie
dd:
ret

View 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

View File

@ -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"