Пусть LLVM выбирает размер int в зависимости от платформы - PullRequest
0 голосов
/ 03 июля 2019

Я пишу компилятор и хочу, чтобы мой интерфейс не имел ничего общего с деталями платформы, особенно размером с прототипами (int, long и т. Д.).

Пока, еслиЯ создаю int переменную, я должен использовать IntegerType::get(mod->getContext(), 32).Используя это, я должен знать информацию о платформе и установить 32 или 16.

Поскольку я хочу, чтобы мой интерфейс не имел ничего общего с платформой, есть ли механизм, позволяющий LLVM выбиратьразмер для типа для меня?

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Это не совсем то, что вам нужно, но в LLVM есть механизм для запроса целевой платформы о размерах, называемый DataLayout .Вот некоторый код, который я использую для генерации отладочной информации:

const DataLayout & dl = getModule().getDataLayout();
uint sizeInBits = 0;
if(...)
  sizeInBits = dl.getStructLayout(getObjectStructType())->getSizeInBits();
...

DataLayout не предлагает единого размера для целых, потому что ЦП может иметь несколько в качестве текущих членовСемейство Intel 4004 делает.

Все действующие члены IIRC предлагают 8-битные, 16-битные, 32-битные и 64-битные типы с использованием более или менее расширенных версий одних и тех же регистров (AL, AX, EAX, RAX), с одинаковой производительностью для всех операций, кроме чтения / записи в память.Но вы можете спросить LLVM, какие из 16/32/48/64 хороши , а затем выбрать подходящий размер int.

1 голос
/ 03 июля 2019

Поскольку "int" является функцией C / C ++, его размер определяется платформой CI / C ++ ABI. clang точно знает необходимые размеры / выравнивания, поэтому вам нужно так или иначе интегрироваться с внешним интерфейсом C / C ++ (например, выполнить clang один раз, чтобы получить необходимые размеры).

...