Этот репозиторий содержит сценарии сборки и вспомогательные материалы для создания «голой» цепочки инструментов на основе LLVM, предназначенной для Arm на основе:
лязг + лвм
ООО
libc++abi
библиотека libС++
компилятор-rt
picolibc или, опционально, newlib или libc LLVM
Цель состоит в том, чтобы предоставить набор инструментов «голого железа» на основе LLVM, который может работать с семейством архитектур Arm, начиная с Armv6-M и новее. Инструментальная цепочка соответствует ABI для архитектуры Arm и пытается предоставить типичные функции, необходимые для встроенных операционных систем и операционных систем реального времени.
Армв6-М
Армв7-М
Армв7Э-М
Основная и базовая линии Armv8-M
Основная и базовая линии Armv8.1-M
Армв4Т (экспериментальный)
Армв5ТЕ (экспериментальный)
Armv6 (экспериментальный, с использованием варианта библиотеки Armv5TE)
Армв7-А
Армв7-Р
AArch32 Armv8-A
AArch32 Armv8-R
AArch64 Armv8-A
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 для 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++.
Примечание. Если вы используете цепочку инструментов в общей среде с ненадежными входными данными, убедитесь, что она достаточно изолирована.
Чтобы использовать набор инструментов, в командной строке необходимо указать следующие параметры:
Целевая тройка.
Используемый FPU.
Отключение/включение исключений C++ и RTTI.
Библиотека времени выполнения C: crt0 или crt0-semihost . crt0 будет связан автоматически, но это можно подавить с помощью опции -nostartfiles , чтобы можно было использовать crt0-semihost .
Библиотека полухостинга, если используется crt0-semihost .
Сценарий компоновщика, указанный с помощью -T . Предоставляются сценарии picolibcpp.ld и picolibc.ld по умолчанию, которые можно использовать напрямую или включать из пользовательского сценария компоновщика.
Например:
$ PATH=<install-dir>/LLVMEmbeddedToolchainForArm-<revision>/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=<install-dir>/LLVMEmbeddedToolchainForArm-<revision>/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.
Подробности смотрите в Руководстве по вкладам.