該儲存庫包含建置腳本和輔助材料,用於建立基於裸機 LLVM 的針對 Arm 的工具鏈,基於:
目標是提供一個基於 LLVM 的裸機工具鏈,可以針對 Armv6-M 及更高版本的 Arm 架構系列。此工具鏈遵循 Arm 架構的 ABI,並嘗試提供嵌入式和即時作業系統所需的典型功能。
使用 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 最新支援的下載。
注意:如果您在具有不受信任輸入的共用環境中使用工具鏈,請確保它已充分沙箱化。
要使用工具鏈,您需要在命令列上提供以下選項:
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
的 multilib 系統會根據您的編譯標誌自動選擇一組合適的函式庫。如果找不到合適的庫集, clang
將發出警告。
若要顯示 multilib 系統選擇的目錄,請將標誌-print-multi-directory
新增至clang
命令列選項。
要顯示所有可用的 multilib,請使用-print-multi-lib
標誌和一個目標三元組(如--target=aarch64-none-elf
或--target=arm-none-eabi
運行clang
。
clang
可能會選擇一組不是您想要使用的函式庫。在這種情況下,您可以透過提供--sysroot
選項指定包含要使用的函式庫的include
和lib
目錄的目錄來繞過 multilib 系統。例如:
$ 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 專案中對應最佳化過程的原始程式碼以了解更多資訊。也鼓勵使用者創建自己的配置並調整自己的標誌參數。有關 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 提出問題。
詳情請參閱貢獻指南。