LLVM存储操作数必须是指针

时间:2019-05-02 13:14:40

标签: c++ llvm llvm-ir

我正在尝试在自定义LLVM Pass的函数中将全局变量的值存储到局部变量中。

全局变量定义为

GlobalVariable* gvar_int32_test = new GlobalVariable(
        /*Module=*/     M, 
        /*Type=*/       IntegerType::get(M.getContext(), 32),
        /*isConstant=*/ false,
        /*Linkage=*/    GlobalValue::CommonLinkage,
        /*Initializer=*/0, // has initializer, specified below
        /*Name=*/"global_test_var");
        gvar_int32_test->setAlignment(4);

我打算存储到的本地变量最初被用作调用指令的存储位置。我尝试使用

获取该值
Value* localVar = ci->getOperand(0) //ci is the call instruction

我使用IR构建器尝试将存储指令编写为:

StoreInst* strLocIns = builder.CreateStore(gvar_int32_test, localVar, false);
//my intent is to create an instruction that means localvar = globalvar;

类似地,在代码的前面,我尝试将值存储在被调用函数的返回指令中,并将其存储到全局变量中

Value* value = ri->getReturnValue(); //ri is the return instruction
// Some more code, including setting the IR builder insertion point
StoreInst* strIns = builder.CreateStore(value, gvar_int32_test, false);
//here the intention is globalvar = localvar

当我尝试编译包含我的通行证的代码时,出现错误:

Store operand must be a pointer.
    store i32* @global_test_var, i32 %5

我不确定自己在做什么错。我传递给IR构建器的变量的两个参数都是指针,但是IR某种程度上已损坏。我认为i32%5应该是i32 *%5,以指示%5指向i32,但是我不知道如何解决我的代码以实现这一点。如何解决此错误?

1 个答案:

答案 0 :(得分:1)

交换store的操作数:第一是什么,第二是-哪里。