Доступ к переменной Element of Array в llvm

Я хочу получить значение массива по индексу переменной. Индекс вычисляется программой и неизвестен во время синтаксического анализа. Таким образом, он хранится в значении и преобразуется в Int следующим образом:

Value *IndexV = Index->Codegen();
Value *IntV = Builder.CreateFPToUI( IndexV, Type::getInt32Ty( getGlobalContext() ) );

Если я знаю индекс, я могу использовать:

Value *VV = Builder.CreateExtractValue( Builder.CreateLoad( V ), 0 );

Это дает мне первый элемент массива. И работает корректно. Но как я могу использовать IntV в качестве индекса? CreateExtractValue принимает только ArrayRef, и нет возможности преобразовать IntV в ArrayRef, или я ошибаюсь? Как можно сделать такое?

Спасибо!


person Philip    schedule 11.04.2013    source источник


Ответы (1)


Прежде всего, всякий раз, когда ожидается ArrayRef, вы всегда можете передать только один элемент, так как есть неявное преобразование между любыми T и ArrayRef<T>.

Однако в данном случае для extractvalue требуются постоянные индексы, и он не может принимать общие значения, которые вот почему ему нужны значения unsigned. Если вы хотите получить доступ к элементу в неизвестном индексе в массиве, используйте getelementptr вместо инструкции: вызовите ее по адресу массива с индексами 0 и IntV, и вы должны получить указатель на массив по адресу IntV.

person Oak    schedule 12.04.2013
comment
Это дает мне ошибку компиляции: error: no viable conversion from 'llvm::Value *' to 'ArrayRef<unsigned int>' - person Philip; 12.04.2013
comment
@Philip, плохо, я перепутал extractvalue с extractelement (который принимает индексы Value). Я обновил свой ответ - я думаю, вам нужен GEP здесь. - person Oak; 12.04.2013