如何用clang替换llvm-ld?

时间:2013-01-30 02:52:20

标签: llvm clang ld

摘要 llvm-ld已从LLVM 3.2 release中移除。我试图弄清楚如何在我的构建系统中使用clang。

请注意,我在写这篇文章时想出了我自己的问题的答案,但我仍然发布它,以防它对其他人有用。也欢迎其他答案。

详情

我有一个构建过程,首先使用clang++ -emit-llvm生成bitcode。然后我拿出bitcode文件并将它们与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;
}

测试2.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进行整合的最佳方法是什么。

2 个答案:

答案 0 :(得分:4)

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

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文件。

从bitcode转换为机器代码似乎需要llc,然后可以像往常一样由clang处理。

答案 1 :(得分:1)

总的来说,我发现了

llvm-ld x.bc y.bc

可以替换为

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