LLVM:如何将 IR 写入文件并运行它

LLVM: How do I write IR to file and run it?

本文关键字:文件 运行 IR LLVM      更新时间:2023-10-16

我想使用 parseIRFile 调用解析用 clang++ -S -emit-llvm test.cpp -o test.ir 创建的 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;
}

一个简单的方法是使用以下方法将模块转储到 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

你需要的是编写一个LLVM通行证,它允许你逐个函数/逐个模块地通过代码并读取/修改/写入它。您可以使用opt命令对字节码文件运行此传递,它将返回您可以使用的修改后的字节码文件。

以下是编写通行证的一些来源:

1) http://llvm.org/docs/WritingAnLLVMPass.html

2)https://www.cs.cornell.edu/~asampson/blog/llvm.html

IR不是人类可读的。您可以使用llvm-dis将其转换为人类可读的版本,如@TartanLlama所说。您可以使用lli命令运行位码。修改 IR 后,您将看到修改后的 IR 与 lli 一起运行。