optimization - llvm 使用库函数进行优化

标签 optimization assembly embedded arm bare-metal

从这样的代码开始

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 中执行它以使编译器退出循环,但不应该这样做。

最佳答案

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

感谢在添加 -ffreestanding 时的简单噪音,我决定重新阅读 llc 和 opt 的所有 --help 选项,并发现 -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

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

关于optimization - llvm 使用库函数进行优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21318229/

相关文章:

mysql - SQL 查询长度的实际限制(特别是 MySQL)

python - libavg 自定义事件处理程序

c - 在 STM32L1 上删除我的闪存

python - 如何检查笛卡尔坐标是否有效构成矩形?

c++ - 如何优化 C++ 类容器的加法运算符?

javascript - 摆脱多余的方法定义

ios - 在 iOS 上将 x86 asm 代码转换为 arm 代码

c - 在运行时重定向一个 c 函数并调用原始函数

macos - 是否有适用于 OS X 的汇编语言调试器?

networking - 嵌入式程序有 CORBA/RPC 的轻量级类似物吗?