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

Andrea Mucignat andrea at nestlabs.com
Tue Oct 15 07:59:10 PDT 2013


Umesh,

Makes some sort of sense to me, OTOH:
If instead of choosing r11 as a "dummy" to align the stack we had chosen
some other register in the range r0-r7 then we could have emitted the PUSH
encoding T1 (2 bytes opcode) as opposed to the encoding T2 (which is a 4
bytes opcode).

A


On Tue, Oct 15, 2013 at 2:59 AM, Umesh Kalappa <umesh.kalappa0 at gmail.com>wrote:

> 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
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131015/30a0b9f9/attachment.html>


More information about the llvm-dev mailing list