我想编写一个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源代码中发生某处,我找不到它。)
答案 0 :(得分:14)
不可能! 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
。)
修改:回想起来,通过使用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已删除。你可以从那里开始。