问题描述
我正在构建一个将 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 (将#修改为@)