如何获取存储在 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 (将#修改为@)