Fix PR10373 which is SH relax bug.
authorKaz Kojima <kkojima@rr.iij4u.or.jp>
Fri, 1 Aug 2014 10:17:47 +0000 (19:17 +0900)
committerKaz Kojima <kkojima@rr.iij4u.or.jp>
Fri, 1 Aug 2014 10:17:47 +0000 (19:17 +0900)
bfd/ChangeLog
bfd/elf32-sh.c
ld/testsuite/ChangeLog
ld/testsuite/ld-sh/sh.exp
ld/testsuite/ld-sh/sh1.s

index abcd4ab..d5defab 100644 (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.
index 5085830..44a3aa7 100644 (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;
 
index 773a638..9114c7d 100644 (file)
@@ -1,5 +1,11 @@
 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
        * ld-sh/adjsw8.s: New.
        * ld-sh/sh.exp: Add switch8 adjustment test.
index a270400..417daf7 100644 (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
index d18e439..b1f718d 100644 (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