public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* Thumb branches to an absolute address
@ 2011-05-31 14:11 Paul Brook
  0 siblings, 0 replies; only message in thread
From: Paul Brook @ 2011-05-31 14:11 UTC (permalink / raw)
  To: binutils

[-- Attachment #1: Type: Text/Plain, Size: 636 bytes --]

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.

[-- Attachment #2: patch --]
[-- Type: text/x-patch, Size: 1333 bytes --]

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-05-31 14:04 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-31 14:11 Thumb branches to an absolute address Paul Brook

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).