【问题标题】:How to replace llvm-ld with clang?如何用clang替换llvm-ld?
【发布时间】:2013-01-13 18:58:48
【问题描述】:

总结: llvm-ld 已从 LLVM 3.2 release 中删除。我正在尝试弄清楚如何在我的构建系统中使用 clang。

请注意,我在编写问题时找到了自己问题的答案,但我仍在发布它以防它对其他人有用。也欢迎其他答案。

详情

我有一个构建过程,它首先使用clang++ -emit-llvm 生成位码。然后我获取位码文件并将它们与llvm-link 链接在一起。然后我使用opt 应用一些标准优化通道。然后我使用opt 应用另一个自定义编译器传递。然后我第三次使用opt 再次应用标准优化通道。最后,我从上次运行的opt 中获取输出,并使用llvm-link 与适当的库链接以生成我的可执行文件。当我尝试在此过程中将 llvm-link 替换为 clang++ 时,我收到错误消息:file not recognized: File format not recognized

为了使这个问题更具体,我创建了一个简化示例来说明我正在尝试做的事情。首先,我要编译并链接两个文件

test1.cpp:

#include <stdio.h>

int getNum();

int main()
{
  int value = getNum();
  printf("value is %d\n", value);
  return 0;
}

test2.cpp

int getNum()
{
  return 5;
}

我执行了以下命令序列:

clang++ -emit-llvm -c test1.cpp test2.cpp
llvm-link -o test.bc1 test1.o test2.o 
opt test.bc1 -o test.bc2 -std-compile-opts

(请注意,我目前正在运行 llvm 3.1,但我正在尝试找出适用于 llvm 3.2 的步骤。我假设我应该能够使用 clang 使 LLVM 3.1 版本正常工作而不是 llvm-ld)

如果我运行:

llvm-ld test.bc2 -o a.out -native

一切正常,a.out 打印出 5。

但是,如果我运行:

clang++ test.bc2 -o a.out

然后我收到错误消息:

test.bc2: file not recognized: File format not recognized clang-3:
error: linker command failed with exit code 1 (use -v to see invocation)

显然我知道我可以通过直接在 .cpp 文件上运行 clang 来生成一个可执行文件。但我想知道将clangopt 集成的最佳方式是什么。

【问题讨论】:

    标签: llvm clang ld


    【解决方案1】:

    问题中描述的测试用例可以使用以下步骤编译:

    clang++ -emit-llvm -c test1.cpp test2.cpp
    llvm-link -o test.bc1 test1.o test2.o 
    opt test.bc1 -o test.bc2 -std-compile-opts
    
    llc -filetype=obj test.bc2 -o test.o
    clang++ test.o
    

    这会产生一个有效的a.out 文件。

    似乎需要llc 将位码转换为机器码,然后clang 可以正常处理。

    【讨论】:

      【解决方案2】:

      总的来说,我发现

      llvm-ld x.bc y.bc
      

      可以替换为

      llc x.bc
      llc y.bc
      clang x.s y.s
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2017-03-05
        • 2020-01-19
        • 2011-08-13
        • 1970-01-01
        相关资源
        最近更新 更多