【问题标题】:How to generate an executable from an llvm::Module?如何从 llvm::Module 生成可执行文件?
【发布时间】:2012-07-24 08:16:46
【问题描述】:

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

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

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

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

编辑:(当然这是可能的。它发生在clang源代码中的某处,我就是找不到。)

【问题讨论】:

  • 来自llc 的一些复制粘贴可能会完成这项工作。
  • 我不这么认为。 llc 可以生成.o 文件但不能生成可执行文件。

标签: c++ llvm clang


【解决方案1】:

llvm-ld 在传递 -native 标志时执行您需要的操作。

llvm-ld 已在 LLVM 3.1 中删除,但 clang 驱动程序 should be able to replace its function。你可以从那里开始。

【讨论】:

  • 是的,但不幸的是 llvm-ld 通过调用 gcc 来完成此操作。
  • llvm-ld 已在 LLVM 3.1 中被删除,他们建议直接使用 clang 代替代码生成/链接位码文件到可执行文件中(参见 llvm.org/releases/3.1/docs/ReleaseNotes.html#tools_changes
  • 回复:您的编辑——正如我在问题中所说,我搜索了 clang 驱动程序代码。我找到了将 .bc 文件转换为可执行文件的代码,但我正在寻找可以将内存模块转换为可执行文件的代码。
【解决方案2】:

不可能! 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 (Mac) 或strace (Linux) 跟踪clang 的系统调用会更快找到这一点。

编辑:我最终使用 Clang 驱动程序 API 来构建和链接。我写了一些example code

【讨论】:

  • clang 调用 ld on... 什么?目标文件?如何生成目标文件?
  • @andrewrk 可能有点晚了,但是 LLVM 可以创建一个目标文件。
猜你喜欢
  • 1970-01-01
  • 2018-02-09
  • 2015-09-11
  • 1970-01-01
  • 2011-04-05
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多