【发布时间】:2014-02-14 14:16:16
【问题描述】:
从这样的代码开始
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 会这样做,但事实并非如此。
我以为我之前已经解决了这个问题,但不知道该怎么做。我需要优化器,我不希望这种实现库的循环依赖问题以及它需要库等。可以在 asm 中执行以使编译器脱离循环,但不应该这样做。
【问题讨论】:
-
-ffreestanding? same problem? -
卫生署!在 opt 步骤中需要 -disable-simplify-libcalls 而不是或与 llc 一样...修复它。
标签: optimization assembly embedded arm bare-metal