This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Thumb branches to an absolute address
- From: Paul Brook <paul at codesourcery dot com>
- To: binutils at sourceware dot org
- Date: Tue, 31 May 2011 15:04:13 +0100
- Subject: Thumb branches to an absolute address
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 <paul@codesourcery.com>
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