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]

[committed] MIPS/BFD: Include the addend in JALX's target alignment verification


On RELA targets the addend can affect JALX target's alignment, so only 
verify it once the whole relocation calculation has completed.

	bfd/
	* elfxx-mips.c (mips_elf_calculate_relocation) <R_MIPS16_26>
	<R_MIPS_26, R_MICROMIPS_26_S1>: Include the addend in JALX's 
	target alignment verification.

	ld/
	* testsuite/ld-mips-elf/unaligned-jalx-addend-0.d: New test.
	* testsuite/ld-mips-elf/unaligned-jalx-addend-1.d: New test.
	* testsuite/ld-mips-elf/unaligned-jalx-addend-mips16-0.d: New 
	test.
	* testsuite/ld-mips-elf/unaligned-jalx-addend-mips16-1.d: New 
	test.
	* testsuite/ld-mips-elf/unaligned-jalx-addend-micromips-0.d: New 
	test.
	* testsuite/ld-mips-elf/unaligned-jalx-addend-micromips-1.d: New
	test.
	* testsuite/ld-mips-elf/unaligned-jalx-addend-0.s: New test 
	source.
	* testsuite/ld-mips-elf/unaligned-jalx-addend-1.s: New test
	source.
	* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
---
 I have committed this change.

  Maciej

binutils-mips-bfd-jalx-unaligned.diff
Index: binutils/bfd/elfxx-mips.c
===================================================================
--- binutils.orig/bfd/elfxx-mips.c	2016-05-26 23:47:36.686220427 +0100
+++ binutils/bfd/elfxx-mips.c	2016-05-27 00:02:02.062860239 +0100
@@ -5773,11 +5773,6 @@ mips_elf_calculate_relocation (bfd *abfd
       {
 	unsigned int shift;
 
-	/* Make sure the target of JALX is word-aligned.  Bit 0 must be
-	   the correct ISA mode selector and bit 1 must be 0.  */
-	if (*cross_mode_jump_p && (symbol & 3) != (r_type == R_MIPS_26))
-	  return bfd_reloc_outofrange;
-
 	/* Shift is 2, unusually, for microMIPS JALX.  */
 	shift = (!*cross_mode_jump_p && r_type == R_MICROMIPS_26_S1) ? 1 : 2;
 
@@ -5787,7 +5782,14 @@ mips_elf_calculate_relocation (bfd *abfd
 	  value = _bfd_mips_elf_sign_extend (addend, 26 + shift);
 	else
 	  value = addend;
-	value = (value + symbol) >> shift;
+	value += symbol;
+
+	/* Make sure the target of JALX is word-aligned.  Bit 0 must be
+	   the correct ISA mode selector and bit 1 must be 0.  */
+	if (*cross_mode_jump_p && (value & 3) != (r_type == R_MIPS_26))
+	  return bfd_reloc_outofrange;
+
+	value >>= shift;
 	if (!was_local_p && h->root.root.type != bfd_link_hash_undefweak)
 	  overflowed_p = (value >> 26) != ((p + 4) >> (26 + shift));
 	value &= howto->dst_mask;
Index: binutils/ld/testsuite/ld-mips-elf/mips-elf.exp
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/mips-elf.exp	2016-05-27 00:01:44.016118061 +0100
+++ binutils/ld/testsuite/ld-mips-elf/mips-elf.exp	2016-05-27 00:02:10.453503437 +0100
@@ -184,6 +184,21 @@ run_dump_test "unaligned-jalx-mips16-1" 
 run_dump_test "unaligned-jalx-micromips-0" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "unaligned-jalx-micromips-1" [list [list ld $abi_ldflags(o32)]]
 
+if $has_newabi {
+    run_dump_test "unaligned-jalx-addend-0" \
+					[list [list ld $abi_ldflags(n32)]]
+    run_dump_test "unaligned-jalx-addend-1" \
+					[list [list ld $abi_ldflags(n32)]]
+    run_dump_test "unaligned-jalx-addend-mips16-0" \
+					[list [list ld $abi_ldflags(n32)]]
+    run_dump_test "unaligned-jalx-addend-mips16-1" \
+					[list [list ld $abi_ldflags(n32)]]
+    run_dump_test "unaligned-jalx-addend-micromips-0" \
+					[list [list ld $abi_ldflags(n32)]]
+    run_dump_test "unaligned-jalx-addend-micromips-1" \
+					[list [list ld $abi_ldflags(n32)]]
+}
+
 run_dump_test "unaligned-lwpc-0" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "unaligned-lwpc-1" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "unaligned-ldpc-0" [list [list ld $abi_ldflags(o32)]]
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-0.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-0.d	2016-05-27 00:02:10.484869724 +0100
@@ -0,0 +1,27 @@
+#name: MIPS JALX to unaligned symbol with addend 0
+#source: unaligned-jalx-addend-0.s
+#source: unaligned-insn.s -mips16
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 7700000d 	jalx	1c000034 <bar2>
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 7700000c 	jalx	1c000030 <bar0>
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 7700000c 	jalx	1c000030 <bar0>
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 7700000e 	jalx	1c000038 <bar4>
+[0-9a-f]+ <[^>]*> 00000000 	nop
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-0.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-0.s	2016-05-27 00:02:10.507289809 +0100
@@ -0,0 +1,14 @@
+	.text
+	.align	4
+	.globl	foo
+	.ent	foo
+foo:
+	jal	bar0 + 4
+	jal	bar1 - 2
+	jal	bar2 - 4
+	jal	bar3 + 2
+	.end	foo
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	4, 0
+	.space	16
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-1.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-1.d	2016-05-27 00:02:10.534674389 +0100
@@ -0,0 +1,29 @@
+#name: MIPS JALX to unaligned symbol with addend 1
+#source: unaligned-jalx-addend-1.s
+#source: unaligned-insn.s -mips16
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#error: \A[^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\Z
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-1.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-1.s	2016-05-27 00:02:10.548853881 +0100
@@ -0,0 +1,22 @@
+	.text
+	.align	4
+	.globl	foo
+	.ent	foo
+foo:
+	jal	bar0 + 1
+	jal	bar0 + 2
+	jal	bar0 + 3
+	jal	bar1 + 1
+	jal	bar1 + 3
+	jal	bar1 + 4
+	jal	bar2 - 1
+	jal	bar2 - 2
+	jal	bar2 - 3
+	jal	bar3 - 1
+	jal	bar3 - 3
+	jal	bar3 - 4
+	.end	foo
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	4, 0
+	.space	16
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-micromips-0.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-micromips-0.d	2016-05-27 00:02:10.564002234 +0100
@@ -0,0 +1,27 @@
+#name: microMIPS JALX to unaligned symbol with addend 0
+#source: unaligned-jalx-addend-0.s -mmicromips
+#source: unaligned-insn.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> f300 000d 	jalx	1c000034 <bar2>
+[0-9a-f]+ <[^>]*> 0000 0000 	nop
+[0-9a-f]+ <[^>]*> f300 000c 	jalx	1c000030 <bar0>
+[0-9a-f]+ <[^>]*> 0000 0000 	nop
+[0-9a-f]+ <[^>]*> f300 000c 	jalx	1c000030 <bar0>
+[0-9a-f]+ <[^>]*> 0000 0000 	nop
+[0-9a-f]+ <[^>]*> f300 000e 	jalx	1c000038 <bar4>
+[0-9a-f]+ <[^>]*> 0000 0000 	nop
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-micromips-1.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-micromips-1.d	2016-05-27 00:02:10.589185645 +0100
@@ -0,0 +1,30 @@
+#name: microMIPS JALX to unaligned symbol with addend 1
+#source: unaligned-jalx-addend-1.s -mmicromips
+#source: unaligned-insn.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#error: \A[^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\Z
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-mips16-0.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-mips16-0.d	2016-05-27 00:02:10.608294340 +0100
@@ -0,0 +1,27 @@
+#name: MIPS16 JALX to unaligned symbol with addend 0
+#source: unaligned-jalx-addend-0.s -mips16
+#source: unaligned-insn.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 1c18 000d 	jalx	1c000034 <bar2>
+[0-9a-f]+ <[^>]*> 6500      	nop
+[0-9a-f]+ <[^>]*> 1c18 000c 	jalx	1c000030 <bar0>
+[0-9a-f]+ <[^>]*> 6500      	nop
+[0-9a-f]+ <[^>]*> 1c18 000c 	jalx	1c000030 <bar0>
+[0-9a-f]+ <[^>]*> 6500      	nop
+[0-9a-f]+ <[^>]*> 1c18 000e 	jalx	1c000038 <bar4>
+[0-9a-f]+ <[^>]*> 6500      	nop
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
+	\.\.\.
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-mips16-1.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-jalx-addend-mips16-1.d	2016-05-27 00:02:10.632496376 +0100
@@ -0,0 +1,30 @@
+#name: MIPS16 JALX to unaligned symbol with addend 1
+#source: unaligned-jalx-addend-1.s -mips16
+#source: unaligned-insn.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#error: \A[^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\n
+#error:   [^\n]*: In function `foo':\n
+#error:   \(\.text\+0x[0-9a-f]+\): JALX to a non-word-aligned address\Z


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