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:
parent
2424f30373
commit
f4ac848464
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>:
|
||||
|
|
|
@ -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>:
|
||||
|
|
Loading…
Reference in New Issue