2013-05-22 1 views
0

Я новичок в 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 *

Можете ли вы сказать мне, что я делаю неправильно? Или, может быть, если я нахожусь плохо? Спасибо.

ответ

0

ConstantExpr::getIntToPtr() создает constant expression. Таким образом, в сущности, то, что вы пытаетесь произвести равносильна этому ИК:

%2 = load i32* inttoptr (i32 %1 to i32*) 

Но это незаконно, так как постоянное выражение, как и намекнул на свое название, поддерживает только constants и% 1 не является постоянная. ConstantExpr::getIntToPtr() требует в качестве первого аргумента Constant, но вы передали ему непостоянное значение, которое было принудительно перенесено на константу.

Правильный способ преобразования целочисленного целого числа в указатель с IRBuilder::createIntToPtr. Однако, поскольку вы говорите, что предыдущее значение (loc[n]) было создано через alloca, то это уже указатель, и вам не нужно выполнять какое-либо преобразование: просто сделайте builder->CreateLoad(loc[n]).

Кстати, правильный способ присвоить значение константе в LLVM не осуществляется с помощью c-style cast, а через cast<>, например: cast<Constant>(loc[n]).

+0

Спасибо за ваш ответ. На самом деле мой loc [n] является константой. Мой массив loc просто введен как значение *, но в моем случае я уверен, что loc [n] здесь Constant *, поэтому getIntToPtr должен работать для меня? – bsaleil

+0

@ user2390982 Я предположил, что 'loc' не содержит констант, потому что вы написали, что вы поместили значение там, которое вы создали с помощью' alloca' - и 'alloca' не вернете константу. В любом случае, если это константа, тогда 'ConstantExpr :: getIntToPtr' действительно должен работать. Также убедитесь, что ваши типы совпадают - 'alloca' возвращает указатель, а не число, поэтому я не понимаю, зачем вам' getIntToPtr' вообще. – Oak

+0

Хорошо, если я не понимаю. Проблема в том, что я храню в моем массиве 'loc' только константы, которые я использую в функциях Create *. Например, с 'CreateAlloca (type, myConst)', 'loc' содержит' myConst', а не возвращаемое значение. Вот почему я должен использовать 'getIntToPtr' для инструкции' CreateLoad' (я прав?) И он не работает с кодом в исходном сообщении. – bsaleil