c++ - 如何从 llvm::Module 生成可执行文件?

标签 c++ llvm clang

我想编写一个 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::ConstructJobsolaris::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/

相关文章:

c++ - 元函数对缺失特征的默认行为以及如何检测随机访问

macos - 如何在我的新 MacBook Pro(使用 Mac OS Catalina)上安装 openMP?

c++ - Clang (OS X) 在特定的嵌套声明中需要 "template"关键字,而 VS 禁止它

c++ - 在类中使用重载运算符 new

c++ - 使用参数 vector 调用函数

python - numba/npyufunc/omppool.cpp :5:10: fatal error: 'omp.h' file not found

c - 向参数为 0 的函数发送参数时的行为不一致

c++ - 如何强制 clang 使用系统(ubuntu)STL header 而不是 clang 检查语义

c# - NativeWindow 等效项

c++ - llvm ir 回到人类可读的源语言?