Fix PR10373 which is SH relax bug.

This commit is contained in:
Kaz Kojima 2014-08-01 19:17:47 +09:00
parent b131d1fcfa
commit 8c78401680
5 changed files with 26 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2014-08-01 Takashi Yoshii <yoshii.takashi@renesas.com>
PR 10373
* elf32-sh.c (sh_elf_relax_section): Add jmp to bra relaxing.
2014-07-29 Matthew Fortune <matthew.fortune@imgtec.com>
* elfxx-mips.c (ABI_O32_P, MIPS_ELF_ABIFLAGS_SECTION_NAME_P): New macro.

View File

@ -702,10 +702,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
elf_section_data (sec)->this_hdr.contents = contents;
symtab_hdr->contents = (unsigned char *) isymbuf;
/* Replace the jsr with a bsr. */
/* Replace the jmp/jsr with a bra/bsr. */
/* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
replace the jsr with a bsr. */
replace the jmp/jsr with a bra/bsr. */
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
/* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
here, but that only checks if the symbol is an external symbol,
@ -716,7 +716,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec,
/* We can't fully resolve this yet, because the external
symbol value may be changed by future relaxing. We let
the final link phase handle it. */
bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset);
if (bfd_get_16 (abfd, contents + irel->r_offset) & 0x0020)
bfd_put_16 (abfd, (bfd_vma) 0xa000, contents + irel->r_offset);
else
bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset);
irel->r_addend = -4;

View File

@ -1,3 +1,9 @@
2014-08-01 Takashi Yoshii <yoshii.takashi@renesas.com>
PR 10373
* ld-sh/sh1.s: Add jmp relaxing test.
* ld-sh/sh.exp: Likewise.
2014-08-01 Takashi Yoshii <yoshii.takashi@renesas.com>
PR 10378

View File

@ -49,7 +49,7 @@ if ![ld_assemble $as "-relax $srcdir/$subdir/sh1.s" tmpdir/sh1.o] {
verbose "bad output from nm"
fail $testsimple
} else {
if {$nm_output(bar) != $nm_output(foo) + 4} {
if {$nm_output(bar) != $nm_output(foo) + 0xc} {
send_log "foo == $nm_output(foo)\n"
verbose "foo == $nm_output(foo)"
send_log "bar == $nm_output(bar)\n"
@ -149,7 +149,7 @@ if [istarget sh*-*linux*] {
}
if {![ld_assemble $as "-relax tmpdir/start.s" tmpdir/start.o] \
|| ![ld_compile $CC "-O -mrelax $srcdir/$subdir/sh2.c" tmpdir/sh2.o]} {
|| ![ld_compile $CC "-O -mrelax -foptimize-sibling-calls $srcdir/$subdir/sh2.c" tmpdir/sh2.o]} {
unresolved $testlink
unresolved $testjsr
unresolved $testrun
@ -168,7 +168,8 @@ pass $testlink
send_log "$objdump -d tmpdir/sh2\n"
verbose "$objdump -d tmpdir/sh2"
catch "exec $objdump -d tmpdir/sh2" exec_output
if [string match "*jsr*" $exec_output] {
if {[string match "*jsr*" $exec_output]
|| [string match "*jmp*" $exec_output]} {
fail $testjsr
} else {
pass $testjsr

View File

@ -4,7 +4,12 @@ L1:
mov.l L2,r0
.uses L1
jsr @r0
nop
.uses L1
jmp @r0
nop
rts
nop
.align 2
L2:
.long bar