Размер типов в LLVM
В настоящее время мы создаем компилятор на Java, который использует LLVM в качестве промежуточного представления кода. Мы используем несколько типов, и нам нужно выделить для них память, например, с помощью malloc.
Я хотел бы знать, как вычислить размер, который понадобится элементам в памяти: указатели, структуры, ...
Я знаю, что мы можем использовать DataLayout, если мы используем LLVM API, но, к сожалению, мы не используем его, и мы генерируем код LLVM "вручную" (главным образом потому, что мы не смогли найти приличную и простую в использовании привязку Java).
Поэтому мы пытаемся определить, как вычислить размер (сложных) типов в зависимости от архитектуры, на которой будет выполняться компилятор.
Прямо сейчас мы просто проверяем, находимся ли мы на 64-битной архитектуре, чтобы определить размер указателей (4 или 8 байт). Мы предполагаем размер структур, просто добавляя размеры их элементов, но кажется, что это не правильно (выравнивание должно быть принято во внимание, я думаю).
Не могли бы вы помочь мне найти способ решить эту проблему?
Спасибо!
1 ответ
Я сделал это, указав тип, который вы пытаетесь измерить. Затем используйте getelementpointer, чтобы получить указатель на элемент 1 и элемент 0. Вычтите указатель на элемент 0 из указателя на элемент 1, и это будет размер. Когда это уменьшается до дополняемых размеров бэкэндом, оно должно быть константно свернуто и оптимизировано до одной константы.