微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取存储在 LLVM 变量中的数据

如何解决获取存储在 LLVM 变量中的数据

我正在构建一个将汇编代码转换为 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 处理程序上中断。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?