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: Keep the original microMIPS symbol reference in branch relocs


Keep original microMIPS symbols in references from branch relocations so 
that the ISA bit is retained and can be verified for validity in static 
link.  No need to update WRT MIPS16 symbols because we keep them all 
anyway for other reasons.

	gas/
	* config/tc-mips.c (b_reloc_p): New function.
	(mips_fix_adjustable): Also keep the original microMIPS symbol
	referred from branch relocations.
	* testsuite/gas/mips/branch-local-1.d: New test.
	* testsuite/gas/mips/branch-local-n32-1.d: New test.
	* testsuite/gas/mips/branch-local-n64-1.d: New test.
	* testsuite/gas/mips/micromips@branch-misc-4-64.d: Update 
	relocations.
	* testsuite/gas/mips/branch-local-1.s: New test source.
	* testsuite/gas/mips/mips.exp: Run the new cases.
---
binutils-umips-gas-fix-adjustable-b.diff
Index: binutils/gas/config/tc-mips.c
===================================================================
--- binutils.orig/gas/config/tc-mips.c	2016-06-21 11:52:00.834557975 +0100
+++ binutils/gas/config/tc-mips.c	2016-06-21 12:48:37.363900985 +0100
@@ -4109,6 +4109,17 @@ jmp_reloc_p (bfd_reloc_code_real_type re
 }
 
 static inline bfd_boolean
+b_reloc_p (bfd_reloc_code_real_type reloc)
+{
+  return (reloc == BFD_RELOC_MIPS_26_PCREL_S2
+	  || reloc == BFD_RELOC_MIPS_21_PCREL_S2
+	  || reloc == BFD_RELOC_16_PCREL_S2
+	  || reloc == BFD_RELOC_MICROMIPS_16_PCREL_S1
+	  || reloc == BFD_RELOC_MICROMIPS_10_PCREL_S1
+	  || reloc == BFD_RELOC_MICROMIPS_7_PCREL_S1);
+}
+
+static inline bfd_boolean
 got16_reloc_p (bfd_reloc_code_real_type reloc)
 {
   return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
@@ -17218,13 +17229,16 @@ 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 because
-	  we need to keep the MIPS16 or microMIPS symbol for the purpose
-	  of converting JAL to JALX instructions in the linker.
+	  R_MICROMIPS_26_S1) or branch relocations (R_MIPS_PC26_S2,
+	  R_MIPS_PC21_S2, R_MIPS_PC16, R_MICROMIPS_PC16_S1,
+	  R_MICROMIPS_PC10_S1 or R_MICROMIPS_PC7_S1) against MIPS16 or
+	  microMIPS symbols because we need to keep the MIPS16 or
+	  microMIPS symbol for the purpose of mode mismatch detection
+	  and JAL to JALX instruction conversion in the linker.
 
      For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
      against a MIPS16 symbol.  We deal with (5) by additionally leaving
-     alone any jump relocations against a microMIPS symbol.
+     alone any jump and branch relocations against a microMIPS symbol.
 
      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
      relocation against some symbol R, no relocation against R may be
@@ -17236,7 +17250,8 @@ mips_fix_adjustable (fixS *fixp)
   if (fixp->fx_subsy == NULL
       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
 	  || (ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
-	      && jmp_reloc_p (fixp->fx_r_type))
+	      && (jmp_reloc_p (fixp->fx_r_type)
+		  || b_reloc_p (fixp->fx_r_type)))
 	  || *symbol_get_tc (fixp->fx_addsy)))
     return 0;
 
Index: binutils/gas/testsuite/gas/mips/branch-local-1.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/branch-local-1.d	2016-06-21 12:48:44.755564633 +0100
@@ -0,0 +1,26 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS branch local symbol relocation 1
+#as: -32
+#source: branch-local-1.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.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]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 40e2 fffe 	beqzc	v0,00001014 <bar\+0x4>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC16_S1	foo
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> cfff      	b	0000101c <bar\+0xc>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC10_S1	foo
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 8d7f      	beqz	v0,00001022 <bar\+0x12>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC7_S1	foo
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c 	jr	ra
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+	\.\.\.
Index: binutils/gas/testsuite/gas/mips/branch-local-1.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/branch-local-1.s	2016-06-21 12:48:44.779832850 +0100
@@ -0,0 +1,31 @@
+	.text
+	.set	noreorder
+	.space	0x1000
+
+	.align	4
+	.set	micromips
+	.ent	foo
+foo:
+	nor	$0, $0
+	jalr	$0, $ra
+	 nor	$0, $0
+	.end	foo
+
+	.align	4
+	.set	micromips
+	.ent	bar
+bar:
+	nor	$0, $0
+	beqzc	$2, foo
+	nor	$0, $0
+	b	foo
+	 nor	$0, $0
+	beqz	$2, 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/branch-local-n32-1.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/branch-local-n32-1.d	2016-06-21 12:48:44.803236873 +0100
@@ -0,0 +1,26 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS branch local symbol relocation 1 (n32)
+#as: -n32 -march=from-abi
+#source: branch-local-1.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.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]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 40e2 0000 	beqzc	v0,00001018 <bar\+0x8>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC16_S1	foo-0x4
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> cc00      	b	0000101e <bar\+0xe>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC10_S1	foo-0x2
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 8d00      	beqz	v0,00001024 <bar\+0x14>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC7_S1	foo-0x2
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c 	jr	ra
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+	\.\.\.
Index: binutils/gas/testsuite/gas/mips/branch-local-n64-1.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/branch-local-n64-1.d	2016-06-21 12:48:44.827676063 +0100
@@ -0,0 +1,32 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS branch local symbol relocation 1 (n64)
+#as: -64 -march=from-abi
+#source: branch-local-1.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.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]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 40e2 0000 	beqzc	v0,0000000000001018 <bar\+0x8>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC16_S1	foo-0x4
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x4
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x4
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> cc00      	b	000000000000101e <bar\+0xe>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC10_S1	foo-0x2
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x2
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x2
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 8d00      	beqz	v0,0000000000001024 <bar\+0x14>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC7_S1	foo-0x2
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x2
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x2
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c 	jr	ra
+[0-9a-f]+ <[^>]*> 0000 02d0 	not	zero,zero
+	\.\.\.
Index: binutils/gas/testsuite/gas/mips/micromips@branch-misc-4-64.d
===================================================================
--- binutils.orig/gas/testsuite/gas/mips/micromips@branch-misc-4-64.d	2016-06-20 23:18:10.961410455 +0100
+++ binutils/gas/testsuite/gas/mips/micromips@branch-misc-4-64.d	2016-06-21 12:48:37.411994440 +0100
@@ -14,10 +14,10 @@
 [ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\-0x4
 [ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\-0x4
 [0-9a-f]+ <[^>]*> 0c00      	nop
-[0-9a-f]+ <[^>]*> 9400 0000 	b	[0-9a-f]+ <foo\+0x[0-9a-f]+>
-[ 	]*[0-9a-f]+: R_MICROMIPS_PC16_S1	\.init\+0x2
-[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\+0x2
-[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\+0x2
+[0-9a-f]+ <[^>]*> 9400 0000 	b	[0-9a-f]+ <\.Lfoo\+0x[0-9a-f]+>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC16_S1	\.Lbar-0x4
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x4
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x4
 [0-9a-f]+ <[^>]*> 0c00      	nop
 	\.\.\.
 
@@ -27,9 +27,9 @@
 [ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\-0x4
 [ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\-0x4
 [0-9a-f]+ <[^>]*> 0c00      	nop
-[0-9a-f]+ <[^>]*> 9400 0000 	b	[0-9a-f]+ <bar\+0x[0-9a-f]+>
-[ 	]*[0-9a-f]+: R_MICROMIPS_PC16_S1	\.text\+0x40002
-[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\+0x40002
-[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*\+0x40002
+[0-9a-f]+ <[^>]*> 9400 0000 	b	[0-9a-f]+ <\.Lbar\+0x[0-9a-f]+>
+[ 	]*[0-9a-f]+: R_MICROMIPS_PC16_S1	\.Lfoo-0x4
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x4
+[ 	]*[0-9a-f]+: R_MIPS_NONE	\*ABS\*-0x4
 [0-9a-f]+ <[^>]*> 0c00      	nop
 	\.\.\.
Index: binutils/gas/testsuite/gas/mips/mips.exp
===================================================================
--- binutils.orig/gas/testsuite/gas/mips/mips.exp	2016-06-21 11:52:06.556318983 +0100
+++ binutils/gas/testsuite/gas/mips/mips.exp	2016-06-21 12:48:44.838896620 +0100
@@ -588,6 +588,11 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test "branch-weak-3"
     run_dump_test "branch-weak-4"
     run_dump_test "branch-weak-5"
+    run_dump_test "branch-local-1"
+    if $has_newabi {
+	run_dump_test "branch-local-n32-1"
+	run_dump_test "branch-local-n64-1"
+    }
 
     run_dump_test "compact-eh-eb-1"
     run_dump_test "compact-eh-eb-2"


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