2014-01-23 47 views
5

优化使用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中执行,使编译器脱离循环,但不应该这样做。

+0

'-freestanding'? [同样的问题?](http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-May/050112.html) –

+0

nope,没有解决它。 –

+1

DOH!在opt步骤中需要-disable-simplify-libcalls,而不是像llc那样修复它。 –

回答

8
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的--help选项和选择,并找到了-disable-simpilfy-的libcall是既选择和LLC的选项,将其添加到选择修复问题。

lib_memset: 
    cmp r2, #0 
    bxeq lr 
.LBB0_1: 
    strb r1, [r0], #1 
    subs r2, r2, #1 
    bne .LBB0_1 
    bx lr 

我不喜欢回答我的问题,可以在这里坐了一点,所以我也许可以找到答案在下一次或者如果SO神决定在这里是罚款离开它...

+2

回答你自己的问题就好。有两天的时间可以接受,所以其他人也有机会回复。你一定要把它留在这里,以防别人将来遇到同样的问题。 – Lundin

1

我遇到了同样的问题,如果它仍然可以帮助任何人,这是我做了什么来解决它 - 我修改了llvm源代码中的LoopIdiomRecognize.cpp文件: 有一个代码用于检查函数的名称是memset还是memcpy它取消了优化,所以我将它改为:

StringRef Name = L->getHeader()->getParent()->getName(); 
    if (Name == "memset" || Name == "memcpy") 

StringRef Name = L->getHeader()->getParent()->getName(); 
    if (Name.endswith("memset") || Name == "memcpy")