问题描述
我正在构建一个将汇编代码转换为 LLVM IR 的提升器。我想知道是否有可能的方法来检查存储在 LLVM 变量中的数据。例如在我下面的代码中。我正在创建一个虚拟的 LLVM 函数。在我的函数内部,我只有一个基本块,我在其中为单个变量 SRC 分配内存,然后在分配的内存中存储立即数 31。最后一步是我从那个内存加载到一个名为加载的变量中。 有没有办法检查 %loaded 变量的值实际上是 31 ?。
int main()
{
llvm::LLVMContext context;
llvm::Type* type = llvm::Type::getVoidTy(context);
Module* modu = new Module("test",context);
modu->getorInsertFunction("dummy",type);
Function* dummy = modu->getFunction("dummy");
BasicBlock* block = BasicBlock::Create(context,"entry",dummy);
IRBuilder<> builder(block);
llvm::Value* SRC = builder.Createalloca(Type::getInt32Ty(context),nullptr);
llvm::Value* s = builder.CreateStore(llvm::ConstantInt::get(context,llvm::APInt(/*nbits*/32,31,true)),SRC,/*isVolatile=*/false);
llvm::Value* loaded = builder.CreateLoad(SRC,"loaded");
builder.CreateRetVoid();
PassManager <llvm::Module>PM;
llvm::AnalysisManager <llvm::Module>AM;
verifyFunction(*(modu->getFunction("dummy")),&llvm::errs());
verifyModule(*modu,&llvm::errs());
PassBuilder PB;
PB.registerModuleAnalyses(AM);
PM.addPass(PrintModulePass());
PM.run(*modu,AM);
; ModuleID = 'test'
source_filename = "test"
define void @dummy() {
entry:
%0 = alloca i32,align 4
store i32 31,i32* %0,align 4
%loaded = load i32,align 4
ret void
}
解决方法
您可以插入对 printf
的调用并将此 IR 编译为本地可执行文件。运行它会打印出变量值。
或者,您可以在调试器下在此 IR 上运行 lli
并在 load
处理程序上中断。