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]

Re: [ARM] global Thumb to ARM branches broken


Hi,

Here is the patch I promised last week, along with the related test cases.

Can I commit it?

Thanks
Christophe.

Attachment: global-branches.changelog
Description: Text document

Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.428
diff -u -b -p -r1.428 tc-arm.c
--- gas/config/tc-arm.c	29 Jan 2010 16:02:39 -0000	1.428
+++ gas/config/tc-arm.c	8 Feb 2010 16:00:32 -0000
@@ -19241,6 +19241,8 @@ md_pcrel_from_section (fixS * fixP, segT
 
     case BFD_RELOC_THUMB_PCREL_BRANCH23:
        if (fixP->fx_addsy
+	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
+	  && (!S_IS_EXTERNAL (fixP->fx_addsy))
 	  && ARM_IS_FUNC (fixP->fx_addsy)
  	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
  	base = fixP->fx_where + fixP->fx_frag->fr_address;
@@ -19250,6 +19252,8 @@ md_pcrel_from_section (fixS * fixP, segT
 	 zero.  */
      case BFD_RELOC_THUMB_PCREL_BLX:
        if (fixP->fx_addsy
+	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
+	  && (!S_IS_EXTERNAL (fixP->fx_addsy))
  	  && THUMB_IS_FUNC (fixP->fx_addsy)
  	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
  	base = fixP->fx_where + fixP->fx_frag->fr_address;
@@ -19259,6 +19263,8 @@ md_pcrel_from_section (fixS * fixP, segT
 	 loader expects the relocation not to take this into account.  */
     case BFD_RELOC_ARM_PCREL_BLX:
        if (fixP->fx_addsy
+	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
+	  && (!S_IS_EXTERNAL (fixP->fx_addsy))
  	  && ARM_IS_FUNC (fixP->fx_addsy)
  	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
  	base = fixP->fx_where + fixP->fx_frag->fr_address;
@@ -19266,6 +19272,8 @@ md_pcrel_from_section (fixS * fixP, segT
 
       case BFD_RELOC_ARM_PCREL_CALL:
        if (fixP->fx_addsy
+	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
+	  && (!S_IS_EXTERNAL (fixP->fx_addsy))
  	  && THUMB_IS_FUNC (fixP->fx_addsy)
  	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
  	base = fixP->fx_where + fixP->fx_frag->fr_address;
Index: gas/testsuite/gas/arm/branch-reloc.d
===================================================================
RCS file: gas/testsuite/gas/arm/branch-reloc.d
diff -N gas/testsuite/gas/arm/branch-reloc.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/arm/branch-reloc.d	8 Feb 2010 16:00:33 -0000
@@ -0,0 +1,89 @@
+#name: Inter-section branch relocations
+#This test is only valid on ELF based ports.
+#not-target: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd *-*-riscix*
+#as: -march=armv5t
+#objdump: -rd
+#stderr: branch-reloc.l
+
+# Test the generation of relocation for inter-section branches
+
+.*: +file format.*arm.*
+
+
+Disassembly of section .text:
+
+00000000 <arm_glob_sym1-0x4>:
+   0:	e1a00000 	nop			; \(mov r0, r0\)
+
+00000004 <arm_glob_sym1>:
+   4:	ebfffffe 	bl	46 <thumb_glob_sym1>
+			4: R_ARM_CALL	thumb_glob_sym1
+   8:	ebfffffe 	bl	100 <thumb_glob_sym2>
+			8: R_ARM_CALL	thumb_glob_sym2
+   c:	fa00000c 	blx	44 <thumb_sym1>
+  10:	ebfffffe 	bl	4 <arm_glob_sym1>
+			10: R_ARM_CALL	arm_glob_sym1
+  14:	ebfffffe 	bl	13c <arm_glob_sym2>
+			14: R_ARM_CALL	arm_glob_sym2
+  18:	eb000007 	bl	3c <arm_sym1>
+  1c:	fafffffe 	blx	46 <thumb_glob_sym1>
+			1c: R_ARM_CALL	thumb_glob_sym1
+  20:	fafffffe 	blx	100 <thumb_glob_sym2>
+			20: R_ARM_CALL	thumb_glob_sym2
+  24:	fa000006 	blx	44 <thumb_sym1>
+  28:	fafffffe 	blx	4 <arm_glob_sym1>
+			28: R_ARM_CALL	arm_glob_sym1
+  2c:	fafffffe 	blx	13c <arm_glob_sym2>
+			2c: R_ARM_CALL	arm_glob_sym2
+  30:	eb000001 	bl	3c <arm_sym1>
+  34:	e1a00000 	nop			; \(mov r0, r0\)
+  38:	e12fff1e 	bx	lr
+
+0000003c <arm_sym1>:
+  3c:	e1a00000 	nop			; \(mov r0, r0\)
+  40:	e12fff1e 	bx	lr
+
+00000044 <thumb_sym1>:
+  44:	4770      	bx	lr
+
+00000046 <thumb_glob_sym1>:
+  46:	4770      	bx	lr
+
+Disassembly of section foo:
+
+00000000 <thumb_glob_sym2-0x100>:
+	...
+
+00000100 <thumb_glob_sym2>:
+ 100:	f7ff fffe 	bl	4 <thumb_glob_sym2-0xfc>
+			100: R_ARM_THM_CALL	arm_glob_sym1
+ 104:	f7ff fffe 	bl	13c <arm_glob_sym2>
+			104: R_ARM_THM_CALL	arm_glob_sym2
+ 108:	f000 e816 	blx	138 <arm_sym2>
+ 10c:	f7ff fffe 	bl	46 <thumb_glob_sym2-0xba>
+			10c: R_ARM_THM_CALL	thumb_glob_sym1
+ 110:	f7ff fffe 	bl	100 <thumb_glob_sym2>
+			110: R_ARM_THM_CALL	thumb_glob_sym2
+ 114:	f000 f80e 	bl	134 <thumb_sym2>
+ 118:	f7ff effe 	blx	4 <thumb_glob_sym2-0xfc>
+			118: R_ARM_THM_CALL	arm_glob_sym1
+ 11c:	f7ff effe 	blx	13c <arm_glob_sym2>
+			11c: R_ARM_THM_CALL	arm_glob_sym2
+ 120:	f000 e80a 	blx	138 <arm_sym2>
+ 124:	f7ff effe 	blx	46 <thumb_glob_sym2-0xba>
+			124: R_ARM_THM_CALL	thumb_glob_sym1
+ 128:	f7ff effe 	blx	100 <thumb_glob_sym2>
+			128: R_ARM_THM_CALL	thumb_glob_sym2
+ 12c:	f000 f802 	bl	134 <thumb_sym2>
+ 130:	46c0      	nop			; \(mov r8, r8\)
+ 132:	4770      	bx	lr
+
+00000134 <thumb_sym2>:
+ 134:	46c0      	nop			; \(mov r8, r8\)
+ 136:	4770      	bx	lr
+
+00000138 <arm_sym2>:
+ 138:	e12fff1e 	bx	lr
+
+0000013c <arm_glob_sym2>:
+ 13c:	e12fff1e 	bx	lr
Index: gas/testsuite/gas/arm/branch-reloc.l
===================================================================
RCS file: gas/testsuite/gas/arm/branch-reloc.l
diff -N gas/testsuite/gas/arm/branch-reloc.l
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/arm/branch-reloc.l	8 Feb 2010 16:00:33 -0000
@@ -0,0 +1,3 @@
+[^:]*: Assembler messages:
+[^:]*:[0-9]*: Warning: blx to 'arm_sym1' an ARM ISA state function changed to bl
+[^:]*:[0-9]*: Warning: blx to Thumb func 'thumb_sym2' from Thumb ISA state changed to bl
\ No newline at end of file
Index: gas/testsuite/gas/arm/branch-reloc.s
===================================================================
RCS file: gas/testsuite/gas/arm/branch-reloc.s
diff -N gas/testsuite/gas/arm/branch-reloc.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/arm/branch-reloc.s	8 Feb 2010 16:00:33 -0000
@@ -0,0 +1,87 @@
+@ Check that non-local branches with and without mode switching
+@ produce the right relocations with appropriate in-place addends.
+
+	.syntax unified
+
+	.text
+	.arm
+	.global arm_glob_sym1
+	.global arm_glob_sym2
+	.global thumb_glob_sym1
+	.global thumb_glob_sym2
+	nop
+	.type arm_glob_sym1, %function
+arm_glob_sym1:
+	bl thumb_glob_sym1
+	bl thumb_glob_sym2
+	bl thumb_sym1
+	bl arm_glob_sym1
+	bl arm_glob_sym2
+	bl arm_sym1
+	blx thumb_glob_sym1
+	blx thumb_glob_sym2
+	blx thumb_sym1
+	blx arm_glob_sym1
+	blx arm_glob_sym2
+	blx arm_sym1
+	nop
+	bx lr
+
+	.type arm_sym1, %function
+arm_sym1:
+	nop
+	bx lr
+
+	.thumb
+	.thumb_func
+	.type thumb_sym1, %function
+thumb_sym1:
+	bx lr
+
+	.type thumb_glob_sym1, %function
+	.thumb_func
+	.thumb
+thumb_glob_sym1:
+	bx lr
+
+	.section foo,"ax"
+
+@ Add some space to avoid confusing objdump output: as we are
+@ producing a relocatable file, objdump may match an address to
+@ the wrong symbol (as symbols in different sections may have the same
+@ address in the object file).
+	.space 0x100
+
+	.type thumb_glob_sym2, %function
+	.thumb_func
+	.thumb
+thumb_glob_sym2:
+	bl arm_glob_sym1
+	bl arm_glob_sym2
+	bl arm_sym2
+	bl thumb_glob_sym1
+	bl thumb_glob_sym2
+	bl thumb_sym2
+	blx arm_glob_sym1
+	blx arm_glob_sym2
+	blx arm_sym2
+	blx thumb_glob_sym1
+	blx thumb_glob_sym2
+	blx thumb_sym2
+	nop
+	bx lr
+
+	.type thumb_sym2, %function
+thumb_sym2:
+	nop
+	bx lr
+
+	.arm
+	.type arm_sym2, %function
+arm_sym2:
+	bx lr
+
+	.global arm_glob_sym2
+	.type arm_glob_sym2, %function
+arm_glob_sym2:
+	bx lr

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