Размер типов в LLVM

В настоящее время мы создаем компилятор на Java, который использует LLVM в качестве промежуточного представления кода. Мы используем несколько типов, и нам нужно выделить для них память, например, с помощью malloc.

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

Я знаю, что мы можем использовать DataLayout, если мы используем LLVM API, но, к сожалению, мы не используем его, и мы генерируем код LLVM "вручную" (главным образом потому, что мы не смогли найти приличную и простую в использовании привязку Java).

Поэтому мы пытаемся определить, как вычислить размер (сложных) типов в зависимости от архитектуры, на которой будет выполняться компилятор.

Прямо сейчас мы просто проверяем, находимся ли мы на 64-битной архитектуре, чтобы определить размер указателей (4 или 8 байт). Мы предполагаем размер структур, просто добавляя размеры их элементов, но кажется, что это не правильно (выравнивание должно быть принято во внимание, я думаю).

Не могли бы вы помочь мне найти способ решить эту проблему?

Спасибо!

1 ответ

Решение

Я сделал это, указав тип, который вы пытаетесь измерить. Затем используйте getelementpointer, чтобы получить указатель на элемент 1 и элемент 0. Вычтите указатель на элемент 0 из указателя на элемент 1, и это будет размер. Когда это уменьшается до дополняемых размеров бэкэндом, оно должно быть константно свернуто и оптимизировано до одной константы.

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