Я пытаюсь сохранить значение глобальной переменной в локальной переменной в функции в моем пользовательском проходе LLVM.
глобальная переменная определяется как
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, но я не знаю, как исправить мой код, чтобы это произошло.Как мне исправить эту ошибку?