我想使用clang++ -S -emit-llvm test.cpp -o test.ir
调用解析使用parseIRFile
创建的IR文件,稍微操作此IR,然后将IR写回文件。
我已尝试使用WriteBitcodeToFile
调用,但这不会按预期工作。
如何将模块写回IR,然后编译并运行修改后的IR?
#include <llvm/IR/Module.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/Bitcode/ReaderWriter.h>
#include <llvm/Support/FileSystem.h>
using namespace llvm;
int main()
{
LLVMContext context;
SMDiagnostic error;
std::unique_ptr<Module> m = parseIRFile("test.ir", error, context);
std::error_code EC;
llvm::raw_fd_ostream OS("module", EC, llvm::sys::fs::F_None);
WriteBitcodeToFile(m.get(), OS);
OS.flush();
return 0;
}
答案 0 :(得分:2)
一种简单的方法是使用以下方法将模块转储到stdout:
m->dump();
然后,您可以将C ++程序的输出重定向到文本文件,并使用 llc 进行编译:
llc < sample_module.ll > sample_module.s
您还可以使用打印功能:
void print (raw_ostream &OS, AssemblyAnnotationWriter *AAW, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
答案 1 :(得分:1)
IR不是人类可读的。您可以使用llvm-dis
将其转换为人类可读的版本,如@TartanLlama所说。您可以使用lli
命令运行bitcode。修改IR后,您会看到修改后的IR与lli
一起运行。
答案 2 :(得分:1)
你需要的是编写一个LLVM传递,它允许你通过模块按功能/模块执行代码功能并读取/修改/写入它。您可以使用opt
命令在字节码文件上运行此传递,它将返回您可以使用的修改后的字节码文件。
以下是撰写传递的一些来源: