[LLVMdev] Linking libc statically to program and optimizations.

Mikael Lepistö mikael.lepisto at tut.fi
Mon Jul 2 00:52:44 PDT 2007


Hi,

I'll just reply to here if someone else encounters the same
problem.

With llvm-gcc -ffreestanding switch prevents raising the
memset, memcpy etc. function calls to llvm intrinsics.

-mikuli

Mikael Lepistö wrote:
> Hi,
>
> We have been working on porting llvm-gcc crosscompiler (basically I had 
> to create new dummy target configuration with some minimal information 
> about the our processor, endianess, type sizes, etc.) which compiles 
> llvm bytecode (doesn't compile native binaries nor assembler) for our 
> processor architecture and new llvm target for our custom processor. We 
> already managed to compile also newlib to llvm bytecode (archive of 
> bytecode objects packed with llvm-ar) with our crosscompiler.
>
> Right now we use tools like following. We first compile bytecode files 
> with cross-llvm-gcc and also link them together with cross-llvm-gcc 
> command for automatically including precompiled crt0, crtend and libc.a 
> files to fully linked bytecode program. After linking we run various 
> "opt" passes and finally we compile target assembler with llc.
>
> Now we ran into two problems:
>
> 1. When we link libc statically to our program in early phase of the 
> compilation linker automatically selects only those compile units, which 
> contain needed symbols from libc.a archive. So when cross-llvm-gcc 
> encounter malloc calls, they are automatically converted to malloc 
> instructions. So now when libc is linked statically, linker doesn't see 
> any malloc function references, and doesn't include malloc compilation 
> module from libc.a.
>
> Now it's fixed by lowering malloc instructions of program  directly 
> after each "cross-llvm-gcc -c" command. Other approach to this problem 
> was putting libc.a together with "llvm-ld -r" command instead of 
> llvm-ar... This way whole libc is always included to optimization stage 
> and  calling lowerallocs pass before dead code elimination passes. 
> Disadvantages is this approach was couple of seconds delay when 
> optimizing program and a bit larger binary (reasons for larger binary I 
> haven't investigated yet).
>
> 2. Memset, memcpy are replaced, with llvm intrinsics and because of that 
> implementations of those libc functions are optimized away before llc phase.
>
> I would like to have some comments especially how the lowering allocs in 
> early stage (1. problem) in the tce-llvm-gcc effects on optimization of 
> code and if there is way to lower also memcpy and memset intrinsics in 
> optimization phase  for preventing elimination of implementation of 
> these functions. Also all the other comments are more than welcome.
>
> -mikuli
>
> _______________________________________________
> 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