从以下代码开始
void lib_memset( unsigned char *dest, unsigned char c, unsigned int n)
{
while(n--)
{
*dest=c;
dest++;
}
}
使用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
当使用优化器时,它会检测并用真正的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可以做到这一点,但事实并非如此。
我曾经认为我已经解决了这个问题,但现在找不到如何解决它了。我需要优化器,我不想出现实现库和需要库之间的循环依赖问题等。可以使用汇编来避免编译器的干扰,但其实并不应该这样做。
-ffreestanding
是什么意思?同样的问题? - artless noise