This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] [SPARC] bfd,ld: Continue after partially-successful relaxed call relocations.


bfd/ChangeLog:
	* elfxx-sparc.c: Do not stop processing relocations after
	partially relaxing a call with WDISP30.

ld/ChangeLog:
	* testsuite/ld-sparc/wdispcall.s: New file.
	* testsuite/ld-sparc/wdispcall.dd: Likewise.
	* testsuite/ld-sparc/sparc.exp: Run new test.
---
 bfd/elfxx-sparc.c                  |  4 ++--
 ld/testsuite/ld-sparc/sparc.exp    |  3 +++
 ld/testsuite/ld-sparc/wdispcall.dd | 18 ++++++++++++++++++
 ld/testsuite/ld-sparc/wdispcall.s  | 14 ++++++++++++++
 4 files changed, 37 insertions(+), 2 deletions(-)
 create mode 100644 ld/testsuite/ld-sparc/wdispcall.dd
 create mode 100644 ld/testsuite/ld-sparc/wdispcall.s

diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c
index 056a4b7..f191d57 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/testsuite/ld-sparc/sparc.exp b/ld/testsuite/ld-sparc/sparc.exp
index e58a21f..ec92d12 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 0000000..ab06a56
--- /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 <foo>:
+ +0:	01 00 00 00 	nop *
+ +4:	10 80 40 ff 	b  10400 <bar>
+ +8:	9e 10 40 00 	mov  %g1, %o7
+ +c:	01 00 00 00 	nop *
+ +10:	40 00 40 fc 	call  10400 <bar>
+ +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 0000000..0b05cad
--- /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
-- 
2.1.0


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]