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

时间:2012-07-25 19:51:41

标签: c++ llvm clang

我想编写一个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源代码中发生某处,我找不到它。)

2 个答案:

答案 0 :(得分:14)

不可能! 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。)

修改:回想起来,通过使用clang(Mac)或dtruss跟踪strace的系统调用,可以更快地找到它。 (Linux)的。

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

答案 1 :(得分:0)

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

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