0

我正在构建一个将 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 到内存)。

4

0 回答 0