2011-05-31 Paul Brook <paul@codesourcery.com>

bfd/
	* elf32-arm.c (elf32_arm_final_link_relocate): Only do bl conversion
	for known functions.
	(elf32_arm_swap_symbol_in): Only set ST_BRANCH_TO_ARM for function
	symbols.

	include/elf/
	* arm.h (arm_st_branch_type): Add ST_BRANCH_UNKNOWN.

	ld/testsuite/
	* ld-arm/cortex-a8-far.d: Adjust expected output.
	* ld-arm/arm-call1.s: Give function symbol correct type.
	* ld-arm/arm-call2.s: Ditto.
	* ld-arm/farcall-group4.s: Ditto.
	* ld-arm/arm-elf.exp (cortex-a8-far): Define far symbols with correct
	type via assembly file.
	* ld-arm/cortex-a8-far-3.s: New file.
	* ld-arm/abs-call-1.s: Add Thumb tests
This commit is contained in:
Paul Brook 2011-05-31 14:07:58 +00:00
parent 10960bfbce
commit 63e1a0fcba
12 changed files with 62 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2011-05-31 Paul Brook <paul@codesourcery.com>
* elf32-arm.c (elf32_arm_final_link_relocate): Only do bl conversion
for known functions.
(elf32_arm_swap_symbol_in): Only set ST_BRANCH_TO_ARM for function
symbols.
2011-05-31 Paul Brook <paul@codesourcery.com> 2011-05-31 Paul Brook <paul@codesourcery.com>
* elf32-arm.c (arm_stub_is_thumb): Add * elf32-arm.c (arm_stub_is_thumb): Add

View File

@ -8304,7 +8304,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
case, mode switching is performed by the stub. */ case, mode switching is performed by the stub. */
if (branch_type == ST_BRANCH_TO_THUMB && !stub_entry) if (branch_type == ST_BRANCH_TO_THUMB && !stub_entry)
value |= (1 << 28); value |= (1 << 28);
else else if (stub_entry || branch_type != ST_BRANCH_UNKNOWN)
{ {
value &= ~(bfd_vma)(1 << 28); value &= ~(bfd_vma)(1 << 28);
value |= (1 << 24); value |= (1 << 24);
@ -15131,12 +15131,16 @@ elf32_arm_swap_symbol_in (bfd * abfd,
/* New EABI objects mark thumb function symbols by setting the low bit of /* New EABI objects mark thumb function symbols by setting the low bit of
the address. */ the address. */
if ((ELF_ST_TYPE (dst->st_info) == STT_FUNC if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
|| ELF_ST_TYPE (dst->st_info) == STT_GNU_IFUNC) || ELF_ST_TYPE (dst->st_info) == STT_GNU_IFUNC)
&& (dst->st_value & 1))
{ {
dst->st_value &= ~(bfd_vma) 1; if (dst->st_value & 1)
dst->st_target_internal = ST_BRANCH_TO_THUMB; {
dst->st_value &= ~(bfd_vma) 1;
dst->st_target_internal = ST_BRANCH_TO_THUMB;
}
else
dst->st_target_internal = ST_BRANCH_TO_ARM;
} }
else if (ELF_ST_TYPE (dst->st_info) == STT_ARM_TFUNC) else if (ELF_ST_TYPE (dst->st_info) == STT_ARM_TFUNC)
{ {
@ -15146,7 +15150,7 @@ elf32_arm_swap_symbol_in (bfd * abfd,
else if (ELF_ST_TYPE (dst->st_info) == STT_SECTION) else if (ELF_ST_TYPE (dst->st_info) == STT_SECTION)
dst->st_target_internal = ST_BRANCH_LONG; dst->st_target_internal = ST_BRANCH_LONG;
else else
dst->st_target_internal = ST_BRANCH_TO_ARM; dst->st_target_internal = ST_BRANCH_UNKNOWN;
return TRUE; return TRUE;
} }

View File

@ -1,3 +1,7 @@
2011-05-31 Paul Brook <paul@codesourcery.com>
* arm.h (arm_st_branch_type): Add ST_BRANCH_UNKNOWN.
2011-04-15 Sergio Durigan Junior <sergiodj@redhat.com> 2011-04-15 Sergio Durigan Junior <sergiodj@redhat.com>
* common.h (NT_STAPSDT): New define. * common.h (NT_STAPSDT): New define.

View File

@ -328,7 +328,8 @@ enum
enum arm_st_branch_type { enum arm_st_branch_type {
ST_BRANCH_TO_ARM, ST_BRANCH_TO_ARM,
ST_BRANCH_TO_THUMB, ST_BRANCH_TO_THUMB,
ST_BRANCH_LONG ST_BRANCH_LONG,
ST_BRANCH_UNKNOWN
}; };
#define ARM_SYM_BRANCH_TYPE(SYM) \ #define ARM_SYM_BRANCH_TYPE(SYM) \

View File

@ -1,3 +1,14 @@
2011-05-31 Paul Brook <paul@codesourcery.com>
* ld-arm/cortex-a8-far.d: Adjust expected output.
* ld-arm/arm-call1.s: Give function symbol correct type.
* ld-arm/arm-call2.s: Ditto.
* ld-arm/farcall-group4.s: Ditto.
* ld-arm/arm-elf.exp (cortex-a8-far): Define far symbols with correct
type via assembly file.
* ld-arm/cortex-a8-far-3.s: New file.
* ld-arm/abs-call-1.s: Add Thumb tests
2011-05-31 Paul Brook <paul@codesourcery.com> 2011-05-31 Paul Brook <paul@codesourcery.com>
Nathan Sidwell <nathan@codesourcery.com> Nathan Sidwell <nathan@codesourcery.com>

View File

@ -6,4 +6,9 @@ Disassembly of section .text:
00008000 <arm>: 00008000 <arm>:
8000: eb03dffe bl 100000 <foo> 8000: eb03dffe bl 100000 <foo>
8004: ea03dffd b 100000 <foo> 8004: ea03dffd b 100000 <foo>
8008: eb03dffc bl 100000 <foo> 8008: fa03dffc blx 100000 <foo>
800c: eb03dffb bl 100000 <foo>
00008010 <thumb>:
8010: f0f7 fff6 bl 100000 <foo>
8014: f0f7 bff4 b\.w 100000 <foo>
8018: f0f7 eff2 blx 100000 <foo>

View File

@ -4,5 +4,12 @@
arm: bl 0x100000 arm: bl 0x100000
b 0x100000 b 0x100000
blx 0x100000
bl foo bl foo
.syntax unified
.thumb
thumb: bl 0x100000
b 0x100000
blx 0x100000
@ bl foo is broken - gas fails to preserve the symbol reference

View File

@ -2,6 +2,7 @@
.text .text
.arch armv5t .arch armv5t
.global _start .global _start
.type _start, %function
_start: _start:
bl arm bl arm
bl t1 bl t1

View File

@ -4,6 +4,7 @@
.global t1 .global t1
.global t2 .global t2
.global t5 .global t5
.type arm, %function
arm: arm:
bx lr bx lr
.thumb .thumb

View File

@ -276,8 +276,8 @@ set armelftests {
{{objdump -dr cortex-a8-fix-blx-rel-thumb.d}} {{objdump -dr cortex-a8-fix-blx-rel-thumb.d}}
"cortex-a8-fix-blx-rel-thumb"} "cortex-a8-fix-blx-rel-thumb"}
{"Cortex-A8 erratum fix, relocate bl.w and far call" {"Cortex-A8 erratum fix, relocate bl.w and far call"
"-EL -Ttext=0x00 --fix-cortex-a8 --defsym far_fn1=0x80000000 --defsym far_fn2=0x80000004 --defsym far_fn=0x7fff0000 --defsym _start=0" "-EL -Ttext=0x00 --fix-cortex-a8 --defsym _start=0"
"-EL -mcpu=cortex-a8" {cortex-a8-far-1.s cortex-a8-far-2.s} "-EL -mcpu=cortex-a8" {cortex-a8-far-1.s cortex-a8-far-2.s cortex-a8-far-3.s}
{{objdump -dr cortex-a8-far.d}} {{objdump -dr cortex-a8-far.d}}
"cortex-a8-far"} "cortex-a8-far"}
{"Cortex-A8 erratum fix, headers" {"Cortex-A8 erratum fix, headers"

View File

@ -0,0 +1,9 @@
.globl far_fn
.type far_fn, %function
.set far_fn, 0x7fff0000
.globl far_fn1
.type far_fn1, %function
.set far_fn1, 0x80000000
.globl far_fn2
.type far_fn2, %function
.set far_fn2, 0x80000004

View File

@ -8,6 +8,7 @@ myfunc:
bl bar bl bar
.section .far, "xa" .section .far, "xa"
.type bar, %function
.global bar .global bar
bar: bar:
bx lr bx lr