优化使用LLVM为交叉编译器LLVM与库函数
clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -c lib_memset.c -o lib_memset.bc
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi lib_memset.bc -o lib_memset.opt.bc
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.opt.bc -o lib_memset.opt.s
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.bc -o lib_memset.s
与代码开始这样
void lib_memset(unsigned char *dest, unsigned char c, unsigned int n)
{
while(n--)
{
*dest=c;
dest++;
}
}
和它检测并用于优化时与真实memset的替换它
lib_memset:
push {r11, lr}
mov r3, r1
mov r11, sp
cmp r2, #0
beq .LBB0_2
mov r1, r2
mov r2, r3
bl __aeabi_memset
.LBB0_2: @ %while.end
pop {r11, pc}
但实现它没有。
我不想让它编译我给它的代码,而不是使用库调用。我认为-disable-simplify-libcalls会做,但事实并非如此。
我以为我曾经想到过,但无法找到如何去做。我需要优化器,我不希望实现这个库的循环依赖问题,它需要库等。可以在asm中执行,使编译器脱离循环,但不应该这样做。
'-freestanding'? [同样的问题?](http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-May/050112.html) –
nope,没有解决它。 –
DOH!在opt步骤中需要-disable-simplify-libcalls,而不是像llc那样修复它。 –