From: Julian Brown Date: Wed, 28 Nov 2012 16:53:01 +0000 (+0000) Subject: gas/ X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d406f3e430b5a156b943895791f2d081e78c8194;p=binutils-gdb.git gas/ * config/tc-arm.c (md_apply_fix): Fix conversion of BL to BLX for local targets in Thumb mode. gas/testsuite/ * gas/arm/bl-local-2.s: New test. * gas/arm/bl-local-2.d: New. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index a56c7d62eed..a419017d0d8 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2012-11-28 Julian Brown + + * config/tc-arm.c (md_apply_fix): Fix conversion of BL to BLX for + local targets in Thumb mode. + 2012-11-23 Alan Modra * config/tc-ppc.c (sticky): New var. diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 4cd27451048..2841abb9ab5 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -22040,18 +22040,18 @@ md_apply_fix (fixS * fixP, thumb_bl_common: -#ifdef OBJ_ELF - if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4 - && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX) - fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23; -#endif - if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX) /* For a BLX instruction, make sure that the relocation is rounded up to a word boundary. This follows the semantics of the instruction which specifies that bit 1 of the target address will come from bit 1 of the base address. */ - value = (value + 1) & ~ 1; + value = (value + 3) & ~ 3; + +#ifdef OBJ_ELF + if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4 + && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX) + fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23; +#endif if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff)) { diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 17374f5846b..d95504eda7c 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-11-28 Julian Brown + + * gas/arm/bl-local-2.s: New test. + * gas/arm/bl-local-2.d: New. + 2012-11-27 Roland McGrath * lib/gas-defs.exp (run_dump_test): If as options include diff --git a/gas/testsuite/gas/arm/bl-local-2.d b/gas/testsuite/gas/arm/bl-local-2.d new file mode 100644 index 00000000000..da7a49b63c1 --- /dev/null +++ b/gas/testsuite/gas/arm/bl-local-2.d @@ -0,0 +1,21 @@ +#name: bl local conversion to blx +#objdump: -drw --prefix-addresses --show-raw-insn +#as: + + +.*: file format .* + + +Disassembly of section \.text: +0+00 <[^>]+> e12fff1e bx lr +0+04 <[^>]+> 46c0 nop ; \(mov r8, r8\) +0+06 <[^>]+> f7ff effc blx 0+ +0+0a <[^>]+> 46c0 nop ; \(mov r8, r8\) +0+0c <[^>]+> f7ff eff8 blx 0+ +0+10 <[^>]+> 46c0 nop ; \(mov r8, r8\) +0+12 <[^>]+> f7ff eff6 blx 0+ +0+16 <[^>]+> 46c0 nop ; \(mov r8, r8\) +0+18 <[^>]+> f7ff eff2 blx 0+ +0+1c <[^>]+> 4770 bx lr +0+1e <[^>]+> 46c0 nop ; \(mov r8, r8\) +0+20 <[^>]+> fafffffd blx 0000001c diff --git a/gas/testsuite/gas/arm/bl-local-2.s b/gas/testsuite/gas/arm/bl-local-2.s new file mode 100644 index 00000000000..d79c5ed4715 --- /dev/null +++ b/gas/testsuite/gas/arm/bl-local-2.s @@ -0,0 +1,41 @@ + .arch armv5te + + .text + .align 2 + .code 32 + .type myfunction, %function +myfunction: + bx r14 + + .text + .align 2 + .code 16 + .thumb_func + .global caller + .type caller, %function +caller: + nop + bl myfunction + nop + bl myfunction + nop + bl myfunction + nop + bl myfunction + + .text + .align 2 + .code 16 + .type mythumbfunction, %function + .thumb_func +mythumbfunction: + bx r14 + + .text + .align 2 + .code 32 + .global armcaller + .type armcaller, %function +armcaller: + bl mythumbfunction +