[LLVMdev] Unwanted push/pop on Cortex-M.

Umesh Kalappa umesh.kalappa0 at gmail.com
Tue Oct 15 02:59:29 PDT 2013


Hi Andrea,

That is because the LR is the  fixed register as per the
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf
and out_char() function is not  the leaf function ,Hence compiler
tends to save and restore the  LR  and the save  and restore of
register r11 is to align stack for 8 bytes as per ARM EABI.



Thanks

~Umesh


On Tuesday, October 15, 2013, Umesh Kalappa <umesh.kalappa0 at gmail.com> wrote:
> ---------- Forwarded message ----------
> From: Andrea Mucignat <andrea at nestlabs.com>
> Date: Tue, Oct 15, 2013 at 7:05 AM
> Subject: [LLVMdev] Unwanted push/pop on Cortex-M.
> To: llvmdev at cs.uiuc.edu
>
>
> Hi,
>
> I have this code:
>
> void platform_putchar(int, char);
> void out_char( char ch );
>
> void out_char( char ch )
> {
>     platform_putchar (0, ch);
> }
>
> I'm compiling with the following clang invocation:
>
> $ /usr/local/vendor/toolchains/llvm/3.3/armv7m/bin/armv7m-none-eabi-clang
> -mcpu=cortex-m4 -mfloat-abi=soft -mthumb -nostdinc -ffreestanding
> -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti
> -fomit-frame-pointer -momit-leaf-frame-pointer -nostdinc -v -Os -S -o
> a.s a.c
> vendor-clang version 3.3 (tags/RELEASE_33/final) (based on LLVM 3.3)
> Target: armv7m-none--eabi
> Thread model: posix
>  "/usr/local/vendor-20130805-b8d59d2/toolchains/llvm/3.3/armv7m/bin/armv7m-none-eabi-clang"
> -cc1 -triple thumbv7em-none--eabi -S -disable-free -main-file-name a.c
> -mrelocation-model static -fmath-errno -mconstructor-aliases
> -target-abi aapcs -target-cpu cortex-m4 -msoft-float -mfloat-abi soft
> -target-feature +soft-float -target-feature +soft-float-abi
> -target-feature -neon -target-linker-version 2.22
> -momit-leaf-frame-pointer -v -ffunction-sections -fdata-sections
> -coverage-file /tmp/a.s -nostdsysteminc -nobuiltininc -resource-dir
> /usr/local/vendor-20130805-b8d59d2/toolchains/llvm/3.3/armv7m/bin/../lib/clang/3.3
> -Os -fno-dwarf-directory-asm -fdebug-compilation-dir /tmp
> -ferror-limit 19 -fmessage-length 207 -ffreestanding -mstackrealign
> -fno-rtti -fno-signed-char -fobjc-runtime=gcc
> -fobjc-default-synthesize-properties -fdiagnostics-show-option
> -fcolor-diagnostics -backend-option -vectorize-loops -o a.s -x c a.c
> clang -cc1 version 3.3 based upon LLVM 3.3 default target armv7m-none-eabi
> #include "..." search starts here:
> End of search list.
>
> $ cat a.s
>     .syntax unified
>     .eabi_attribute 6, 10
>     .eabi_attribute 9, 2
>     .eabi_attribute 10, 5
>     .fpu vfpv4
>     .eabi_attribute 20, 1
>     .eabi_attribute 21, 1
>     .eabi_attribute 23, 3
>     .eabi_attribute 24, 1
>     .eabi_attribute 25, 1
>     .eabi_attribute 44, 1
>     .file    "a.c"
>     .section    .text.out_char,"ax",%progbits
>     .globl    out_char
>     .align    2
>     .type    out_char,%function
>     .code    16
>     .thumb_func
> out_char:
>     push.w    {r11, lr}
>     mov    r1, r0
>     movs    r0, #0
>     bl    platform_putchar
>     pop.w    {r11, pc}
> .Ltmp0:
>     .size    out_char, .Ltmp0-out_char
>
> The one question I have is:
> why can't this out_char function be compiled into:
>
> out_char:
>     mov r1, r0
>     mov r0, #0
>     bl platform_putchar
>     bx lr
>
> What's the clang/llvm module responsible for generating the prologue
> and epilogue for this function?
> I looked into CodeGen/PrologEpilogInserter, ARMFrameLowering.cpp
> Thumb1FrameLowering.cpp but it's not 100% clear how the code gen
> decides what the stack frame look like.
>
> Here's the -emit-llvm output
>
> target datalayout =
> "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:32-n32-S64"
> target triple = "thumbv7em-none--eabi"
>
> ; Function Attrs: nounwind optsize
> define void @out_char(char)(i8 zeroext %ch) #0 {
> entry:
>   tail call void @llvm.dbg.value(metadata !{i8 %ch}, i64 0, metadata
> !10), !dbg !11
>   tail call void @platform_putchar(int, char)(i32 0, i8 zeroext %ch)
> #3, !dbg !12
>   ret void, !dbg !13
> }
>
> ; Function Attrs: optsize
> declare void @platform_putchar(int, char)(i32, i8 zeroext) #1
>
> ; Function Attrs: nounwind readnone
> declare void @llvm.dbg.value(metadata, i64, metadata) #2
>
> attributes #0 = { nounwind optsize "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false"
> "n_______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



More information about the llvm-dev mailing list