2008-06-03 Christophe Lyon <christophe.lyon@st.com>

bfd/
	* elf32-arm.c (arm_stub_is_thumb): Define.
	(elf32_arm_final_link_relocate): Handle near mode switching stubs.

	ld/testsuite/
	* ld-arm/farcall-thumb-thumb-m.d: Fix branch type.
	* ld-arm/farcall-thumb-arm.d: Likewise.
This commit is contained in:
Daniel Jacobowitz 2008-06-09 14:53:13 +00:00
parent 2424f30373
commit f4ac848464
5 changed files with 39 additions and 5 deletions

View File

@ -1,3 +1,8 @@
2008-06-09 Christophe Lyon <christophe.lyon@st.com>
* elf32-arm.c (arm_stub_is_thumb): Define.
(elf32_arm_final_link_relocate): Handle near mode switching stubs.
2008-06-07 Alan Modra <amodra@bigpond.net.au>
* elf32-spu.c (spu_elf_auto_overlay): Add valid area below sp

View File

@ -2713,6 +2713,23 @@ using_thumb2 (struct elf32_arm_link_hash_table *globals)
return arch == TAG_CPU_ARCH_V6T2 || arch >= TAG_CPU_ARCH_V7;
}
static bfd_boolean
arm_stub_is_thumb (enum elf32_arm_stub_type stub_type)
{
switch (stub_type)
{
case arm_thumb_thumb_stub_long_branch:
case arm_thumb_arm_v4t_stub_long_branch:
return TRUE;
case arm_stub_none:
BFD_FAIL ();
return FALSE;
break;
default:
return FALSE;
}
}
/* Determine the type of stub needed, if any, for a call. */
static enum elf32_arm_stub_type
@ -6426,7 +6443,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
||
(thumb2
&& (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
|| (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET))))
|| (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
|| ((sym_flags != STT_ARM_TFUNC) && !globals->use_blx))
{
/* The target is out of reach or we are changing modes, so
redirect the branch to the local stub for this
@ -6439,8 +6457,14 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
+ stub_entry->stub_sec->output_offset
+ stub_entry->stub_sec->output_section->vma);
/* This call becomes a call to Arm for sure. Force BLX. */
lower_insn = (lower_insn & ~0x1000) | 0x0800;
/* If this call becomes a call to Arm, force BLX. */
if (globals->use_blx)
{
if ((stub_entry
&& !arm_stub_is_thumb (stub_entry->stub_type))
|| (sym_flags != STT_ARM_TFUNC))
lower_insn = (lower_insn & ~0x1000) | 0x0800;
}
}
}

View File

@ -1,3 +1,8 @@
2008-06-09 Christophe Lyon <christophe.lyon@st.com>
* ld-arm/farcall-thumb-thumb-m.d: Fix branch type.
* ld-arm/farcall-thumb-arm.d: Likewise.
2008-05-31 Nick Clifton <nickc@redhat.com>
PR ld/6430

View File

@ -12,7 +12,7 @@ Disassembly of section .text:
...
00001018 <_start>:
1018: f7ff eff2 blx 1000 <_start-0x18>
1018: f7ff fff2 bl 1000 <_start-0x18>
Disassembly of section .foo:
02001014 <bar>:

View File

@ -12,7 +12,7 @@ Disassembly of section .text:
100c: 02001015 .word 0x02001015
00001010 <_start>:
1010: f7ff eff6 blx 1000 <_start-0x10>
1010: f7ff fff6 bl 1000 <_start-0x10>
Disassembly of section .foo:
02001014 <bar>: