Чтобы выполнить адресную арифметику с произвольными непостоянными индексами, вам нужно использовать инструкцию 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поэтому нулевой индекс не обязателен).