Как мне сохранить массив указателей в LLVM?
Для некоторого фона я реализую компилятор, используя библиотеку llvmpy, которая является оболочкой для генерации IR LLVM.
Я создал символьный тип, представляющий одну или несколько кодовых точек UTF-8. Эти кодовые точки хранятся в массиве, поэтому символ может быть одним из следующих массивов:
[1 x i32], [2 x i32], ..., [6 x i32]
Теперь я хотел бы реализовать строковый тип. Это будет массив указателей на массивы:
[n x [1-6 x i32]*] where n is the string length
Однако (насколько я знаю) кажется, что LLVM требует, чтобы я объявил длину внутреннего массива. Итак, пока я могу хранить это:
[[1 x i32], [1 x i32], [1 x i32]]
Я не могу сохранить это:
[[1 x i32], [2 x i32]]
Есть ли способ сохранить массив указателей массивов, если указатели массивов приводят к массивам различной длины?
1 ответ
Как и в C, LLVM IR требует, чтобы все элементы массива были одного типа.
Я предполагаю, что самый простой способ обойти это - просто сохранить некоторый произвольный тип указателя (например, i32*
) и выполнить bitcast
s всякий раз, когда вы хотите получить доступ к массиву - хотя это, конечно, предполагает, что вы заранее знаете размер внутреннего массива в каждом индексе.
Если он известен только во время выполнения, вы можете настроить каждый элемент массива на { i32, i32* }
структура, которая содержит размер внутреннего массива, а также указатель на него, а затем switch
на этот размер и bitcast
соответственно в каждой целевой ветви - или просто вычислите размер во время выполнения из i32*
Указатель, который прост, так как это UTF-8.