public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [committed] MIPS/BFD: Discard ineligible JALR relocations right away
@ 2017-02-23 23:53 Maciej W. Rozycki
  0 siblings, 0 replies; only message in thread
From: Maciej W. Rozycki @ 2017-02-23 23:53 UTC (permalink / raw)
  To: binutils

Discard R_MIPS_JALR and R_MICROMIPS_JALR relocations associated with 
jumps that cannot be converted to an equivalent branch right away in 
`mips_elf_calculate_relocation' rather than letting them through to 
`mips_elf_perform_relocation'.  This includes cross-mode jumps which 
need to flip the ISA bit or jumps to a misaligned location that cannot 
be encoded with a branch, in addition to preemptible symbol references 
already handled.

Cross-mode jumps are actually already rejected as the conversion is made 
in `mips_elf_perform_relocation', so in this case this change only saves 
some processing.  Jumps to a misaligned location are however converted, 
with bits causing misalignment lost, making resulting code functionally 
different even if the lone effect is avoiding an address error exception 
with an instruction fetch at the jump destination requested.

Add test cases suitable, also including GAS verification to confirm that 
the JALR relocations explicitly requested have indeed been output in the 
intermediate objects used.

	bfd/
	* elfxx-mips.c (mips_elf_calculate_relocation) <R_MIPS_JALR>
	<R_MICROMIPS_JALR>: Discard relocation if `cross_mode_jump_p'
	or misaligned.

	gas/
	* testsuite/gas/mips/jalr4.d: New test.
	* testsuite/gas/mips/jalr4-n32.d: New test.
	* testsuite/gas/mips/jalr4-n64.d: New test.
	* testsuite/gas/mips/jalr4.s: New test source.
	* testsuite/gas/mips/mips.exp: Run the new tests.

	ld/
	* testsuite/ld-mips-elf/jalr4.dd: New test.
	* testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
---
binutils-mips-bfd-jalr-reloc-unaligned.diff
Index: binutils/bfd/elfxx-mips.c
===================================================================
--- binutils.orig/bfd/elfxx-mips.c	2017-02-14 23:59:52.771263755 +0000
+++ binutils/bfd/elfxx-mips.c	2017-02-15 21:53:03.229441234 +0000
@@ -6278,7 +6278,13 @@ mips_elf_calculate_relocation (bfd *abfd
 	 when the symbol does not resolve locally.  */
       if (h != NULL && !SYMBOL_CALLS_LOCAL (info, &h->root))
 	return bfd_reloc_continue;
+      /* We can't optimize cross-mode jumps either.  */
+      if (*cross_mode_jump_p)
+	return bfd_reloc_continue;
       value = symbol + addend;
+      /* Neither we can non-instruction-aligned targets.  */
+      if (r_type == R_MIPS_JALR ? (value & 3) != 0 : (value & 1) == 0)
+	return bfd_reloc_continue;
       break;
 
     case R_MIPS_PJUMP:
Index: binutils/gas/testsuite/gas/mips/jalr4-n32.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/jalr4-n32.d	2017-02-15 21:52:46.000000000 +0000
@@ -0,0 +1,5 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALR reloc unaligned/cross-mode (n32)
+#as: -n32
+#source: jalr4.s
+#dump: jalr4.d
Index: binutils/gas/testsuite/gas/mips/jalr4-n64.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/jalr4-n64.d	2017-02-15 21:52:46.000000000 +0000
@@ -0,0 +1,42 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALR reloc unaligned/cross-mode (n64)
+#as: -64
+#source: jalr4.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 0320f809 	jalr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar0
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320000[89] 	jr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar0
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320f809 	jalr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar1
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320000[89] 	jr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar1
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320f809 	jalr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar2
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320000[89] 	jr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar2
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[0-9a-f]+ <[^>]*> 00000000 	nop
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
Index: binutils/gas/testsuite/gas/mips/jalr4.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/jalr4.d	2017-02-15 21:52:46.000000000 +0000
@@ -0,0 +1,30 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALR reloc unaligned/cross-mode (o32)
+#as: -32
+#source: jalr4.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 0320f809 	jalr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar0
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320000[89] 	jr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar0
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320f809 	jalr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar1
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320000[89] 	jr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar1
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320f809 	jalr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar2
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320000[89] 	jr	t9
+[ 	]*[0-9a-f]+: R_MIPS_JALR	bar2
+[0-9a-f]+ <[^>]*> 00000000 	nop
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
Index: binutils/gas/testsuite/gas/mips/jalr4.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/jalr4.s	2017-02-15 21:52:46.000000000 +0000
@@ -0,0 +1,63 @@
+	.abicalls
+	.text
+
+	.align	2
+	.globl	foo
+	.ent	foo
+foo:
+	.reloc	1f, R_MIPS_JALR, bar0
+1:	jalr	$25
+	.reloc	1f, R_MIPS_JALR, bar0
+1:	jr	$25
+	.reloc	1f, R_MIPS_JALR, bar1
+1:	jalr	$25
+	.reloc	1f, R_MIPS_JALR, bar1
+1:	jr	$25
+	.reloc	1f, R_MIPS_JALR, bar2
+1:	jalr	$25
+	.reloc	1f, R_MIPS_JALR, bar2
+1:	jr	$25
+	.end	foo
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	4, 0
+	.space	16
+
+	.align	2
+	.globl	bar0
+	.ent	bar0
+bar0:
+	.insn
+	.end	bar0
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	4, 0
+	.space	16
+
+	.align	2
+	.globl	bar1
+	.ent	bar1
+	.space	2
+bar1:
+	.insn
+	.end	bar1
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	4, 0
+	.space	16
+
+	.set	mips64r2
+	.set	mips16
+	.align	2
+	.globl	bar2
+	.ent	bar2
+	.byte	0
+bar2:
+	.insn
+	.end	bar2
+	.set	nomips16
+	.set	mips0
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	4, 0
+	.space	16
Index: binutils/gas/testsuite/gas/mips/mips.exp
===================================================================
--- binutils.orig/gas/testsuite/gas/mips/mips.exp	2017-02-15 21:51:49.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/mips.exp	2017-02-15 21:52:46.000000000 +0000
@@ -1182,13 +1182,21 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test "jalr2"
     run_dump_test_arches "jalr3"	[mips_arch_list_matching mips1 \
 					    !micromips]
+    run_dump_test_arches "jalr4"	[mips_arch_list_matching mips1 \
+					    !micromips]
     if $has_newabi {
 	run_dump_test_arches "jalr3-n32" \
 					[mips_arch_list_matching mips3 \
 					    !micromips]
+	run_dump_test_arches "jalr4-n32" \
+					[mips_arch_list_matching mips3 \
+					    !micromips]
 	run_dump_test_arches "jalr3-n64" \
 					[mips_arch_list_matching mips3 \
 					    !micromips]
+	run_dump_test_arches "jalr4-n64" \
+					[mips_arch_list_matching mips3 \
+					    !micromips]
     }
 
     run_dump_test_arches "aent"		[mips_arch_list_matching mips1]
Index: binutils/ld/testsuite/ld-mips-elf/jalr4.dd
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/jalr4.dd	2017-02-15 21:52:46.000000000 +0000
@@ -0,0 +1,19 @@
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 0411000f 	bal	0+000040 <bar0>
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 1000000d 	b	0+000040 <bar0>
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320f809 	jalr	t9
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 03200008 	jr	t9
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 0320f809 	jalr	t9
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 03200008 	jr	t9
+[0-9a-f]+ <[^>]*> 00000000 	nop
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
Index: binutils/ld/testsuite/ld-mips-elf/mips-elf.exp
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/mips-elf.exp	2017-02-15 00:04:26.807479477 +0000
+++ binutils/ld/testsuite/ld-mips-elf/mips-elf.exp	2017-02-15 21:52:46.000000000 +0000
@@ -999,7 +999,14 @@ foreach { abi } $abis {
 	    "$abi_asflags($abi)" \
 	    [list ../../../gas/testsuite/gas/mips/jalr3.s] \
 	    [list "objdump -d jalr3.dd"] \
-	    "jalr3-${abi}"]]
+	    "jalr3-${abi}"] \
+	[list \
+	    "MIPS JALR reloc unaligned/cross-mode link test ($abi)" \
+	    "$abi_ldflags($abi) -T jalr3.ld" "" \
+	    "$abi_asflags($abi)" \
+	    [list ../../../gas/testsuite/gas/mips/jalr4.s] \
+	    [list "objdump {-d --prefix-addresses --show-raw-insn} jalr4.dd"] \
+	    "jalr4-${abi}"]]
 }
 
 proc build_mips_plt_lib { abi } {

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-02-23 23:53 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-23 23:53 [committed] MIPS/BFD: Discard ineligible JALR relocations right away Maciej W. Rozycki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).