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" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="true" } attributes #1 = { optsize "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="true" } attributes #2 = { nounwind readnone } attributes #3 = { nobuiltin nounwind optsize } !llvm.dbg.cu = !{!0} !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"nestlabs-clang version 3.3 (tags/RELEASE_33/final) (based on LLVM 3.3)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/a.c] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"a.c", metadata !"/tmp"} !2 = metadata !{i32 0} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"out_char", metadata !"out_char", metadata !"out_char(char)", i32 6, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (i8)* @out_char(char), null, null, metadata !9, i32 7} ; [ DW_TAG_subprogram ] [line 6] [def] [scope 7] [out_char] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/a.c] !6 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !7 = metadata !{null, metadata !8} !8 = metadata !{i32 786468, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 8} ; [ DW_TAG_base_type ] [char] [line 0, size 8, align 8, offset 0, enc DW_ATE_unsigned_char] !9 = metadata !{metadata !10} !10 = metadata !{i32 786689, metadata !4, metadata !"ch", metadata !5, i32 16777222, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [ch] [line 6] !11 = metadata !{i32 6, i32 0, metadata !4, null} !12 = metadata !{i32 8, i32 0, metadata !4, null} !13 = metadata !{i32 9, i32 0, metadata !4, null} Thanks Andrea. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131014/21cdad61/attachment.html>