このリポジトリには、以下に基づいて Arm をターゲットとするベアメタル LLVM ベースのツールチェーンを構築するためのビルド スクリプトと補助マテリアルが含まれています。
目標は、Armv6-M 以降の Arm アーキテクチャ ファミリをターゲットにできる LLVM ベースのベアメタル ツールチェーンを提供することです。ツールチェーンは Arm アーキテクチャの ABI に従い、組み込みおよびリアルタイム オペレーティング システムに必要な一般的な機能を提供しようとします。
C++ は、LLVM の libc++ および libc++abi の使用により部分的にサポートされます。サポートされていない機能には次のものがあります。
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++ 再頒布可能パッケージの最新のサポート対象ダウンロードなどから、適切な最新のサポート対象 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
の multilib システムは、コンパイル フラグに基づいて適切なライブラリのセットを自動的に選択します。適切なライブラリのセットが見つからない場合、 clang
警告を発します。
multilib システムによって選択されたディレクトリを表示するには、 clang
コマンド ライン オプションにフラグ-print-multi-directory
追加します。
利用可能なすべてのマルチライブラリを表示するには-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 という 2 つの構成ファイルがパッケージ化されています。これらの構成ファイルを使用すると、いくつかのビルド最適化フラグが有効になり、一般的な組み込みベンチマークで最高のパフォーマンスを達成できます。 OmaxLTO.cfg は、リンク時最適化 (LTO) 固有のフラグを有効にします。これらの構成は、 --config
フラグを使用してオプションで渡すことができます。例えば:
$ clang
example.c
...
--config=Omax.cfg
--config=OmaxLTO.cfg
-o example
Omax.cfg が-ffast-math
有効にすることにより、IEEE 準拠に違反し、コードの正確さに影響を与える可能性のある数学的最適化が有効になることをユーザーに警告する必要があります。リンク時間の増加やリンク中のメモリ使用量の増加の可能性があるため、ユーザーは LTO を望まない可能性があるため、LTO は OmaxLTO.cfg に個別に保存されます。構成ファイル内のオプションの一部は、文書化されていない内部 LLVM オプションです。これらの文書化されていないオプションについては、LLVM プロジェクトの対応する最適化パスのソース コードを参照して詳細を確認してください。ユーザーには、独自の構成を作成し、独自のフラグ パラメーターを調整することも推奨されます。 Arm 固有の最適化フラグ用の LLVM 組み込みツールチェーンに関する情報は、「最適化フラグ」で入手できます。
Arm 用 LLVM 組み込みツールチェーンのバイナリ リリースは、上流の LLVM プロジェクトのリリース ブランチに基づいているため、一致するバージョンの LLVM リリースによって提供されるすべてのツールで安全に使用できます。
Arm GNU ツールチェーンに依存する既存のプロジェクトで Arm 用 LLVM 組み込みツールチェーンを使用する場合のアドバイスについては、「Arm GNU ツールチェーンからの移行」および「実験的 newlib サポート」を参照してください。
注:
picolibc
Arm GNU ツールチェーンの優れたサポートを提供するため、Arm GNU ツールチェーンと Arm 用 LLVM 組み込みツールチェーンの両方を使用する必要があるプロジェクトでは、picolibc
またはnewlib
いずれかを選択できます。
Arm 用 LLVM Embedded Toolchain はオープン ソース プロジェクトであるため、ソースから構築できます。詳細な手順については、「ソースからのビルド」ガイドを参照してください。
Github の問題経由で問題を提起してください。
詳細については、投稿ガイドをご覧ください。