[binutils-gdb] Fix Thumb-2 BL detection

Thomas Preud'homme thopre01@sourceware.org
Fri Jul 1 15:16:00 GMT 2016


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5e866f5aeeaf7514f5ca4f9eaba41594eac22e5b

commit 5e866f5aeeaf7514f5ca4f9eaba41594eac22e5b
Author: Thomas Preud'homme <thomas.preudhomme@arm.com>
Date:   Fri Jul 1 16:13:25 2016 +0100

    Fix Thumb-2 BL detection
    
    2016-07-01  Thomas Preud'homme  <thomas.preudhomme@arm.com>
    
    bfd/
    	* elf32-arm.c (using_thumb2_bl): New function.
    	(arm_type_of_stub): Declare thumb2 variable together and change type
    	to bfd_boolean.  Use using_thumb2_bl () to determine whether
    	THM_MAX_FWD_BRANCH_OFFSET or THM2_MAX_FWD_BRANCH_OFFSET should be
    	checked for BL range.
    	(elf32_arm_final_link_relocate): Use using_thumb2_bl () to determine
    	the bit size of BL offset.
    
    ld/
    	* testsuite/ld-arm/arm-elf.exp (Thumb-2 BL): Assemble for ARMv7.
    	(Thumb-2 BL on ARMv6-M): New testcase.
    	* testsuite/ld-arm/thumb2-bl.d: Do not try to match testcase filename.
    	* testsuite/ld-arm/thumb2-bl.s: Do not select architecture.

Diff:
---
 bfd/ChangeLog                   | 10 ++++++++++
 bfd/elf32-arm.c                 | 30 ++++++++++++++++++++++++------
 ld/ChangeLog                    |  7 +++++++
 ld/testsuite/ld-arm/arm-elf.exp |  5 ++++-
 ld/testsuite/ld-arm/thumb2-bl.d |  2 +-
 ld/testsuite/ld-arm/thumb2-bl.s |  1 -
 6 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 90e34ac..adfed6f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2016-07-01  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+	* elf32-arm.c (using_thumb2_bl): New function.
+	(arm_type_of_stub): Declare thumb2 variable together and change type
+	to bfd_boolean.  Use using_thumb2_bl () to determine whether
+	THM_MAX_FWD_BRANCH_OFFSET or THM2_MAX_FWD_BRANCH_OFFSET should be
+	checked for BL range.
+	(elf32_arm_final_link_relocate): Use using_thumb2_bl () to determine
+	the bit size of BL offset.
+
 2016-06-29  Nick Clifton  <nickc@redhat.com>
 
 	* elfnn-aarch64.c (is_aarch64_mapping_symbol): New function.
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 3d4a458..b5e7ddb 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -3569,6 +3569,24 @@ using_thumb2 (struct elf32_arm_link_hash_table *globals)
 	  || arch == TAG_CPU_ARCH_V8M_MAIN);
 }
 
+/* Determine whether Thumb-2 BL instruction is available.  */
+
+static bfd_boolean
+using_thumb2_bl (struct elf32_arm_link_hash_table *globals)
+{
+  int arch =
+    bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
+
+  /* Force return logic to be reviewed for each new architecture.  */
+  BFD_ASSERT (arch <= TAG_CPU_ARCH_V8
+	      || arch == TAG_CPU_ARCH_V8M_BASE
+	      || arch == TAG_CPU_ARCH_V8M_MAIN);
+
+  /* Architecture was introduced after ARMv6T2 (eg. ARMv6-M).  */
+  return (arch == TAG_CPU_ARCH_V6T2
+	  || arch >= TAG_CPU_ARCH_V7);
+}
+
 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
    .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
    hash table.  */
@@ -3823,8 +3841,7 @@ arm_type_of_stub (struct bfd_link_info *info,
   bfd_signed_vma branch_offset;
   unsigned int r_type;
   struct elf32_arm_link_hash_table * globals;
-  int thumb2;
-  int thumb_only;
+  bfd_boolean thumb2, thumb2_bl, thumb_only;
   enum elf32_arm_stub_type stub_type = arm_stub_none;
   int use_plt = 0;
   enum arm_st_branch_type branch_type = *actual_branch_type;
@@ -3839,8 +3856,8 @@ arm_type_of_stub (struct bfd_link_info *info,
     return stub_type;
 
   thumb_only = using_thumb_only (globals);
-
   thumb2 = using_thumb2 (globals);
+  thumb2_bl = using_thumb2_bl (globals);
 
   /* Determine where the call point is.  */
   location = (input_sec->output_offset
@@ -3906,10 +3923,10 @@ arm_type_of_stub (struct bfd_link_info *info,
 	   but only if this call is not through a PLT entry. Indeed,
 	   PLT stubs handle mode switching already.
       */
-      if ((!thumb2
+      if ((!thumb2_bl
 	    && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
 		|| (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
-	  || (thumb2
+	  || (thumb2_bl
 	      && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
 		  || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
 	  || (thumb2
@@ -9838,6 +9855,7 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
 	bfd_signed_vma signed_check;
 	int bitsize;
 	const int thumb2 = using_thumb2 (globals);
+	const int thumb2_bl = using_thumb2_bl (globals);
 
 	/* A branch to an undefined weak symbol is turned into a jump to
 	   the next instruction unless a PLT entry will be created.
@@ -10014,7 +10032,7 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
 	   this relocation according to whether we're relocating for
 	   Thumb-2 or not.  */
 	bitsize = howto->bitsize;
-	if (!thumb2)
+	if (!thumb2_bl)
 	  bitsize -= 2;
 	reloc_signed_max = (1 << (bitsize - 1)) - 1;
 	reloc_signed_min = ~reloc_signed_max;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 5f2e6cd..f53a2ed 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2016-07-01  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+	* testsuite/ld-arm/arm-elf.exp (Thumb-2 BL): Assemble for ARMv7.
+	(Thumb-2 BL on ARMv6-M): New testcase.
+	* testsuite/ld-arm/thumb2-bl.d: Do not try to match testcase filename.
+	* testsuite/ld-arm/thumb2-bl.s: Do not select architecture.
+
 2016-07-01  Tristan Gingold  <gingold@adacore.com>
 
 	* NEWS: Add marker for 2.27.
diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp
index a5d4c87..597bdcf 100644
--- a/ld/testsuite/ld-arm/arm-elf.exp
+++ b/ld/testsuite/ld-arm/arm-elf.exp
@@ -604,9 +604,12 @@ set armeabitests_nonacl {
      {{objdump -d fix-arm1176-off.d}}
      "fix-arm1176-6"}
 
-     {"Thumb-2 BL" "-Ttext 0x1000 --section-start .foo=0x1001000" "" "" {thumb2-bl.s}
+     {"Thumb-2 BL" "-Ttext 0x1000 --section-start .foo=0x1001000" "" "-march=armv7" {thumb2-bl.s}
       {{objdump -dr thumb2-bl.d}}
       "thumb2-bl"}
+     {"Thumb-2 BL on ARMv6-M" "-Ttext 0x1000 --section-start .foo=0x1001000" "" "-march=armv6-m" {thumb2-bl.s}
+      {{objdump -dr thumb2-bl.d}}
+      "thumb2-armv6m-bl"}
     {"Thumb-2 Interworked branch" "-T arm.ld" "" "" {thumb2-b-interwork.s}
       {{objdump -dr thumb2-b-interwork.d}}
       "thumb2-b-interwork"}
diff --git a/ld/testsuite/ld-arm/thumb2-bl.d b/ld/testsuite/ld-arm/thumb2-bl.d
index 298a044..8dab0c0 100644
--- a/ld/testsuite/ld-arm/thumb2-bl.d
+++ b/ld/testsuite/ld-arm/thumb2-bl.d
@@ -1,5 +1,5 @@
 
-.*thumb2-bl:     file format elf32-.*arm.*
+.*:     file format elf32-.*arm.*
 
 Disassembly of section .text:
 
diff --git a/ld/testsuite/ld-arm/thumb2-bl.s b/ld/testsuite/ld-arm/thumb2-bl.s
index ddb1cd3..80af810 100644
--- a/ld/testsuite/ld-arm/thumb2-bl.s
+++ b/ld/testsuite/ld-arm/thumb2-bl.s
@@ -1,7 +1,6 @@
 @ Test to ensure that a Thumb-2 BL works with an offset that is
 @ not permissable for Thumb-1.
 
-	.arch armv7
 	.global _start
 	.syntax unified



More information about the Binutils-cvs mailing list