From: Alyssa Milburn Date: Mon, 5 Dec 2016 06:59:18 +0000 (-0800) Subject: bfd,ld: Continue after partially-successful relaxed call relocations in sparc. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=597e138ca0cf96889a1965d06d28552c1d1174d2;p=binutils-gdb.git bfd,ld: Continue after partially-successful relaxed call relocations in sparc. bfd/ChangeLog: 2016-12-05 Alyssa Milburn * elfxx-sparc.c: Do not stop processing relocations after partially relaxing a call with WDISP30. ld/ChangeLog: 2016-12-05 Alyssa Milburn * testsuite/ld-sparc/wdispcall.s: New file. * testsuite/ld-sparc/wdispcall.dd: Likewise. * testsuite/ld-sparc/sparc.exp: Run new test. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b84dfab6f54..9632eac61ea 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2016-12-05 Alyssa Milburn + + * elfxx-sparc.c: Do not stop processing relocations after + partially relaxing a call with WDISP30. + 2016-12-05 Nick Clifton PR binutils/20922 diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c index 056a4b75507..f191d57296d 100644 --- a/bfd/elfxx-sparc.c +++ b/bfd/elfxx-sparc.c @@ -4122,7 +4122,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, contents + rel->r_offset - 4); if ((z & (0xffffffff ^ RD(~0))) != (INSN_OR | RS1(O7) | RS2(G0))) - break; + continue; /* The sequence was or %o7, %g0, %rN @@ -4135,7 +4135,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, reg = (y & RS1(~0)) >> 14; if (reg != ((z & RD(~0)) >> 25) || reg == G0 || reg == O7) - break; + continue; bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP, contents + rel->r_offset + 4); diff --git a/ld/ChangeLog b/ld/ChangeLog index 90283e3ffdb..3529834b013 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2016-12-05 Alyssa Milburn + + * testsuite/ld-sparc/wdispcall.s: New file. + * testsuite/ld-sparc/wdispcall.dd: Likewise. + * testsuite/ld-sparc/sparc.exp: Run new test. + 2016-12-03 Alan Modra * emultempl/ppc64elf.em (gld${EMULATION_NAME}_finish): Don't call diff --git a/ld/testsuite/ld-sparc/sparc.exp b/ld/testsuite/ld-sparc/sparc.exp index e58a21f1197..ec92d12fc12 100644 --- a/ld/testsuite/ld-sparc/sparc.exp +++ b/ld/testsuite/ld-sparc/sparc.exp @@ -94,6 +94,9 @@ set sparctests { {{readelf -WSsrl gotop32.rd} {objdump -drj.text gotop32.dd} {objdump -sj.got gotop32.sd} {objdump -sj.data gotop32.td}} "libgotop32.so"} + {"relaxed call WDISP30 relocation" "-static -melf32_sparc -relax" "" + "--32" {wdispcall.s} + {{objdump -dj.wdispcall wdispcall.dd}} "wdispcall"} } set sparc64tests { {"64-bit: TLS -fpic -shared transitions" "-shared -melf64_sparc" "" diff --git a/ld/testsuite/ld-sparc/wdispcall.dd b/ld/testsuite/ld-sparc/wdispcall.dd new file mode 100644 index 00000000000..ab06a567d91 --- /dev/null +++ b/ld/testsuite/ld-sparc/wdispcall.dd @@ -0,0 +1,18 @@ +#source: wdispcall.s +#as: --32 +#ld: -static -melf32_sparc -relax +#objdump: -dj.wdispcall +#target: sparc*-*-* + +.*: +file format elf32-sparc + +Disassembly of section .wdispcall: + +00000000 : + +0: 01 00 00 00 nop * + +4: 10 80 40 ff b 10400 + +8: 9e 10 40 00 mov %g1, %o7 + +c: 01 00 00 00 nop * + +10: 40 00 40 fc call 10400 + +14: 01 00 00 00 nop * + diff --git a/ld/testsuite/ld-sparc/wdispcall.s b/ld/testsuite/ld-sparc/wdispcall.s new file mode 100644 index 00000000000..0b05cad3ecf --- /dev/null +++ b/ld/testsuite/ld-sparc/wdispcall.s @@ -0,0 +1,14 @@ + .text +bar: + retl + nop + + .align 1024 + .section ".wdispcall" +foo: + nop + call bar + or %r1, %g0, %o7 + nop + call bar + nop