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.
This commit is contained in:
Thomas Preud'homme
2016-07-01 16:13:25 +01:00
parent 5077bfff90
commit 5e866f5aee
6 changed files with 46 additions and 9 deletions

View File

@ -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> 2016-06-29 Nick Clifton <nickc@redhat.com>
* elfnn-aarch64.c (is_aarch64_mapping_symbol): New function. * elfnn-aarch64.c (is_aarch64_mapping_symbol): New function.

View File

@ -3569,6 +3569,24 @@ using_thumb2 (struct elf32_arm_link_hash_table *globals)
|| arch == TAG_CPU_ARCH_V8M_MAIN); || 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 /* 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 .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
hash table. */ hash table. */
@ -3823,8 +3841,7 @@ arm_type_of_stub (struct bfd_link_info *info,
bfd_signed_vma branch_offset; bfd_signed_vma branch_offset;
unsigned int r_type; unsigned int r_type;
struct elf32_arm_link_hash_table * globals; struct elf32_arm_link_hash_table * globals;
int thumb2; bfd_boolean thumb2, thumb2_bl, thumb_only;
int thumb_only;
enum elf32_arm_stub_type stub_type = arm_stub_none; enum elf32_arm_stub_type stub_type = arm_stub_none;
int use_plt = 0; int use_plt = 0;
enum arm_st_branch_type branch_type = *actual_branch_type; 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; return stub_type;
thumb_only = using_thumb_only (globals); thumb_only = using_thumb_only (globals);
thumb2 = using_thumb2 (globals); thumb2 = using_thumb2 (globals);
thumb2_bl = using_thumb2_bl (globals);
/* Determine where the call point is. */ /* Determine where the call point is. */
location = (input_sec->output_offset 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, but only if this call is not through a PLT entry. Indeed,
PLT stubs handle mode switching already. PLT stubs handle mode switching already.
*/ */
if ((!thumb2 if ((!thumb2_bl
&& (branch_offset > THM_MAX_FWD_BRANCH_OFFSET && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
|| (branch_offset < THM_MAX_BWD_BRANCH_OFFSET))) || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
|| (thumb2 || (thumb2_bl
&& (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
|| (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET))) || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
|| (thumb2 || (thumb2
@ -9838,6 +9855,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
bfd_signed_vma signed_check; bfd_signed_vma signed_check;
int bitsize; int bitsize;
const int thumb2 = using_thumb2 (globals); 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 /* A branch to an undefined weak symbol is turned into a jump to
the next instruction unless a PLT entry will be created. 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 this relocation according to whether we're relocating for
Thumb-2 or not. */ Thumb-2 or not. */
bitsize = howto->bitsize; bitsize = howto->bitsize;
if (!thumb2) if (!thumb2_bl)
bitsize -= 2; bitsize -= 2;
reloc_signed_max = (1 << (bitsize - 1)) - 1; reloc_signed_max = (1 << (bitsize - 1)) - 1;
reloc_signed_min = ~reloc_signed_max; reloc_signed_min = ~reloc_signed_max;

View File

@ -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> 2016-07-01 Tristan Gingold <gingold@adacore.com>
* NEWS: Add marker for 2.27. * NEWS: Add marker for 2.27.

View File

@ -604,9 +604,12 @@ set armeabitests_nonacl {
{{objdump -d fix-arm1176-off.d}} {{objdump -d fix-arm1176-off.d}}
"fix-arm1176-6"} "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}} {{objdump -dr thumb2-bl.d}}
"thumb2-bl"} "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} {"Thumb-2 Interworked branch" "-T arm.ld" "" "" {thumb2-b-interwork.s}
{{objdump -dr thumb2-b-interwork.d}} {{objdump -dr thumb2-b-interwork.d}}
"thumb2-b-interwork"} "thumb2-b-interwork"}

View File

@ -1,5 +1,5 @@
.*thumb2-bl: file format elf32-.*arm.* .*: file format elf32-.*arm.*
Disassembly of section .text: Disassembly of section .text:

View File

@ -1,7 +1,6 @@
@ Test to ensure that a Thumb-2 BL works with an offset that is @ Test to ensure that a Thumb-2 BL works with an offset that is
@ not permissable for Thumb-1. @ not permissable for Thumb-1.
.arch armv7
.global _start .global _start
.syntax unified .syntax unified