LLVM:如何将 IR 写入文件并运行它
LLVM: How do I write IR to file and run it?
我想使用 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
一起运行。
相关文章:
- pybind11:属性错误:尝试从 py 文件运行函数时,模块'XXX'没有属性'YYY'
- 从 cmake 文件运行 npm 命令
- C++ 从文件运行实际代码而不编译它
- 如何直接在安卓设备上作为可执行文件运行简单的 c++ 程序?
- 用于使用可选输入文件运行 C++ 的 VIM 映射
- 我的应用程序是从Visual Studio内部运行还是通过执行EXE文件运行
- LD_BIND_NOW可以使可执行文件运行得更慢?
- 生成文件:从生成文件运行其他生成文件
- G++ 和 CL(VS2017) 都编译成功,但 cl 编译的可执行文件运行异常
- 阻止EXE文件运行C
- 如何从安卓原生二进制文件运行单独的进程
- 为在应用程序中作为函数参数传递的文件运行'iconv'命令C++
- 通过Linux命令行执行时,可执行文件运行正常 - 调用C System()命令时运行时错误
- 如何从另一个CPP文件运行整个CPP文件
- C++从文本文件运行代码
- 编译并使用生成文件运行
- 为我的生成文件运行时出错.cpp
- C++获取当前文件运行exe
- 如何在C++中从类文件运行函数
- 基于使用 make 命令或生成文件运行预处理器