Thumb branches to an absolute address

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Thumb branches to an absolute address

Paul Brook
The attached patch fixes an assebler bug processing Thumb-2 branches to
absolute addresses.  We don't know how far away these really are, so if no
size suffix is specified we must assume they require a long branch.  Currently
we end up with a narrow branch, which is almost never suficient.  We also
segfault in some circumstances.

Tested on arm-none-eabi and arm-wrs-vxworks
Applied to CVS head

Paul

2011-05-31  Paul Brook  <[hidden email]>

        gas/
        * config/tc-arm.c (do_t_branch): Avoid relaxing branches to constant
        addresses.

        gas/testsuite/
        * arm/t2-branch-global.d: New test.
        * arm/t2-branch-global.s: New test.

diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index a9839cd..b09bf81 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -9845,7 +9845,9 @@ do_t_branch (void)
 
   if (unified_syntax
       && (inst.size_req == 4
-  || (inst.size_req != 2 && inst.operands[0].hasreloc)))
+  || (inst.size_req != 2
+      && (inst.operands[0].hasreloc
+  || inst.reloc.exp.X_op == O_constant))))
     {
       inst.instruction = THUMB_OP32(opcode);
       if (cond == COND_ALWAYS)
diff --git a/gas/testsuite/gas/arm/t2-branch-global.d b/gas/testsuite/gas/arm/t2-branch-global.d
new file mode 100644
index 0000000..5850d6b
--- /dev/null
+++ b/gas/testsuite/gas/arm/t2-branch-global.d
@@ -0,0 +1,14 @@
+#name: Thumb-2 branch to constant address
+#This test is only valid on ELF based ports.
+#not-target: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd *-*-riscix*
+#objdump: -rd
+
+
+.*: +file format.*arm.*
+
+
+Disassembly of section .text:
+
+00000000 <foo>:
+   0: f... b... b\.w .*
+ 0: R_ARM_THM_JUMP24 \*ABS\*.*
diff --git a/gas/testsuite/gas/arm/t2-branch-global.s b/gas/testsuite/gas/arm/t2-branch-global.s
new file mode 100644
index 0000000..223d924
--- /dev/null
+++ b/gas/testsuite/gas/arm/t2-branch-global.s
@@ -0,0 +1,5 @@
+.thumb
+.arch armv7
+.syntax unified
+foo:
+ b   0x10 @ Assembler must not relax this