Цели 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 и не означает удаление других независимо предоставляемых компонентов цепочки инструментов.