llvm使用库函数进行优化

old*_*mer 5 embedded optimization assembly arm bare-metal

从这样的代码开始

void lib_memset( unsigned char *dest, unsigned char c, unsigned int n)
{
    while(n--)
    {
        *dest=c;
        dest++;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

当使用优化器时,它会检测并用真实的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}
Run Code Online (Sandbox Code Playgroud)

但没有实现它.

我不希望我想要它编译我给它的目标我给它的代码而不是使用库调用.我认为-disable-simplify-libcalls会这样做,但事实并非如此.

我以为我之前已经想过这个,但是无法知道该怎么做.我需要优化器,我不希望实现库的这个循环依赖问题,它需要库等.可以在asm中执行它以使编译器退出循环,但不应该这样做.

old*_*mer 10

clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -ffreestanding -c lib_memset.c -o lib_memset.bc
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi -disable-simplify-libcalls  lib_memset.bc -o lib_memset.opt.bc
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls -mtriple=arm-none-eabi  lib_memset.opt.bc -o lib_memset.opt.s
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls -mtriple=arm-none-eabi  lib_memset.bc -o lib_memset.s
Run Code Online (Sandbox Code Playgroud)

感谢无意识的噪音,同时添加-ffreestanding,我决定重新阅读所有的--help选项for llc和opt,并发现-disable-simpilfy-libcalls是opt和llc的选项,添加到opt修复了问题.

lib_memset:
    cmp r2, #0
    bxeq    lr
.LBB0_1:
    strb    r1, [r0], #1
    subs    r2, r2, #1
    bne .LBB0_1
    bx  lr
Run Code Online (Sandbox Code Playgroud)

我不喜欢回答我自己的问题,可以坐在这里一点,所以我可以在下次找到答案,或者如果SO众神决定把它留在这里那很好......

  • 回答你自己的问题就好了.在您接受之前有2天的延迟,所以其他人都有公平的机会回复.你应该把它放在这里,万一其他人将来遇到同样的问题. (3认同)