gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:04:44 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com