Как мне сохранить массив указателей в 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*) и выполнить bitcasts всякий раз, когда вы хотите получить доступ к массиву - хотя это, конечно, предполагает, что вы заранее знаете размер внутреннего массива в каждом индексе.

Если он известен только во время выполнения, вы можете настроить каждый элемент массива на { i32, i32* } структура, которая содержит размер внутреннего массива, а также указатель на него, а затем switch на этот размер и bitcast соответственно в каждой целевой ветви - или просто вычислите размер во время выполнения из i32* Указатель, который прост, так как это UTF-8.

Другие вопросы по тегам