From: Kaz Kojima Date: Fri, 1 Aug 2014 10:17:47 +0000 (+0900) Subject: Fix PR10373 which is SH relax bug. X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=8c7840168031ab93432214580bf14ce63d638d22;p=deliverable%2Fbinutils-gdb.git Fix PR10373 which is SH relax bug. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index abcd4ab812..d5defab21f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2014-08-01 Takashi Yoshii + + PR 10373 + * elf32-sh.c (sh_elf_relax_section): Add jmp to bra relaxing. + 2014-07-29 Matthew Fortune * elfxx-mips.c (ABI_O32_P, MIPS_ELF_ABIFLAGS_SECTION_NAME_P): New macro. diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index 5085830d8a..44a3aa7875 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -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; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 773a6389e8..9114c7dd93 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-08-01 Takashi Yoshii + + PR 10373 + * ld-sh/sh1.s: Add jmp relaxing test. + * ld-sh/sh.exp: Likewise. + 2014-08-01 Takashi Yoshii PR 10378 diff --git a/ld/testsuite/ld-sh/sh.exp b/ld/testsuite/ld-sh/sh.exp index a2704005db..417daf7f92 100644 --- a/ld/testsuite/ld-sh/sh.exp +++ b/ld/testsuite/ld-sh/sh.exp @@ -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 diff --git a/ld/testsuite/ld-sh/sh1.s b/ld/testsuite/ld-sh/sh1.s index d18e4390dc..b1f718dfc3 100644 --- a/ld/testsuite/ld-sh/sh1.s +++ b/ld/testsuite/ld-sh/sh1.s @@ -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