clang-3.8和compiler-rt vs libgcc

时间:2016-07-26 18:39:00

标签: clang llvm llvm-clang llvm-ir

我一直在使用clang-3.5来愉快地构建musl libc的bitcode版本 使用结果生成漂亮的独立可执行文件。

最近对clang-3.8的尝试并不那么开心。看起来 bitcode clang-3.8生成

中定义的使用函数
compiler-rt/lib/builtins

我发现污染bitcode的函数的典型示例是mulxc3mulsc3muldc3。如果我对这是什么有任何明确的想法,我可以通过链接libgcc,甚至是llvm替代方案来解决这个问题。虽然我宁愿首先防止问题发生。

我已经看到像rtlib=compiler-rt等标志的提及,但是在这个主题上找到了很少的文档。

所以这里有一些简单的问题。

  1. 是否可以阻止clang使用compiler-rt/lib/builtins 在发射的bitcode?或者如果不是

  2. llvm是否会生成我可以使用的libgcc版本。其实我会的 可能会构建一个bitcode版本,但除此之外。

  3. 喜欢听到有关此事的指导。

    已于2016年12月8日添加:所以我将通过特定的工作流程说明我的问题 人们可以复制,如果他们愿意,或者更有可能只是指出我在哪里愚蠢。

    首先退房:

    musllv

    并按照README中的说明编译(这里我在ubuntu 14.04上使用clang-3.8)

    WLLVM_CONFIGURE_ONLY=1  CC=wllvm ./configure --target=LLVM --build=LLVM 
    make
    cd lib
    extract-bc -b libc.a
    

    您还需要一个简单可执行文件的bitcode。我将在这里使用nweb.c。

     wllvm nweb.c -o nweb
     extract-bc nweb
    

    现在我们可以做以下事情:

    clang -static -nostdlib nweb.bc libc.a.bc crt1.o libc.a -o nweb
    

    对于clang-3.5,此工作流程顺利进行,但对于clang-3.8,我们得到:

    clang -static -nostdlib nweb.bc libc.a.bc crt1.o libc.a -o nweb
    /tmp/libc-f734a3.o: In function `cpowl':
    libc.a.bc:(.text+0xbb9a): undefined reference to `__mulxc3'
    /tmp/libc-f734a3.o: In function `cpowf':
    libc.a.bc:(.text+0x38f7d): undefined reference to `__mulsc3'
    /tmp/libc-f734a3.o: In function `csqrt':
    libc.a.bc:(.text+0x78fc3): undefined reference to `__muldc3'
    /tmp/libc-f734a3.o: In function `cpow':
    libc.a.bc:(.text+0xafafc): undefined reference to `__muldc3'
    clang-3.8: error: linker command failed with exit code 1 (use -v to seeinvocation)
    

    因为@ paul-brannan指出我们可以尝试

    clang -static -nostdlib --rtlib=compiler-rt nweb.bc libc.a.bc crt1.o libc.a -o nweb
    

    但这可能是我愚蠢的地方,因为我得到了:

    clang-3.8: warning: argument unused during compilation: '--rtlib=compiler-rt'
    

    无论我是否将其用作链接或编译标记。

1 个答案:

答案 0 :(得分:0)

好的,所以我终于在这方面取得了进展。我使用llvm-3.8.1compiler-rtwllvm项目一起构建了wllvm++

其中一个构建产品是libclang_rt.builtins-x86_64.a, 从这个档案中我能够提取bitcode模块

libclang_rt.builtins-x86_64.bc

使用命令: extract-bc -b libclang_rt.builtins-x86_64.a 这个bitcode模块定义了那些讨厌的instrinsics __mulxc3__mulsc3__muldc3

哈利路亚!