Я новичок в llvm, и я пишу небольшой IR Builder llvm. Я использую IRBuilder и все эти функции Create * для генерации своего IR. То, что я пытаюсь сделать, - создать команду , которая создает новую локальную переменную SSA со значением ранее выделенного llvm :: Значение.Получить указатель на llvm :: Значение, ранее выделенное для функции CreateLoad
Что я ожидал иметь:
%2 = load i32* %1
С % 2 результаты команды загрузки и % 1 мой ранее выделено значение (CreateAlloca)
Вот что я пробовал:
// Get Ptr from Val
Value* ptr = ConstantExpr::getIntToPtr((Constant*)loc[n],PointerType::getUnqual(builder->getInt32Ty()));
// Générate load instruction with the new Ptr
builder->CreateLoad(ptr);
И вот что у меня есть:
%2 = load i32* null
LOC массив, который содержит все мои LLVM :: Value *
Можете ли вы сказать мне, что я делаю неправильно? Или, может быть, если я нахожусь плохо? Спасибо.
Спасибо за ваш ответ. На самом деле мой loc [n] является константой. Мой массив loc просто введен как значение *, но в моем случае я уверен, что loc [n] здесь Constant *, поэтому getIntToPtr должен работать для меня? – bsaleil
@ user2390982 Я предположил, что 'loc' не содержит констант, потому что вы написали, что вы поместили значение там, которое вы создали с помощью' alloca' - и 'alloca' не вернете константу. В любом случае, если это константа, тогда 'ConstantExpr :: getIntToPtr' действительно должен работать. Также убедитесь, что ваши типы совпадают - 'alloca' возвращает указатель, а не число, поэтому я не понимаю, зачем вам' getIntToPtr' вообще. – Oak
Хорошо, если я не понимаю. Проблема в том, что я храню в моем массиве 'loc' только константы, которые я использую в функциях Create *. Например, с 'CreateAlloca (type, myConst)', 'loc' содержит' myConst', а не возвращаемое значение. Вот почему я должен использовать 'getIntToPtr' для инструкции' CreateLoad' (я прав?) И он не работает с кодом в исходном сообщении. – bsaleil