該儲存庫包含建置腳本和輔助材料,用於建立基於裸機 LLVM 的針對 Arm 的工具鏈,基於:
鏗鏘+llvm
LLD
libc++abi
函式庫++
編譯器-rt
picolibc,或可選的 newlib 或 LLVM 的 libc
目標是提供一個基於 LLVM 的裸機工具鏈,可以針對 Armv6-M 及更高版本的 Arm 架構系列。此工具鏈遵循 Arm 架構的 ABI,並嘗試提供嵌入式和即時作業系統所需的典型功能。
ARMv6-M
Armv7-M
Armv7E-M
Armv8-M 主線和基線
Armv8.1-M 主線和基線
Armv4T(實驗性)
Armv5TE(實驗性)
Armv6(實驗性,使用 Armv5TE 庫變體)
Armv7-A
Armv7-R
AArch32 Armv8-A
AArch32 Armv8-R
AArch64 Armv8-A
使用 LLVM 中的 libc++ 和 libc++abi 部分支援 C++。不支援的功能包括:
多執行緒
Arm 的 LLVM 嵌入式工具鏈使用不穩定的 libc++ ABI 版本。此 ABI 使用所有最新的 libc++ 改進和錯誤修復,但在連結針對舊版本 ABI 編譯的物件時可能會導致連結錯誤。有關更多信息,請參閱 https://libcxx.llvm.org/DesignDocs/ABIVersioning.html。
Arm 的 LLVM 嵌入式工具鏈依賴以下上游元件
| 成分 | 關聯 |
|---|---|
| LLVM | https://github.com/llvm/llvm-project |
| 吡啶甲酸乙酯 | https://github.com/picolibc/picolibc |
該儲存庫的內容已獲得 Apache-2.0 授權。請參閱 LICENSE.txt。
產生的二進位檔案受各自的開源許可證保護,請參閱上面的元件連結。
對某些目標的測試使用免費但非開源的 Arm FVP 模型,這些模型有自己的許可證。預設不使用這些,有關詳細信息,請參閱從原始碼建置。
適用於 Arm 的 LLVM 嵌入式工具鏈在 Ubuntu 18.04 LTS 上建置和測試。
Windows 版本是基於 Windows Server 2019 構建,並在 Windows 10 上進行了輕微測試。
在 macOS 上建置適用於 x86_64 和 Apple Silicon。
為 Linux 和 Windows 的主要 LLVM 版本提供了二進位套件。
從 Github 版本下載適合您平台的工具鏈版本,並將檔案解壓縮到任何目錄中。
安裝適當的最新支援的 Microsoft Visual C++ Redistributable 軟體包,例如從 Microsoft Visual C++ Redistributable 最新支援的下載。
注意:如果您在具有不受信任輸入的共用環境中使用工具鏈,請確保它已充分沙箱化。
要使用工具鏈,您需要在命令列上提供以下選項:
目標三倍。
要使用的 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的 multilib 系統會根據您的編譯標誌自動選擇一組合適的函式庫。如果找不到合適的庫集, clang將發出警告。
若要顯示 multilib 系統選擇的目錄,請將標誌-print-multi-directory新增至clang命令列選項。
要顯示所有可用的 multilib,請使用標誌-print-multi-lib和目標三元組運行clang ,例如--target=aarch64-none-elf或--target=arm-none-eabi 。
clang可能會選擇一組不是您想要使用的函式庫。在這種情況下,您可以透過提供--sysroot選項指定包含要使用的函式庫的include和lib目錄的目錄來繞過 multilib 系統。例如:
$ 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 專案中對應最佳化過程的原始程式碼以了解更多資訊。也鼓勵使用者創建自己的配置並調整自己的標誌參數。有關 Arm 特定最佳化標誌的 LLVM 嵌入式工具鏈的資訊可在最佳化標誌中找到
Arm 的 LLVM 嵌入式工具鏈的二進位版本是基於上游 LLVM 專案的版本分支,因此可以安全地與符合版本的 LLVM 版本提供的所有工具一起使用。
請參閱從 Arm GNU 工具鏈遷移和實驗性 newlib 支持,以了解有關在依賴 Arm GNU 工具鏈的現有專案中使用適用於 Arm 的 LLVM 嵌入式工具鏈的建議。
注意:
picolibc為 Arm GNU Toolchain 提供了出色的支持,因此需要同時使用 Arm GNU Toolchain 和 LLVM Embedded Toolchain for Arm 的專案可以選擇picolibc或newlib。
Arm 的 LLVM 嵌入式工具鍊是一個開源項目,因此可以從原始碼建置。請參閱從原始程式碼建置指南以取得詳細說明。
請透過 Github issues 提出問題。
詳情請參閱貢獻指南。