Операндом хранилища LLVM должен быть указатель - PullRequest
0 голосов
/ 02 мая 2019

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

1 Ответ

1 голос
/ 02 мая 2019

Поменяйте местами операнды store: первое что и второе - где.

...