Цели AMD64 и ABI

Linux AMD64 Описывает целевые свойства, границы вызовов и область действия функции native.

Wave Foundation

целевой идентификатор

Целевой идентификатор профиля native — x86_64-whale-linux.

атрибут ценность
операционная система Linux
набор команд AMD64
порядок байтов Little endian
Native Ширина адреса 64 бит
формат объекта ELF64
C Протокол вызова SysV AMD64 ABI
статический формат исполняемого файла ELF ET_EXEC

Хост сборки и цель вывода — это разные понятия. Тот факт, что вы можете запустить Whale на другом хосте, не означает, что он может выводить набор команд или формат объекта этого хоста. Пожалуйста, обратитесь к Статус поддержки за реализованным путем компиляции.

Выбор и проверка цели

Экспериментальная команда ir lower использует x86_64-whale-linux в качестве единственной поддерживаемой цели по умолчанию. Чтобы использовать эту команду, создайте сборку как --features socket-cli.

whale ir lower program.json --target x86_64-whale-linux

Цель вывода обеспечивает 64-битный формат данных little-endian независимо от хоста сборки. Неизвестные идентификаторы или неподдерживаемые комбинации, такие как aarch64-whale-linux, x86_64-whale-windows, завершатся ошибкой, указывая поддерживаемую цель перед чтением входных данных или заменой выходного файла. --no-verify не отключает проверку выбора цели.

Ввод пробела AST({"globals":[],"functions":[]}) приведет к выводу следующих заголовков и модулей:

module {
  format_version 2
  semantics_version 1
  target "x86_64-whale-linux"
  datalayout { ptr=64, endian=little }

}

Если вы укажете неподдерживаемую цель, она завершится в состоянии сбоя.

whale ir lower program.json --target banana
Error: unsupported target "banana"; supported targets: x86_64-whale-linux

В Rust вы можете выбрать цель с помощью ir::Target::lookup("x86_64-whale-linux") и перенести name() и data_layout() в lower_o0. Lowering отклоняет, если доставленный макет отличается от выбранного целевого объекта. Проверьте наличие неподдерживаемых целевых имен и несоответствий макета в самостоятельно настроенных IR, а также verify_module.

Объектная модель хранит format, machine, endian и address_bits в ObjectTarget. ObjectFile::with_target сохраняет указанную идентификационную информацию, а сериализация допускает только комбинацию AMD64·little-endian·64-битного ELF64. Наличие идентификатора machine для другой архитектуры не подразумевает поддержку этого кодера. Обе точки входа ELF и writer проверяют метаданные, а входные данные компоновщика проверяются перед разрешением символов или связыванием. Заголовок ELF для поддерживаемых объектов сохраняет EM_X86_64.

ObjectFile::new(ObjectFormat::ELF64) — это удобный конструктор, который использует идентификатор AMD64, как и раньше. Коды, которые ранее получали доступ к object.format, должны использовать object.target.format.

Этот осмотр обеспечивает выбор цели и идентификацию объекта. Размер структур, массивов и т. д., поля offset, stride можно искать с помощью макета IR API. Чтение объектных файлов, native ABI lowering, связывание с исполняемыми файлами пока не поддерживается. Скаляр lowering по-прежнему определяет явное выравнивание, а полные правила компоновки сложного типа определены в Справочный документ по памяти.

Звоните и записывайтесь

Объявление IR и средство проверки вызова принимают явные соглашения Whale и SysV64. Соглашение является частью типа fnptr и должно совпадать на месте вызова. Вариативные подписи и совокупные подписи SysV64 отклоняются. См. [пример построения исполняемого вызова] (ir-reference). Это подтверждает контракты IR; Классификация ABI машины, регистры аргументов/размещение стека и встроенная эмиссия вызовов еще не реализованы.

Поддерживаемые вызовы требуют явной подписи и соглашения о вызовах. Неподдерживаемая подпись является ошибкой. Серверная часть не должна выполнять аналогичные вызовы, пропуская аргументы или заменяя их другими выражениями.

Поддержка сигнатур разделена на базовые целые числа/указатели, f32/f64, структуры/широкие значения и переменные аргументы. Тот факт, что в системе типов IR существует тип, не означает, что передача или возврат аргументов этого типа поддерживается в ABI. При выборе бэкэнда следует проверить, поддерживает ли каждый нужные вам категории.

Например, подписи возврата структуры i32, которые также не поддерживаются серверной частью, обрабатывающей возврат, должны быть отклонены. Соглашение о скалярном возврате не может быть применено только потому, что часть структуры попадает в скалярный регистр.

Внутренние вызовы и границы C

native Адрес указателя имеет длину 64 бита. shadow metadata указателя отслеживания необходимо передавать вместе даже после копирования, сохранения, аргумента и возврата.

C ABI и внутренний протокол доставки метаданных различаются. C Для трансграничных вызовов требуется явный адаптер. Тот факт, что вы передали числовой адрес C ABI, не должен рассматриваться как сохранение идентичности назначения, срока действия, области действия или прав доступа.

стек кадров

Сохраняет указатель кадра и не использует red zone. В O0 пространство для хранения различных локальных переменных не используется повторно. Информация об отладке кадра вызова описывает соответствие кадра native исходной программе.

Это правило предназначено только для целей отладки и не предназначено для поддержки исключения unwinding. Пожалуйста, обратитесь к Отладка с помощью O0.

Ограничения профиля

Первые профили O0 native не включают в себя следующие функции:

  • O1 Оптимизация, векторизация, LTO.
  • Общая память и операции atomic.
  • Исключение unwinding, async функция, coroutine.
  • GC и проверка принадлежности для конкретного языка.
  • Передача права собственности на произвольную внешнюю память.
  • Полная поддержка ограничений встроенной сборки.
  • Динамическое связывание, TLS, дополнительный набор команд, дополнительные типы объектов.

Запросы, выходящие за рамки поддержки, следует отклонять, а не незаметно заменять другой функцией. Это ограничение касается пути компиляции native и не означает удаление других независимо предоставляемых компонентов цепочки инструментов.