[LLVMdev] bx instruction getting generated in arm assembly for O1

Jonathan Roelofs jonathan at codesourcery.com
Tue Nov 25 06:29:18 PST 2014



On 11/25/14 12:42 AM, MAYUR PANDEY wrote:
> Hi Jonathan,
>
> The assembly generated in case of clang-3.5 is
>
> indirect_call:
>    .fnstart
> .Leh_func_begin0:
>    ldr r0, .LCPI0_0
>    ldr r1, .LCPI0_1
> .LPC0_0:
>    add r0, pc, r0
>    ldr r0, [r1, r0]
>    ldr r0, [r0]
>    bx r0
>    .align 2
> .LCPI0_0:
>    .long _GLOBAL_OFFSET_TABLE_-(.LPC0_0+8)
> .LCPI0_1:
>    .long indirect_func(GOT)
> .Ltmp0:
>    .size indirect_call, .Ltmp0-indirect_call
> .Leh_func_end0:
>    .fnend
Hmm, never mind. This looks correct. This is tail call optimization, which is 
possible because indirect_call() doesn't have anything in its frame.


Cheers,

Jon
>
> with clang-3.4.2 the assembly generated is:
>
> ndirect_call:
>    push {r11, lr}
>    ldr r0, .LCPI0_0
>    mov r11, sp
>    ldr r1, .LCPI0_1
> .LPC0_0:
>    add r0, pc, r0
>    ldr r0, [r1, r0]
>    ldr r0, [r0]
>    blx r0
>    pop {r11, pc}
>    .align 2
> .LCPI0_0:
>    .long _GLOBAL_OFFSET_TABLE_-(.LPC0_0+8)
> .LCPI0_1:
>    .long indirect_func(GOT)
> .Ltmp0:
>    .size indirect_call, .Ltmp0-indirect_call
>
> Both assemblies are generated with O1 optimization. The assembly generated with
> trunk version of clang is similar to 3.5
>
> Thanks,
>
> Mayur
>

-- 
Jon Roelofs
jonathan at codesourcery.com
CodeSourcery / Mentor Embedded



More information about the llvm-dev mailing list