我想编写一个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进行构建和链接.我写了一些示例代码.