This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: b[l]x instruction in cortex-m3 code


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]