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

如何获取存储在 llvm 指针指向的内存中的数据

如何解决如何获取存储在 llvm 指针指向的内存中的数据

我正在构建一个将 armv7m 汇编指令转换为 llvm IR 的提升器。我的 C++ 代码示例是:

IRBuilder builder(TheContext); //第0行

llvm::ConstantInt* I_0 = llvm::ConstantInt::get(TheContext,llvm::APInt(/nbits/32,true)); //第1行

V = builder.Createalloca(Type::getInt32Ty(TheContext),nullptr,"V"); //第2行

Value* s3 = builder.CreateStore(I_0,V,/isVolatile=/false); //第3行

Value* loaded_V = builder.CreateLoad(V); //第4行

Value* result_V = builder.CreateICmpEQ(I_0,loaded_V); //第5行

result_V->print(errs()); //第6行

我得到的结果是:

%22 = icmp eq i32 0,%18

我想要的结果是:

i1 true

所以我的问题是,即使我在第 3 行中的 ptr V 指向的内存位置存储了一个即时值 0。当我使用第 4 行中 ptr V 的内存加载从内存加载这个值,然后比较它在第 5 行的 icmpEq 中立即值为 0,为什么我在第 6 行没有得到真正的结果,但似乎加载的_V 没有评估为立即值 0,它只是由变量 %18 表示。

1- 如何获取存储在 llvm 变量 %18 中的值?

2- 有没有办法直接获取存储在ptr V指向的内存地址中的数据,而无需加载。

正如您在我的另一个代码示例中看到的,我试图将汇编指令 add DST,SRC1,SRC2 转换为等效的 llvm IR:

            llvm::Value* SRC1 = builder.Createalloca(Type::getInt32Ty(TheContext),nullptr);
        
            llvm::Value* SRC2 = builder.Createalloca(Type::getInt32Ty(TheContext),nullptr);
            
            llvm::Value* s = builder.CreateStore(register1_val,/*isVolatile=*/false);
            
            llvm::Value* s2 = builder.CreateStore(register2_val,SRC2,/*isVolatile=*/false);
            
            llvm::Value* LHS = builder.CreateLoad(SRC1,register1);
            
            llvm::Value* RHS = builder.CreateLoad(SRC2,register2);
            
            llvm::Value* add_ll = builder.CreateAdd(LHS,RHS,output_register);

            llvm::Value* DST = builder.Createalloca(Type::getInt32Ty(TheContext),nullptr);

            llvm::Value* s3 = builder.CreateStore(add_ll,DST,/*isVolatile=*/false);

我通过使用 alloca 指令将操作数表示为内存地址的 ptr,然后在 llvm 指令创建中使用操作数时从该内存地址加载。

3- 是否有更好的方法来表示操作数(虚拟寄存器?!,而不是 ptr 到内存)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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”。这是什么意思?