c++ - LLVM:如何将 IR 写入文件并运行它?

标签 c++ llvm llvm-ir

我想使用 parseIRFile 调用解析使用 clang++ -S -emit-llvm test.cpp -o test.ir 创建的 IR 文件,操作这个 IR a位,然后将 IR 写回文件。

我试过使用 WriteBitcodeToFile 调用,但这没有按预期工作。

如何将 Module 写回 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;
}

最佳答案

一个简单的方法是将您的模块转储到标准输出,使用:

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

关于c++ - LLVM:如何将 IR 写入文件并运行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41716079/

相关文章:

c++ - 从 1.x、2.x、3.x 和 4.x 到 OpenGL 有哪些变化?

c++ - 在 C++ 中,如何编写析构函数来释放指向结构的指针的内存?

gcc - 如何在 Mac 上使用 Emscripten emcc 和 make 时包含 ncurses

clang:生成 LLVM IR 时支持位宽属性

c++ - C++ DLL程序退出时: Run-Time Check Failure #2

cmake - 构建 LLVM 示例

c - 堆栈损坏;跨函数调用时存储在寄存器中的变量会发生什么?

gcc - DragonEgg 能否运行 gcc 中可用的优化 channel 并生成 llvm IR?

c++ - 大型项目的 MPI 编码实践 multiple MPI_Finalize();或者只有一个?