我正在构建一个将 armv7m 汇编指令转换为 llvm IR 的升降器。我的 C++ 代码示例是:
IRBuilder<> builder(TheContext); //第0行
llvm::ConstantInt* I_0 = llvm::ConstantInt::get(TheContext, llvm::APInt(/ nbits /32, 0, true)); //第 1 行
V = builder.CreateAlloca(Type::getInt32Ty(TheContext), nullptr, "V"); //第 2 行
值* s3 = builder.CreateStore(I_0, V, / isVolatile= /false); //第 3 行
Value* loaded_V = builder.CreateLoad(V); //第 4 行
值* result_V = builder.CreateICmpEQ(I_0, loaded_V); //第 5 行
结果_V->打印(错误());//第 6 行
我得到的结果是:
%22 = icmp eq i32 0, %18
我想要的结果是:
i1 true
所以我的问题是,即使我在第 3 行中的 ptr V 指向的内存位置存储了一个即时值 0。当我使用第 4 行中的 ptr V 的内存加载从内存中加载这个值然后将其与第 5 行的 icmpEq 中的立即值为 0,为什么我在第 6 行中没有得到一个真实的结果,但似乎loaded_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, SRC1, /*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-是否有更好的方法来表示操作数(虚拟寄存器?!,而不是 ptrs 到内存)。