我想编写一个 C++ 函数,该函数接受一个已链接的 llvm::Module
,并将其输出到可执行文件。它应该使用 llvm/clang API,而不是 fork 一个进程并调用命令行 clang。
查看 llvm/clang 源代码后,我发现最接近的是将 Module
输出到 .o 文件。例如,llc 工具 (tools/llc/llc.cpp) 通过调用 TargetMachine::addPassesToEmitFile(...)
来完成此操作。
另一种方法是将 Module
写入 .bc 文件,然后创建 CompilerInstance
并调用 ExecuteCompilerInvocation
(如在 tools/铿锵/工具/驱动程序/cc1_main.cpp)。但是还有文件 I/O 的开销。
那么,我是在寻求一些可能的东西,还是必须求助于替代方案?
编辑:(当然这是可能的。它发生在clang源代码中的某处,我就是找不到。)
最佳答案
不可能! clang
不会创建可执行文件本身。它调用 ld
。
在 tools/clang/lib/Driver/Tools.cpp 中找到它。在各种平台的 ConstructJob
函数中(darwin::Link::ConstructJob
、solaris::Link::ConstructJob
等),它这样做:
const char *Exec =
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
(对于 visualstudio::Link::ConstructJob
,它会调用 link.exe
。)
编辑:回想起来,使用 dtruss
跟踪 clang
的系统调用会更快发现这一点(Mac)或 strace
(Linux)。
编辑:我最终使用 Clang 驱动程序 API 进行构建和链接。我写了一些example code .
关于c++ - 如何从 llvm::Module 生成可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11657529/