* b[l]x instruction in cortex-m3 code
@ 2011-07-18 21:50 Daniel Otte
2011-07-19 3:59 ` Daniel Jacobowitz
0 siblings, 1 reply; 5+ messages in thread
From: Daniel Otte @ 2011-07-18 21:50 UTC (permalink / raw)
To: binutils
[-- Attachment #1: Type: text/plain, Size: 470 bytes --]
Hi,
when I link code for the ARM Cortex-M3 the b[l]x instruction is emitted.
Since Cortex-M3 has no ARM mode and no b[l]x instruction the CPU goes in a fault
mode when it is asked to execute it.
As far as I have read it is ok for the compiler to emit b[l]x but the linker is
required to translate it into b[l] instructions.
I tried a lot of linker flags with no success.
Are I'm missing something or is this really a bug?
Best regards,
Daniel Otte
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: b[l]x instruction in cortex-m3 code
2011-07-18 21:50 b[l]x instruction in cortex-m3 code Daniel Otte
@ 2011-07-19 3:59 ` Daniel Jacobowitz
2011-07-19 10:45 ` Daniel Otte
0 siblings, 1 reply; 5+ messages in thread
From: Daniel Jacobowitz @ 2011-07-19 3:59 UTC (permalink / raw)
To: Daniel Otte; +Cc: binutils
On Mon, Jul 18, 2011 at 4:03 PM, Daniel Otte <daniel.otte@rub.de> wrote:
> Hi,
> when I link code for the ARM Cortex-M3 the b[l]x instruction is emitted.
> Since Cortex-M3 has no ARM mode and no b[l]x instruction the CPU goes in a fault
> mode when it is asked to execute it.
>
> As far as I have read it is ok for the compiler to emit b[l]x but the linker is
> required to translate it into b[l] instructions.
>
> I tried a lot of linker flags with no success.
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.
--
Thanks,
Daniel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: b[l]x instruction in cortex-m3 code
2011-07-19 3:59 ` Daniel Jacobowitz
@ 2011-07-19 10:45 ` Daniel Otte
2011-07-20 2:06 ` Dave Martin
2011-07-20 6:19 ` Daniel Jacobowitz
0 siblings, 2 replies; 5+ messages in thread
From: Daniel Otte @ 2011-07-19 10:45 UTC (permalink / raw)
To: binutils
[-- Attachment #1: Type: text/plain, Size: 1885 bytes --]
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
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: b[l]x instruction in cortex-m3 code
2011-07-19 10:45 ` Daniel Otte
@ 2011-07-20 2:06 ` Dave Martin
2011-07-20 6:19 ` Daniel Jacobowitz
1 sibling, 0 replies; 5+ messages in thread
From: Dave Martin @ 2011-07-20 2:06 UTC (permalink / raw)
To: Daniel Otte; +Cc: binutils
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: b[l]x instruction in cortex-m3 code
2011-07-19 10:45 ` Daniel Otte
2011-07-20 2:06 ` Dave Martin
@ 2011-07-20 6:19 ` Daniel Jacobowitz
1 sibling, 0 replies; 5+ messages in thread
From: Daniel Jacobowitz @ 2011-07-20 6:19 UTC (permalink / raw)
To: Daniel Otte; +Cc: binutils
(Without HTML this time)
On Mon, Jul 18, 2011 at 5:49 PM, Daniel Otte <daniel.otte@rub.de> wrote:
> That was also my first thought, but it happens also with calls in the same file.
No, this is something else.
> 1d2: f240 13b1 movw r3, #433 ; 0x1b1
> 1d6: f2c0 0300 movt r3, #0
Notice the low bit set here.
> 1e2: 4798 blx r3
Both bx reg and blx reg use mode based on the reg's low bit; they are
perfectly fine on Cortex-M. But if you give them an invalid argument,
they'll fault.
--
Thanks,
Daniel
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-07-19 14:56 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-18 21:50 b[l]x instruction in cortex-m3 code Daniel Otte
2011-07-19 3:59 ` Daniel Jacobowitz
2011-07-19 10:45 ` Daniel Otte
2011-07-20 2:06 ` Dave Martin
2011-07-20 6:19 ` Daniel Jacobowitz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).