Извлечь / вставить элемент по индексу из значения - LLVM - PullRequest
0 голосов
/ 26 мая 2018

Есть ли способ извлечь или вставить элемент по индексу из значения вместо int?Я хотел бы иметь возможность использовать что-то вроде ExtractElementInst, но для массивов вместо векторов.

Сейчас я делаю

mBuilder.CreateExtractValue(refArray, index)

Но мне нужно иметь возможность передать его Value *, потому что я хотел бы иметь возможность доступа к элементам массива по индексузначение переменной.Например:

array[i]

С кодом выше я ограничен:

array[0]

1 Ответ

0 голосов
/ 26 мая 2018

Чтобы выполнить адресную арифметику с произвольными непостоянными индексами, вам нужно использовать инструкцию getelementptr, которая создается с помощью функции CreateGEP.

Обратите внимание, что для getelementptr нужен аргументбыть указателем, поэтому вы захотите напрямую использовать глобальную переменную или alloca, которая содержит массив, вместо того, чтобы сначала читать его.Это также означает, что вам нужен ноль в качестве первого индекса, следующего за указателем.В общем, сгенерированный код для чтения array[i] должен выглядеть примерно так:

@array = global [3 x i32] [1,2,3]

define void f() {
  %i = ; calculuate the index here
  %array_i_ptr = getelementptr [3 x i32], [3 x i32]* @array, i32 0, i32 %i
  %array_i_value = load i32, i32* array_i_ptr
  ; do something with %array_i_value
  ret
}

Здесь я предположил, что array является глобальной переменной.Для локальной переменной вы должны использовать alloca.Для динамически распределяемого массива у вас будет вызов malloc, без типов массива и инструкция getelementptr только с одним индексом (потому что мы будем работать с указателем на int, а не с указателем на массив на intпоэтому нулевой индекс не обязателен).

...