Arm Compiler 6.16のリリースノート
目次
1. 紹介
Arm Compiler は、ベアメタルソフトウェア、ファームウェア、およびリアルタイムオペレーティングシステム(RTOS) アプリケーションを開発するための、Arm の最新の組み込みC/C++コンパイルツールチェインです。
Arm Compiler は、Arm アーキテクチャの最新のアーキテクチャ機能と拡張のために、最も早く、最も完全で、正確なサポートを提供します。 開発中のものも含め、すべての最新のArm プロセッサをサポートします。 強力な最適化手法と最適化されたライブラリを通して、Arm Compiler は組み込みシステム開発者が挑戦的なパフォーマンス目標とメモリ制約を満たすことを可能にします。
Arm Compiler は、自動車(ISO 26262)、家電、産業(IEC 61508)、医療(IEC 62304)、ネットワーク、鉄道(EN 50128)、ストレージ、通信など、さまざまな業界のリーディングカンパニーで使用されています。
long-term maintenanceまたは機能安全要件を備えたプロジェクトでは、認証バージョンのArm Compiler の使用を検討してください。
Arm Compiler 6.16 は、2021年03月現在の最新リリースであり、それ以前のリリースの置き換えとなります。
Arm Compiler 6.16のキーとなる機能は以下の通りです:
- 最近リリースされたプロセッサ:
- Cortex-A78、Cortex-A78AE、Cortex-R52+のサポート
- A アーキテクチャプロファイルにおける将来的なアーキテクチャテクノロジのearlyサポート:
- Branch Record Buffer Extensions(BRBE) のアセンブリ
- Armv8.7-A:
- アセンブリのサポート
- オプションのAccelerator Support Extension用組み込み関数のサポート
- Armv8.2-A:
- オプションのFlag Manipulation命令のサポート
- オプションのPointer Authentication Extensionのサポート
- C++ ライブラリに使用されるApplication Binary Interface(ABI) の更新
Arm Compiler 6.16は以下のように使用されることを意図しています:
- Arm Development Studioに組み込み使用
- Keil MDKに組み込み使用
- 適切なツールキット用ライセンスを用いて、スタンドアロンでツールチェインをインストールして使用
ライセンスの購入についてはご購入前の製品・サービスに関するお問い合わせ(Arm純正開発ツール)へご連絡ください。
ライセンスの管理およびトラブルシューティングは以下のArm社webサイトをご覧いただくか、
https://developer.arm.com/support/licensing
弊社FAQのwebサイトをご覧ください。
フローティングライセンスをご使用の場合は、armlmdおよびlmgrdをversion 11.14.1.0以降にアップデートする必要があります。ARMでは、常にhttps://developer.arm.com/products/software-development-tools/license-management/downloadsから入手できる最新バージョンのライセンスサーバーソフトウェアを使用することをお勧めします。
1.1 Arm Compiler 6 ツールチェイン
Arm Compiler 6.16は以下を含みます。
- armclang:LLVMとClangテクノロジをベースとしたコンパイラおよび統合アセンブラ
- armasm:armasm-syntaxアセンブリコード用のアセンブラ。新しいアセンブリファイルではarmclang統合アセンブラの使用を推奨
- armar:ELFオブジェクトファイル群をまとめるアーカイバ
- armlink:オブジェクトやライブラリをまとめ、実行可能形式を生成するリンカ
- fromlef:イメージ変換ユーティリティ兼逆アセンブラ
- Arm C++ libraries:LLVM libc++プロジェクトベースのライブラリ
- Arm C libraries:組込みシステム向けのランタイムサポートライブラリ
1.2 Arm Compiler 6.16 でサポートされたこと
Arm Compiler は、Arm Development Studio(Arm DS)やKeil Microcontroller Development Kit(MDK)などのArm開発スイートの一部として提供されています。
お手持ちのツールのライセンスに従い、Armコンパイラ6.16は次のArmアーキテクチャとプロセッサのサポートを提供します:
アーキテクチャ | プロセッサ* |
将来のアーキテクチャ | - |
8.7-AまでのArmv8-A | Neoverse V1/N2/N1/E1 |
Cortex-X1/A78C/A78AE/A78/A77/76AE/76/75/73/72/65AE/65/57/55/53/35/34/32 | |
Armv7-A | Cortex-A17/15/12/9/8/7/5 |
Armv8-R | Cortex-R82/R52/R52+ |
Armv7-R | Cortex-R8/7/5/4F/4 |
8.1-MまでのArmv8-M | Star |
Cortex-M55/M35P/33/23 | |
Armv7-M | SC300 |
Cortex-M7/4/3 | |
Armv6-M | SC000 |
Cortex-M1/0/0+ |
アーキテクチャとプロセッサのサポートレベルの詳細については、開発スイートのドキュメントを参照してください。
- Arm DS : https://developer.arm.com/tools-and-software/embedded/arm-development-studio
- Keil MDK : https://developer.arm.com/tools-and-software/embedded/keil-mdk
Arm Compiler 6.16のダウンロードおよびArm DSまたはKeil MDKとともに使用する場合の設定方法については以下のサイトをご参照ください:
https://developer.arm.com/tools-and-software/embedded/arm-compiler/downloads/version-6
* 将来のアーキテクチャテクノロジおよび特定のプロセッサのサポートは、Arm DS Platinum Editionの一部としてのみ利用できます。Arm DS Platinum Editionは、最新のIPを開発するArmパートナー向けにデバイスがリリースされる前の開発用にのみ提供されています。Arm DS Gold Editionのすべての機能が含まれ、さらにArmから発表された最新のIPをサポートしています。詳細については、弊社ご購入前の製品・サービスに関するお問い合わせ(Arm純正開発ツール) までお問い合わせください。
2. インストール方法
Arm Compiler 6.16が、ツールキット(例:Arm Development Studio)の一部として含まれている場合、ツールキットのインストーラがインストレーションプロセスを処理します。ツールキットのインストレーション方法を参照してください。
その他のケースの場合、Arm Compiler 6.16をどのように使用するかに依存して適切なインストレーションの場所を選択する必要があります:
- Arm Development Studio 2018.0 以降へ統合
- Keil MDK 5.22 以降へ統合
- スタンドアロン製品として使用
Keil MDKを使用していない場合は、Arm Compiler 6.16はデフォルトのインストレーションディレクトリを含む、その他任意の場所にインストールすることができます。ただし、Arm Development Studio製品のインストールディレクトリ外でなければなりません。
コンフィギュレーションの手順については以下のArm社サイトの手順に従ってください:
https://developer.arm.com/tools-and-software/software-development-tools/license-management/resources/product-and-toolkit-configuration
※本内容は弊社FAQページでも日本語での解説を行っております。内容の一部は保守契約ユーザ様にのみ公開をしておりますのであらかじめFAQページにログインの上ご参照ください:
Arm Compilerを呼びだす環境別のライセンスおよび設定について
2.1. Arm Development Studio 2018.0 以降への統合
Arm Compiler 6.14.1 は、Arm Development Studioのデフォルトのインストレーションディレクトリを含む、その他任意の場所にインストールすることができます。
https://developer.arm.com/docs/101470/latest/configure-arm-development-studio/register-a-compiler-toolchain
で示す方法に従って、ツールチェーンをArm Development Studio 2018.0以降に統合することができます。
2.2. Keil MDK 5.22 以降への統合
Arm Compiler 6.16はKeil MDKインストレーションのARMサブディレクトリ以下にインストールする必要があります。たとえば、Keil MDKインストレーションがC:Keil_v5の場合、C:Keil_v5ARMARMCompiler6.16へインストールすることをおすすめします。
インストール後、
http://www.keil.com/support/man/docs/uv4/uv4_armcompilers.htm
のチュートリアルで示す方法に従って、MDKのプロジェクトへツールチェーンの統合が可能です。
Arm Compiler 6.16 32-bit Windowsバージョンのみが、Keil シングルユーザライセンスまたはKeil フローティングユーザライセンスと一緒に使用できます。
MDK-Armのライセンスを使用する場合、Arm Compiler 6.16は Windows環境のみサポートします。
2.3. スタンドアロン製品として使用
環境変数ARMLMD_LICENSE_FILEがライセンスファイルまたはライセンスサーバーを指していることを確認してください。
2.4. Linuxへのインストール
Arm Compiler 6.16は、以下のサポート済み64-bitプラットフォームでテストされています:
- Red Hat Enterprise Linux 7 Workstation, 64-bit only
- Red Hat Enterprise Linux 8 Workstation, 64-bit only
- Ubuntu Desktop Edition 16.04 LTS, 64-bit only
- Ubuntu Desktop Edition 18.04 LTS, 64-bit only
- Ubuntu Desktop Edition 20.04 LTS, 64-bit only
Arm Compiler 6.16 は、古いプラットフォームでは動作しません。
Arm Compiler 6.16 をインストールするには、install_x86_64.sh を実行( sourceではありません) し、画面の指示に従ってください。インストーラは、Arm Compiler 6.16 をお客様が指定したディレクトリに解凍します。
armclang バイナリは、お客様の指定したディレクトリ内にArm Compiler 6.16 の一部としてインストールされたlibstdc++のコピーへ動的にリンクされています。
2.5. Windowsへのインストール
Arm Compiler 6.16 は、以下のサポート済み64-bitプラットフォームでテストされています:
- Windows Server 2012
- Windows Server 2016
- Windows 8.1
- Windows 10
Arm Compiler 6.16 は、古いプラットフォームでは動作しません。
Arm Compiler 6.16 は、Windows 10 v1909上でテストされています。以降のアップデートでも問題なく動作することが期待されます。
Windows 64-bitホストプラットフォーム上でArm Compiler 6.16 をインストールするために、win-x86_64setup.exeを実行し、画面の指示に従ってください。
Windows 32-bitホストプラットフォーム上でArm Compiler 6.16 をインストールするために、 win-x86_32setup.exeを実行し、画面の指示に従ってください。
以前のバージョンのArm Compiler 6 がすでにインストールされており、アップグレードしたい場合は、以前のバージョンを一旦アンインストールしてから新しいバージョンのArm Compiler 6 をインストールいただくことを推奨します。
Arm Compiler 6.16 はMicrosoft Visual Studio 2017で構築されており、WindowsのUniversal C Runtimeをインストールする必要があります。詳細な情報は、
https://support.microsoft.com/en-gb/help/2999226/update-for-universal-c-runtime-in-windows
をご確認ください。
3. アンインストール
Linuxでは、Arm Compiler 6.16 インストールディレクトリを削除してください。
Windowsでは、コントロールパネルのプログラムの追加と削除からArm Compiler 6.16 を選択し、アンインストールボタンを押下してください。
4. ドキュメンテーション
Arm Compiler 6.16 のドキュメントは以下が利用可能です。
- User Guide
- Reference Guide
- Arm C and C++ Libraries and Floating-Point Support User Guide
- Migration and Compatibility Guide
- Errors and Warnings Reference Guide
5. フィードバックとサポート
お客様からのフィードバックは我々にとって重要です。
製品のあらゆる局面において、欠陥報告と改善に関する提案を歓迎します。フィードバックあるいはサポートについて、お客様の製品の購入元あるいは、
https://support.developer.arm.com
へご連絡ください。
必要に応じて、ツールからの--vsnの出力、問題を再現するのに必要なソースコードおよびその他のファイルとコマンドラインを提供してください。
当社へのお問い合わせは、こちら。
6. リリース履歴と変更
以下に、Arm Compiler 6.16 シリーズのリリース日付を示します:
- 6.16 (2021年03月にリリースされました)
以下に、前回のリリースと比較した場合の新しい機能と修正された不具合の概要を示します。
この情報には、技術的な不正確さや組版上の誤りが含まれている可能性があり、リリースノートの将来の版で変更される可能性があります。
それぞれの変更点には、ユニークな識別子SDCOMP-が割り振られています。
もしArmへこのリリースノート内の特定の問題について連絡が必要な場合、適切な識別子を通知してください
Arm Compiler 6.16 での変更点
以下に直前のリリースであるArm Compiler 6.15からの変更点を示します。
Arm Compiler 6.16 での一般的な変更
- [SDCOMP-57434] Armv8.7-A に対するオプションのAccelerator Support Extensionのアセンブリおよび組み込み関数のサポートが追加されました。Armv8.7-A をターゲットとしてAccelerator Support Extension を使用するには以下のarmclangオプションを使用してください:
-
- --target=aarch64-arm-none-eabi -march=armv8.7-a+ls64
-
- [SDCOMP-57433] A アーキテクチャプロファイルにおける将来的なアーキテクチャテクノロジとなるBRBE(Branch Record Buffer Extensions)のearlyサポートがアセンブリに追加されました。BRBEをターゲットとするには以下のarmclangオプションを使用してください:
-
- --target=aarch64-arm-none-eabi -march=armv8-a+brbe
-
- [SDCOMP-57389] Armv8.2-A 以降に対するオプションのFlag Manipulation 命令のサポートが追加されました。Armv8.2-A 以降をターゲットとしてこれらの命令を使用するには以下のarmclangオプションを使用してください:
- Arm v8.-A のAArch64をターゲットとするには--target=aarch64-arm-none-eabi -march=armv8.-a+flagmを使用。は2以上。
- [SDCOMP-57387] Armv8.2-A 以降に対するオプションのFPointer Authentication Extensionのサポートが追加されました。Armv8.2-A 以降をターゲットとしてこのExtensionを使用するには以下のarmclangオプションを使用してください:
- Arm v8.-A のAArch64をターゲットとするには--target=aarch64-arm-none-eabi -march=armv8.-a+pauthを使用。は2以上。
- [SDCOMP-57209] Cortex-R52+ プロセッサのサポートが追加されました。 Cortex-R52+ をターゲットとして特定の機能セットをコンフィギュレーションするには、以下のオプションから選択します:
D16 Single-Precision FPU Advanced SIMD Extension RAS Extension armclang armlinkとfromelf あり あり あり -mcpu=cortex-r52plus+ras --cpu=Cortex-R52plus あり あり なし -mcpu=cortex-r52plus --cpu=Cortex-R52plus あり なし あり -mcpu=cortex-r52plus+ras --cpu=Cortex-R52plus.no_neon --fpu=FPv5-SP あり なし なし -mcpu=cortex-r52plus --cpu=Cortex-R52plus.no_neon --fpu=FPv5-SP なし なし あり -mcpu=cortex-r52plus+ras --cpu=Cortex-R52plus.no_neon --fpu=softvfp なし なし なし -mcpu=cortex-r52plus --cpu=Cortex-R52plus.no_neon --fpu=softvfp
- [SDCOMP-57085] Cortex-A78C プロセッサのサポートが行われました。Cortex-A78Cをターゲットとするには以下のarmclangオプションから選択してください:
-
- AArch64状態では--target=aarch64-arm-none-eabi -mcpu=cortex-a78c
- AArch32状態では--target=arm-arm-none-ebei -mcpu=cortex-a78c
-
- [SDCOMP-56239] Armv8.7-A アーキテクチャのアセンブリを完全にサポートしました。Armv8.7-Aをターゲットとするには以下のarmclangオプションから選択してください:
- AArch64状態では--target=aarch64-arm-none-eabi -march=armv8.7-a
- AArch32状態では--target=arm-arm-none-eabi -march=armv8.7-a
Arm Compiler 6.16 での機能改善
ライブラリとシステムヘッダ
- [SDCOMP-57309] 以前は、std::deque およびstd:queue のArm C++ ライブラリ実装では、T 型の16 要素分または4096 バイトのいずれかのうち最大となるサイズを最小サイズのブロック単位としてメモリが割り当てられていました。 この動作は変更され、メモリは、T 型の8 要素分または64 バイトのいずれかのうち最大となるサイズを最小サイズのブロック単位として割り当てられるようになりました。 これにより、割り当てられるメモリの量を減らすことができます。
- [SDCOMP-51880] C++ ライブラリおよびlibc++で使用されるApplication Binary Interface (ABI) のバージョン() は、version 2 になりました。 Arm Compiler 6.15 以前を使用してビルドされたC++ オブジェクトまたはライブラリは、6.16 を使用してビルドされたC++ オブジェクトまたはライブラリとの互換性が保証されません。C++ オブジェクトおよびライブラリがArm Compiler 6.16 と互換性があることを保証するには、6.16 を使用してすべてのC++ コードをリビルドする必要があります。 詳細については、Migration and Compatibility GuideのC++ library changesのセクションを参照してください。
Arm Compiler 6.16 で修正された不具合
コンパイラと統合されたアセンブラ(armclang)
- [SDCOMP-57379] volatile ビットフィールドへのアクセスに誤ったコードを生成する可能性がありました。
- [SDCOMP-57168] 次の致命的なエラーを誤ってレポートすることがありました:
-
- error in backend: Error while trying to spill LR from class GPR: Cannot scavenge register without an emergency spill slot.
-
- [SDCOMP-57011] T32 状態用にコンパイルする場合、関数にテイルコール最適化を適用する際に誤ったコードを生成する可能性がありました。
- [SDCOMP-56288] __attribute__((section("name"))) を使用して同じセクションに関数と変数を配置した場合、エラーのレポートに失敗をしたり、以下の致命的なエラーのいずれかを誤ってレポートする可能性がありました:
- error in backend: '
- error in backend: invalid symbol redefinition.
-
- '' causes a section type conflict with ''.
- '' causes a section type conflict with ''.
- [SDCOMP-56235] 定数プールが後に続く関数のデバッグ情報に対して、誤ったDW_AT_high_pc エントリを含むオブジェクトファイルを生成する可能性がありました。
- [SDCOMP-56105] コンパイラは誤って以下のエラーをレポートする可能性がありました。
-
- out of range pc-relative fixup value.
-
- [SDCOMP-55371] stdio.h システムヘッダで定義されている関数の呼び出しに対して誤ったコードを生成する可能性がありました。
- [SDCOMP-54072] Procedure Call Standard for the Arm Architecture ABI では、書き込み前にvolatile ビットフィールドコンテナがロードされている必要があります。コンパイラがこの要件を正しく満たしていませんでした。プログラムが古いコンパイラの動作に依存している場合は、[COMMUNITY] オプションである-fno-aapcs-bitfield-load を指定してコンパイルしてください。
以前のリリースのProcedure Call Standard for the Arm Architecture ABI では、ビットフィールドコンテナのタイプに適したアクセス幅を使用してvolatile ビットフィールドにアクセスする必要がありました。
たとえば、ABI では、int コンテナを持つvolatile ビットフィールドに32 ビットアクセス幅を使用する必要がありました。 しかしABI は変更されました。
ビットフィールドコンテナが非ビットフィールドメンバとオーバーラップするか、または他の2 つのビットフィールドの間に配置されたゼロ長ビットフィールドの場合volatile ビットフィールドには、ビットフィールドコンテナのタイプに適したアクセス幅を使用してアクセスする必要がなくなりました。コンパイラは、この変更された要件に準拠するようになりました。
プログラムが古いコンパイラの動作に依存している場合は、[COMMUNITY] オプション-fno-aapcs-bitfield-width を指定してコンパイルします。 - [SDCOMP-53818] Armv6-M またはMain ExtensionなしのArmv8-M をターゲットにして-O0 でコンパイルすると、h 制約コードを持つ入力オペランドを含むインラインアセンブリ式に対して誤ったコードを生成する可能性がありました。
- [SDCOMP-51315] -O0 以外の最適化レベルでAArch64 状態用にコンパイルすると、誤ったコードを生成する可能性がありました。
- [SDCOMP-50955] ビットフィールドに値を代入すると、ビットフィールドで表現できない値の変換に失敗する可能性がありました。この問題は修正され、影響を受ける可能性のあるコードの場合、コンパイラは以下の警告を正しくレポートします:
-
- implicit truncation from '' to bit-field changes value from to [-Wbitfield-constant-conversion].
-
- [SDCOMP-50060]範囲宣言でthread_local ストレージクラス指定子が使用されているときに、範囲ベースのfor 文のエラーを誤ってレポートしませんでした。次のエラーを報告するようになりました:
- loop variable '' may not be declared 'thread_local'.
リンカ(armlink)
- [SDCOMP-57231] 4 バイトの倍数の相対ベースアドレスを持つ実行リージョンのアライメントに失敗する可能性がありました。
- [SDCOMP-57018] 4 バイトの倍数ではない絶対ベースアドレスを持つ実行リージョンのエラーを誤ってレポートしませんでした。次のエラーをレポートするようになりました:
-
- L6244E: Exec region<name>address (<address>) not aligned on abyte boundary.
-
- [SDCOMP-56263] S が実行リージョン内の最初の出力セクションでない場合、誤ってRW またはZI 出力セクションS を4 バイトの境界にアラインできないことがありました。
- [SDCOMP-49941] LTO を有効にしてリンクし、入力オブジェクトに$Sub$のプレフィックスシンボル名が含まれている場合、リンカが次のエラーを誤って報告する可能性があります:
-
- L6137E: Symbol $Sub$$<Symbol> was not preserved by the LTO codegen but is needed by the image.
-
- [SDCOMP-46595] ダイナミックリンク中に、異なるシンボル可視性を持つ異なる入力ファイルに表示されるシンボルに対して、リンカが最も制約の強いシンボル可視性を誤って使用する可能性があります。
ライブラリとシステムヘッダ
- [SDCOMP-57176] 文字列をdouble 型またはlong double 型の値に変換する特定の関数のArm C ライブラリ実装は、不正な結果を返す可能性がありました。
- [SDCOMP-51923] Arm C++ ライブラリで、std::pointer_safety がスコープ付きの列挙型として正しく定義されていませんでした。
- [SDCOMP-50015] C++ 標準ライブラリのArm 実装で、std::regex_constants::ECMAScript 定数がゼロと誤って定義されていました。
Fromelf
- [SDCOMP-56902] -g を使用してDWARF 4 デバッグ情報を含むELF 形式の入力ファイルを処理すると、debug_lineセクションの出力に失敗することがありました。
- [SDCOMP-50938] --bincombined オプションを使用したELF 形式の入力ファイルを処理する場合、無効なバイナリファイルを生成し、次のいずれかを誤ってレポートする可能性がありました:
- Internal fault: [0x6abbc1:< ver >].
- Internal fault: [0x7a1b3a:< ver >].
Arm Compiler 6.16 の既知の不具合
- [SDCOMP-49441] Arm Compiler に付属のC++ ライブラリとリンクする場合、リンカオプションで--cpu=name のname にArmv8-R ターゲットを指定し、このとき入力オブジェクトがArmv8-R ターゲットのC++ ソース言語モードでコンパイルされていると、リンカは次のエラーを誤ってレポートすることがあります:
- L6366E:<object> attributes are not compatible with the provided attributes.
これを避けるには--cpuなしでリンクします。 - [SDCOMP-54724] 特定の環境下で、-ffixed-r6 オプションを使用したコンパイル時、コンパイラはスタックのアライメント要件を満たさないコードを生成する可能性があります。
- [SDCOMP-50470] コンパイラは_Float16 データ型の不正なデフォルト引数の拡張を含む関数呼び出しのエラーのレポートに失敗します。