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

jls*_*ker 18 c++ llvm clang

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

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

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

那么,我要求一些可能的东西,还是我必须依靠替代​​方案?

编辑:(当然这是可能的.它发生在clang源代码的某个地方,我找不到它.)

jls*_*ker 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));
Run Code Online (Sandbox Code Playgroud)

(因为visualstudio::Link::ConstructJob它反而调用link.exe.)

编辑:回想起来,通过跟踪(Mac)或(Linux)clang的系统调用来查找它会更快.dtrussstrace

编辑:我最终使用Clang驱动程序API进行构建和链接.我写了一些示例代码.