Browse Source

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
gdb-9-branch
Jim Wilson 7 years ago
parent
commit
c6261a00c3
  1. 7
      bfd/ChangeLog
  2. 13
      bfd/elfnn-riscv.c
  3. 10
      ld/ChangeLog
  4. 9
      ld/testsuite/ld-riscv-elf/call-relax-0.s
  5. 6
      ld/testsuite/ld-riscv-elf/call-relax-1.s
  6. 7
      ld/testsuite/ld-riscv-elf/call-relax-2.s
  7. 9
      ld/testsuite/ld-riscv-elf/call-relax-3.s
  8. 9
      ld/testsuite/ld-riscv-elf/call-relax.d
  9. 1
      ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp

7
bfd/ChangeLog

@ -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> 2019-11-07 Alan Modra <amodra@gmail.com>
* cpu-cr16c.c: Delete. * cpu-cr16c.c: Delete.

13
bfd/elfnn-riscv.c

@ -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; 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 /* If the call crosses section boundaries, an alignment directive could
cause the PC-relative offset to later increase. */ cause the PC-relative offset to later increase, so we need to add in the
if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section) max alignment of any section inclusive from the call to the target.
foff += (foff < 0 ? -max_alignment : max_alignment); 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. */ /* See if this function call can be shortened. */
if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero)) if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))

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> 2019-11-08 Alan Modra <amodra@gmail.com>
* emulparams/aarch64elf.sh: Revert 2019-11-05 change. * emulparams/aarch64elf.sh: Revert 2019-11-05 change.

9
ld/testsuite/ld-riscv-elf/call-relax-0.s

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

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

7
ld/testsuite/ld-riscv-elf/call-relax-2.s

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

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

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

1
ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp

@ -20,6 +20,7 @@
# #
if [istarget "riscv*-*-*"] { if [istarget "riscv*-*-*"] {
run_dump_test "call-relax"
run_dump_test "c-lui" run_dump_test "c-lui"
run_dump_test "c-lui-2" run_dump_test "c-lui-2"
run_dump_test "disas-jalr" run_dump_test "disas-jalr"

Loading…
Cancel
Save