我正在尝试在自定义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,但是我不知道如何解决我的代码以实现这一点。如何解决此错误?
答案 0 :(得分:1)
交换store
的操作数:第一是什么,第二是-哪里。