19

我想编写一个 C++ 函数,它接受一个llvm::Module已经链接的 ,并将其输出到一个可执行文件。它应该使用 llvm/clang API,而不是分叉一个进程并调用命令行 clang。

查看 llvm/clang 源代码后,我发现最接近的是将 a 输出Module到 .o 文件。例如,llc 工具 (tools/llc/llc.cpp) 通过调用TargetMachine::addPassesToEmitFile(...).

另一种方法是将Module.bc 文件写入,然后创建一个CompilerInstance并调用ExecuteCompilerInvocation(如在 tools/clang/tools/driver/cc1_main.cpp 中)。但是还有文件 I/O 的开销。

那么,我是在要求一些可能的东西,还是我必须求助于替代方案?

编辑:(当然这是可能的。它发生在clang源代码的某个地方,我只是找不到它。)

4

2 回答 2

15

不可能!clang不会创建可执行文件本身。它调用ld.

在 tools/clang/lib/Driver/Tools.cpp 中找到它。在ConstructJob各种平台( 、 等)的函数中darwin::Link::ConstructJobsolaris::Link::ConstructJob它执行以下操作:

const char *Exec =
    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
  C.addCommand(new Command(JA, *this, Exec, CmdArgs));

(对于visualstudio::Link::ConstructJob,它改为调用link.exe。)

编辑:回想起来,通过使用(Mac) 或(Linux)跟踪clang系统调用来发现这一点会更快。dtrussstrace

编辑:我最终使用 Clang 驱动程序 API 进行构建和链接。我写了一些示例代码

于 2012-07-27T17:11:20.510 回答
0

llvm-ld-native通过标志时做你需要的事情。

llvm-ld已在 LLVM 3.1 中删除,但clang驱动程序应该能够替换其功能。你可以从那里开始。

于 2012-07-26T15:44:06.053 回答