如何用clang替换llvm-ld?

Gab*_*ern 9 llvm clang ld

摘要: llvm-ld已从LLVM 3.2版本中删除.我试图弄清楚如何在我的构建系统中使用clang.

请注意,我在编写代码时想出了我自己的问题的答案,但我仍然发布它,以防它对其他人有用.也欢迎其他答案.

细节:

我有一个构建过程,首先使用生成bitcode clang++ -emit-llvm.然后我拿bitcode文件并将它们链接在一起llvm-link.然后我应用一些标准的优化传递opt.然后我应用另一个自定义编译器传递opt.然后我再次使用opt第三次标准优化通道.最后,我从最后一次运行中获取输出,opt并使用llvm-link与适当的库链接来生成我的可执行文件.当我尝试在此过程中替换llvm-linkclang++,我收到错误消息: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;
}
Run Code Online (Sandbox Code Playgroud)

测试2.cpp

int getNum()
{
  return 5;
}
Run Code Online (Sandbox Code Playgroud)

我执行了以下命令序列:

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
Run Code Online (Sandbox Code Playgroud)

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

如果我跑:

llvm-ld test.bc2 -o a.out -native
Run Code Online (Sandbox Code Playgroud)

一切都很好,a.out打印出5.

但是,如果我跑:

clang++ test.bc2 -o a.out
Run Code Online (Sandbox Code Playgroud)

然后我收到错误消息:

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

显然我知道我可以通过直接在.cpp文件上运行clang来生成可执行文件.但我不知道整合的最佳方式是什么clangopt的.

Gab*_*ern 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
Run Code Online (Sandbox Code Playgroud)

这会生成一个工作a.out文件。

似乎llc需要从位码转换为机器代码,然后可以clang像平常一样进行处理。