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/GAS: Treat local jump relocs the same no matter if REL or RELA


Do not convert jump relocs against local MIPS16 or microMIPS symbols to 
refer to a section symbol instead even on RELA targets, as it makes it 
impossible for the linker to make a JAL to JALX conversion based on ISA 
symbol annotation, breaking regular and compressed MIPS interlinking.

	gas/
	* config/tc-mips.c (mips_fix_adjustable): Also return 0 for
	jump relocations against MIPS16 or microMIPS symbols on RELA
	targets.
	* testsuite/gas/mips/jalx-local.d: New test.
	* testsuite/gas/mips/jalx-local-n32.d: New test.
	* testsuite/gas/mips/jalx-local-n64.d: New test.
	* testsuite/gas/mips/jalx-local.s: New test source.
	* testsuite/gas/mips/mips.exp: Run the new tests.

	ld/
	* testsuite/ld-mips-elf/jalx-local.d: New test.
	* testsuite/ld-mips-elf/jalx-local-n32.d: New test.
	* testsuite/ld-mips-elf/jalx-local-n64.d: New test.
	* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
---

 I have committed this change.

  Maciej

binutils-mips-gas-fix-adjustable-newabi.diff
Index: binutils/gas/config/tc-mips.c
===================================================================
--- binutils.orig/gas/config/tc-mips.c	2016-05-24 11:05:32.977042971 +0100
+++ binutils/gas/config/tc-mips.c	2016-05-24 11:05:36.652414187 +0100
@@ -17165,9 +17165,9 @@ mips_fix_adjustable (fixS *fixp)
      There is a further restriction:
 
        5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
-	  R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
-	  targets with in-place addends; the relocation field cannot
-	  encode the low bit.
+	  R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols because
+	  we need to keep the MIPS16 or microMIPS symbol for the purpose
+	  of converting JAL to JALX instructions in the linker.
 
      For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
      against a MIPS16 symbol.  We deal with (5) by by not reducing any
@@ -17182,10 +17182,9 @@ mips_fix_adjustable (fixS *fixp)
      that we have for MIPS16 symbols.  */
   if (fixp->fx_subsy == NULL
       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
-	  || *symbol_get_tc (fixp->fx_addsy)
-	  || (HAVE_IN_PLACE_ADDENDS
-	      && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
-	      && jmp_reloc_p (fixp->fx_r_type))))
+	  || (ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
+	      && jmp_reloc_p (fixp->fx_r_type))
+	  || *symbol_get_tc (fixp->fx_addsy)))
     return 0;
 
   return 1;
Index: binutils/gas/testsuite/gas/mips/jalx-local-n32.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/jalx-local-n32.d	2016-05-24 11:05:45.889053105 +0100
@@ -0,0 +1,29 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALX local symbol relocation (n32)
+#as: -n32 -march=from-abi
+#source: jalx-local.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+	\.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> f400 0000 	jal	00000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MICROMIPS_26_S1	\.text\+0x1020
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> f000 0000 	jalx	00000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MICROMIPS_26_S1	\.text\+0x1020
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c 	jr	ra
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 0000 0000 	nop
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 0c000000 	jal	00000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MIPS_26	foo
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 74000000 	jalx	00000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MIPS_26	foo
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 	jalr	zero,ra
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+	\.\.\.
Index: binutils/gas/testsuite/gas/mips/jalx-local-n64.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/jalx-local-n64.d	2016-05-24 11:05:45.939436815 +0100
@@ -0,0 +1,37 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALX local symbol relocation (n64)
+#as: -64 -march=from-abi
+#source: jalx-local.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+	\.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> f400 0000 	jal	0000000000000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MICROMIPS_26_S1	\.text\+0x1020
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\+0x1020
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\+0x1020
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> f000 0000 	jalx	0000000000000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MICROMIPS_26_S1	\.text\+0x1020
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\+0x1020
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\+0x1020
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c 	jr	ra
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 0000 0000 	nop
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 0c000000 	jal	0000000000000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MIPS_26	foo
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 74000000 	jalx	0000000000000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MIPS_26	foo
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 	jalr	zero,ra
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+	\.\.\.
Index: binutils/gas/testsuite/gas/mips/jalx-local.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/jalx-local.d	2016-05-24 11:05:45.960340574 +0100
@@ -0,0 +1,28 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALX local symbol relocation
+#as: -32
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+	\.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> f400 0810 	jal	00001020 <bar>
+[ 	]*[0-9a-f]+: R_MICROMIPS_26_S1	\.text
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> f000 0408 	jalx	00001020 <bar>
+[ 	]*[0-9a-f]+: R_MICROMIPS_26_S1	\.text
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c 	jr	ra
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 0000 0000 	nop
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 0c000000 	jal	00000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MIPS_26	foo
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 74000000 	jalx	00000000 <foo-0x1000>
+[ 	]*[0-9a-f]+: R_MIPS_26	foo
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 	jalr	zero,ra
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+	\.\.\.
Index: binutils/gas/testsuite/gas/mips/jalx-local.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/jalx-local.s	2016-05-24 11:05:45.977869535 +0100
@@ -0,0 +1,33 @@
+	.text
+	.set	noreorder
+	.space	0x1000
+
+	.align	4
+	.set	micromips
+	.ent	foo
+foo:
+	nor	$0, $0
+	jal	bar
+	 nor	$0, $0
+	jalx	bar
+	 nor	$0, $0
+	jalr	$0, $ra
+	 nor	$0, $0
+	.end	foo
+
+	.align	4
+	.set	nomicromips
+	.ent	bar
+bar:
+	nor	$0, $0
+	jal	foo
+	 nor	$0, $0
+	jalx	foo
+	 nor	$0, $0
+	jalr	$0, $ra
+	 nor	$0, $0
+	.end	bar
+
+# 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	2016-05-24 11:02:24.683026675 +0100
+++ binutils/gas/testsuite/gas/mips/mips.exp	2016-05-24 11:05:45.988006062 +0100
@@ -796,11 +796,14 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test "mips-jalx-2"
     run_dump_test "jalx-imm"
     run_dump_test "jalx-addend"
+    run_dump_test "jalx-local"
     if $has_newabi {
 	run_dump_test "jalx-imm-n32"
 	run_dump_test "jalx-addend-n32"
+	run_dump_test "jalx-local-n32"
 	run_dump_test "jalx-imm-n64"
 	run_dump_test "jalx-addend-n64"
+	run_dump_test "jalx-local-n64"
     }
     # Check MIPS16 HI16/LO16 relocations
     run_dump_test "mips16-hilo"
Index: binutils/ld/testsuite/ld-mips-elf/jalx-local-n32.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/jalx-local-n32.d	2016-05-24 11:05:46.133703626 +0100
@@ -0,0 +1,6 @@
+#name: MIPS JALX to local symbol (n32)
+#source: ../../../gas/testsuite/gas/mips/jalx-local.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: jalx-local.d
Index: binutils/ld/testsuite/ld-mips-elf/jalx-local-n64.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/jalx-local-n64.d	2016-05-24 11:05:46.175725127 +0100
@@ -0,0 +1,6 @@
+#name: MIPS JALX to local symbol (n64)
+#source: ../../../gas/testsuite/gas/mips/jalx-local.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: jalx-local.d
Index: binutils/ld/testsuite/ld-mips-elf/jalx-local.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/jalx-local.d	2016-05-24 11:05:46.204623614 +0100
@@ -0,0 +1,26 @@
+#name: MIPS JALX to local symbol
+#source: ../../../gas/testsuite/gas/mips/jalx-local.s
+#as: -EB -32
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+	\.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> f300 0408 	jalx	0*1c001020 <.*>
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> f300 0408 	jalx	0*1c001020 <.*>
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c 	jr	ra
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 0000 0000 	nop
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 77000400 	jalx	0*1c001000 <.*>
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 77000400 	jalx	0*1c001000 <.*>
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 	jalr	zero,ra
+[0-9a-f]+ <[^>]*> 00000027 	nor	zero,zero,zero
+	\.\.\.
Index: binutils/ld/testsuite/ld-mips-elf/mips-elf.exp
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/mips-elf.exp	2016-05-24 11:02:24.705699804 +0100
+++ binutils/ld/testsuite/ld-mips-elf/mips-elf.exp	2016-05-24 11:05:46.215759301 +0100
@@ -169,9 +169,12 @@ if { $linux_gnu } {
 }
 
 run_dump_test "jalx-addend" [list [list ld $abi_ldflags(o32)]]
+run_dump_test "jalx-local" [list [list ld $abi_ldflags(o32)]]
 if $has_newabi {
     run_dump_test "jalx-addend-n32" [list [list ld $abi_ldflags(n32)]]
+    run_dump_test "jalx-local-n32" [list [list ld $abi_ldflags(n32)]]
     run_dump_test "jalx-addend-n64" [list [list ld $abi_ldflags(n64)]]
+    run_dump_test "jalx-local-n64" [list [list ld $abi_ldflags(n64)]]
 }
 
 # Test multi-got link.  We only do this on GNU/Linux because it requires


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