Этот репозиторий содержит сценарии сборки и вспомогательные материалы для создания «голого железа» набора инструментов на основе LLVM, предназначенного для Arm на основе:
Цель состоит в том, чтобы предоставить набор инструментов «голого железа» на основе LLVM, который может работать с семейством архитектур Arm, начиная с Armv6-M и новее. Инструментальная цепочка соответствует ABI для архитектуры Arm и пытается предоставить типичные функции, необходимые для встроенных операционных систем и операционных систем реального времени.
C++ частично поддерживается с использованием libc++ и libc++abi из LLVM. Неподдерживаемые функции включают в себя:
LLVM Embedded Toolchain для Arm использует нестабильную версию libc++ ABI. Этот ABI использует все последние улучшения и исправления ошибок libc++, но может привести к ошибкам при связывании с объектами, скомпилированными с использованием более старых версий ABI. Для получения дополнительной информации см. https://libcxx.llvm.org/DesignDocs/ABIVersioning.html.
Встроенная цепочка инструментов LLVM для Arm опирается на следующие исходные компоненты.
Компонент | Связь |
---|---|
ЛЛВМ | https://github.com/llvm/llvm-project |
пиколибк | https://github.com/picolibc/picolibc |
Содержимое этого репозитория доступно под лицензией Apache-2.0. См. ЛИЦЕНЗИЯ.txt.
Полученные двоичные файлы покрываются соответствующими лицензиями с открытым исходным кодом, см. ссылки на компоненты выше.
При тестировании некоторых целей используются свободно доступные, но не открытые модели Arm FVP, которые имеют собственные лицензии. Они не используются по умолчанию, подробности см. в разделе Сборка из исходного кода.
LLVM Embedded Toolchain для Arm создан и протестирован на Ubuntu 18.04 LTS.
Версия для Windows построена на Windows Server 2019 и слегка протестирована на Windows 10.
Сборка на macOS работает для x86_64 и Apple Silicon.
Двоичные пакеты предоставляются для основных выпусков LLVM для Linux и Windows.
Загрузите версию набора инструментов для вашей платформы с выпусков Github и извлеките архив в произвольный каталог.
Установите соответствующий последний поддерживаемый распространяемый пакет Microsoft Visual C++, например, из последних поддерживаемых загрузок распространяемого пакета Microsoft Visual C++.
Примечание. Если вы используете цепочку инструментов в общей среде с ненадежными входными данными, убедитесь, что она достаточно изолирована.
Чтобы использовать набор инструментов, в командной строке необходимо указать следующие параметры:
crt0
или crt0-semihost
. crt0
будет связан автоматически, но это можно подавить с помощью опции -nostartfiles
, чтобы можно было использовать crt0-semihost
.crt0-semihost
.-T
. Предоставляются сценарии picolibcpp.ld
и picolibc.ld
по умолчанию, которые можно использовать напрямую или включать из пользовательского сценария компоновщика.Например:
$ PATH=/LLVMEmbeddedToolchainForArm-/bin:$PATH
$ clang
--target=armv6m-none-eabi
-mfpu=none
-fno-exceptions
-fno-rtti
-nostartfiles
-lcrt0-semihost
-lsemihost
-T picolibc.ld
-o example example.c
Многобиблиотековая система clang
автоматически выберет подходящий набор библиотек на основе ваших флагов компиляции. clang
выдаст предупреждение, если не удастся найти подходящий набор библиотек.
Чтобы отобразить каталог, выбранный системой multilib, добавьте флаг -print-multi-directory
в параметры командной строки clang
.
Чтобы отобразить все доступные мультибиблиотеки, запустите clang
с флагом -print-multi-lib
и целевой тройкой, например --target=aarch64-none-elf
или --target=arm-none-eabi
.
Возможно, clang
выберет набор библиотек, которые вам не нужны. В этом случае вы можете обойти систему multilib, указав опцию --sysroot
указав каталог, содержащий каталоги include
и lib
библиотек, которые вы хотите использовать. Например:
$ clang
--sysroot=/LLVMEmbeddedToolchainForArm-/lib/clang-runtimes/arm-none-eabi/armv6m_soft_nofp
--target=armv6m-none-eabi
-mfpu=none
-fno-exceptions
-fno-rtti
-nostartfiles
-lcrt0-semihost
-lsemihost
-T picolibc.ld
-o example example.c
Выбор FPU можно пропустить, но это не рекомендуется, поскольку значения по умолчанию отличаются от значений GCC.
Сборки набора инструментов поставляются в комплекте с двумя файлами конфигурации: Omax.cfg и OmaxLTO.cfg. При использовании эти файлы конфигурации включают несколько флагов оптимизации сборки для достижения максимальной производительности в типичных встроенных тестах. OmaxLTO.cfg включает специальные флаги оптимизации времени соединения (LTO). Эти конфигурации можно дополнительно передать с помощью флага --config
. Например:
$ clang
example.c
...
--config=Omax.cfg
--config=OmaxLTO.cfg
-o example
Пользователей следует предупредить, что Omax.cfg включает -ffast-math
, который нарушает соответствие IEEE и позволяет выполнять математические оптимизации, которые могут повлиять на корректность кода. LTO хранятся отдельно в OmaxLTO.cfg, поскольку пользователям могут не понадобиться LTO из-за потенциального увеличения времени компоновки и/или увеличения использования памяти во время компоновки. Некоторые параметры в файлах конфигурации являются недокументированными внутренними параметрами LLVM. Для получения дополнительной информации об этих недокументированных опциях см. исходный код соответствующих проходов оптимизации в проекте LLVM. Пользователям также предлагается создавать свои собственные конфигурации и настраивать параметры собственных флагов. Информация о флагах оптимизации LLVM Embedded Toolchain for Arm доступна в разделе Флаги оптимизации.
Двоичные выпуски встроенной цепочки инструментов LLVM для Arm основаны на ветках выпусков исходного проекта LLVM, поэтому их можно безопасно использовать со всеми инструментами, предоставляемыми выпусками LLVM соответствующей версии.
См. «Миграция с Arm GNU Toolchain» и «Экспериментальная поддержка newlib» для получения рекомендаций по использованию встроенной цепочки инструментов LLVM для Arm с существующими проектами, использующими Arm GNU Toolchain.
Примечание:
picolibc
обеспечивает отличную поддержку Arm GNU Toolchain, поэтому проекты, требующие использования как Arm GNU Toolchain, так и LLVM Embedded Toolchain для Arm, могут выбрать либоpicolibc
, либоnewlib
.
LLVM Embedded Toolchain for Arm — это проект с открытым исходным кодом, поэтому его можно собрать из исходного кода. Подробные инструкции см. в руководстве «Создание из источника».
Пожалуйста, поднимите проблему через Github.
Подробности смотрите в Руководстве по вкладам.