gas/
authorJulian Brown <julian@codesourcery.com>
Wed, 28 Nov 2012 16:53:01 +0000 (16:53 +0000)
committerJulian Brown <julian@codesourcery.com>
Wed, 28 Nov 2012 16:53:01 +0000 (16:53 +0000)
    * 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.

gas/ChangeLog
gas/config/tc-arm.c
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/bl-local-2.d [new file with mode: 0644]
gas/testsuite/gas/arm/bl-local-2.s [new file with mode: 0644]

index a56c7d6..a419017 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-28  Julian Brown  <julian@codesourcery.com>
+
+       * config/tc-arm.c (md_apply_fix): Fix conversion of BL to BLX for
+       local targets in Thumb mode.
+
 2012-11-23  Alan Modra  <amodra@gmail.com>
 
        * config/tc-ppc.c (sticky): New var.
index 4cd2745..2841abb 100644 (file)
@@ -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))
        {
index 17374f5..d95504e 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-28  Julian Brown  <julian@codesourcery.com>
+
+       * gas/arm/bl-local-2.s: New test.
+       * gas/arm/bl-local-2.d: New.
+
 2012-11-27  Roland McGrath  <mcgrathr@google.com>
 
        * 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 (file)
index 0000000..da7a49b
--- /dev/null
@@ -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+ <myfunction>
+0+0a <[^>]+> 46c0              nop                     ; \(mov r8, r8\)
+0+0c <[^>]+> f7ff eff8         blx     0+ <myfunction>
+0+10 <[^>]+> 46c0              nop                     ; \(mov r8, r8\)
+0+12 <[^>]+> f7ff eff6         blx     0+ <myfunction>
+0+16 <[^>]+> 46c0              nop                     ; \(mov r8, r8\)
+0+18 <[^>]+> f7ff eff2         blx     0+ <myfunction>
+0+1c <[^>]+> 4770              bx      lr
+0+1e <[^>]+> 46c0              nop                     ; \(mov r8, r8\)
+0+20 <[^>]+> fafffffd  blx     0000001c <mythumbfunction>
diff --git a/gas/testsuite/gas/arm/bl-local-2.s b/gas/testsuite/gas/arm/bl-local-2.s
new file mode 100644 (file)
index 0000000..d79c5ed
--- /dev/null
@@ -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
+