b[l]x instruction in cortex-m3 code

Dave Martin dave.martin@linaro.org
Wed Jul 20 02:06:00 GMT 2011


On Mon, Jul 18, 2011 at 10:49 PM, Daniel Otte <daniel.otte@rub.de> wrote:
> Hi
>
>> Typically this means you are calling a function that is not correctly
>> marked as Thumb code, so the linker is helpfully switching you back to
>> ARM mode; check the target symbol.
>>
> That was also my first thought, but it happens also with calls in the same file.
> So the code:
>
> ------------------------------------------------------------
>
> typedef void(*fpt)(int);
>
> void func(int a){
>        a = a*a;
> }
>
> int main(void){
>        fpt p;
>        p = func;
>        p(3);
>        for(;;)
>                ;
>        return 0;
> }
>
> ------------------------------------------------------------
>
> compiles to:
>
> ------------------------------------------------------------
>
> 000001b0 <func>:
>  1b0:   b480            push    {r7}
>  1b2:   b083            sub     sp, #12
>  1b4:   af00            add     r7, sp, #0
>  1b6:   6078            str     r0, [r7, #4]
>  1b8:   687b            ldr     r3, [r7, #4]
>  1ba:   687a            ldr     r2, [r7, #4]
>  1bc:   fb02 f303       mul.w   r3, r2, r3
>  1c0:   607b            str     r3, [r7, #4]
>  1c2:   f107 070c       add.w   r7, r7, #12
>  1c6:   46bd            mov     sp, r7
>  1c8:   bc80            pop     {r7}
>  1ca:   4770            bx      lr
>
> 000001cc <main>:
>  1cc:   b580            push    {r7, lr}
>  1ce:   b082            sub     sp, #8
>  1d0:   af00            add     r7, sp, #0
>  1d2:   f240 13b1       movw    r3, #433        ; 0x1b1
>  1d6:   f2c0 0300       movt    r3, #0
>  1da:   607b            str     r3, [r7, #4]
>  1dc:   687b            ldr     r3, [r7, #4]
>  1de:   f04f 0003       mov.w   r0, #3
>  1e2:   4798            blx     r3
>  1e4:   e7fe            b.n     1e4 <main+0x18>
>  1e6:   bf00            nop
>
> ------------------------------------------------------------
>
> I especially took a look at the implementation of the function pointer call.
> But also the normal funtion returns with a bx.
>
> Best regards,
>  Daniel Otte
>
>

Can you retry, passing the -v argument to gcc so that all the
compiler, assembler and linker options are all printed out?

IIUC, blx <label> is not relocatable and shouldn't be emitted by the
compiler unless compiling for a target which supports it.  It should
also never be emitted for a preemptible or unknown destination symbol.
 The linker may translate a relocatable B <label> or BL <label> into
BX <label> or BLX <label> (or may insert a veneer which does this) at
link time if some functions are mis-annotated as ARM when they should
be Thumb.

blx <Rm> _is_ the preferred way to do all indirect function calls, at
least on ARMv7-[AR], but I'm not so familiar with the M profile.  I
would be surprised if bx <Rm> and blx <Rm> are not supported by the M
profile, but blx <label> makes no sense on that architecture and is
unlikely to be supported.  I could be wrong though -- I don't have the
documentation in front of me right now.

Cheers
---Dave



More information about the Binutils mailing list