パッチプログラムをダウンロードするには、事前にARM社のコネクトサービスのアカウントを取得し、ログインしておく必要があります。アカウントの取得は以下のURL から無償で行う事ができます:
https://login.arm.com/register.php
ARM Compiler toolchain v6.01(build 22)
はじめに
ARM Compiler 6.01 はARMv8-A およびARMv7-A のアーキテクチャをサポートし、DS-5とともに使用することでARMv8-A またはARMv7-A の実行可能コードのビルドおよびデバッグが可能です。このリリースではAArch32 またはAArch64をターゲットとしたARMv8-A またはARMv7-A 向けベアメタルアプリケーションの実行可能バイナリをビルドするために必要なすべてのツールを含んでいます。ARM Compiler 6.01 ではARMv7-A アーキテクチャおよびCortex-A ファミリのプロセッササポートが追加されています。このリリースに含まれる新しい機能として、位置独立な実行可能イメージの生成、UEFIコードベースのビルドのサポート、Link Time 最適化の初期サポートがあります。ARM Compiler 6.01 ではARMv7-R、ARMv7-M およびARM v6-M アーキテクチャに対するアルファサポートも含んでいます。
ARM Compiler 6 の構成
[Compiler]- armclang はarmcc の後継であり、LLVM テクノロジをベースとしています。armclangでは現状、ARMv8-A およびARMv7-A アーキテクチャプロファイルをサポートします。将来のリリースではその他のARM アーキテクチャサポートも追加される予定です。ARM Compiler 5 およびそれ以前のバージョンからの移行に関する情報については、製品ドキュメントに含まれるMigration and Compatibility Guide をご参照ください。
[armlink、armasm、fromelf、armar]
- armlink、armasm、fromelf およびarmar は完全ではありませんがARM Compiler 5 同様ARMv8-A をサポートするようになりました。製品ドキュメントに含まれるMigration and Compatibility Guide をご参照ください。
- アセンブラに関する注意事項
- ARM Compiler 6 ではGNU とARM Compiler ツールチェイン間での移植性を改善のため、よりGNU アセンブラの書式により近くなるようにLLVM 統合アセンブラを採用しています。LLVM 統合アセンブラではarmclangからデフォルトで呼び出されます。そのため、旧armcc のインラインまたは組み込みアセンブラを含むC/C++ のソースファイルがARM Compiler 6 でコンパイルできないという副作用があります。
- armasm はデフォルトで呼び出されませんが、旧armasm の書式で記述されたアセンブラファイルをアセンブルするためにARM Compiler 6 内に含まれています。
[組み込みシステム向けARM C およびC++ ライブラリ]
- 標準のARM Compiler 組み込みライブラリは完全ではありませんがARM Compiler 5 同様ARMv8-A をサポートするように拡張済みです。製品ドキュメントに含まれるMigration and Compatibility Guide をご参照ください。
ARM Compiler 6.01 でのサポート
アーキテクチャとプロセッサ | サポートレベル |
ARMv8-A と準拠するプロセッサ | サポート済み |
ARMv7-A と準拠するプロセッサ | サポート済み |
ARMv7-R、ARMv7-M、ARMv6-M および準拠するプロセッサ | アルファサポート-将来のリリースでサポート 現状はARM Compiler 5 の使用を検討してください |
ARMv6-M 以前のアーキテクチャ | 未サポート ARM Compiler 5 をご使用ください |
サポートレベル | 詳細 |
サポート済み | 製品品質を保ち、一番高位のサポート優先度 |
ベータ | 実装は完了済みだが、テストは部分的。お客様の試用とフィードバックを歓迎 |
アルファ | 実装は未完了でテストは部分的 お客様の試用とフィードバックを歓迎 |
未サポート | 機能がツールチェインに含まれていないか非推奨になっており、テストは未実施 使用する場合は完全な自己責任 |
インストール手順
ARM Compiler 6.01 単体のインストールを行うには以下の手順に従ってください。例えばDS-5 のようなツールキットの一部としてARM Compiler 6.01 が提供されている場合は、インストールはツールキット側のインストーラで対応しています。そのような場合はツールキットのインストール手順に従ってください。サポートされるOSプラットフォーム
ARM Compiler 6.01 は以下のプラットフォームをサポートしています。
- Red Hat Enterprise Linux 5 32-bit and 64-bit
- Red Hat Enterprise Linux 6 64-bit
- Red Hat Enterprise Linux 7 64-bit
- Ubuntu Desktop Edition 12.04 LTS 32-bit and 64-bit
- Ubuntu Desktop Edition 14.04 LTS 64-bit
- Windows 7 32-bit and 64-bit
- Windows 8 64-bit
- Windows 2012 Server 64-bit
[Linux でのインストール]
ARM Compiler 6.01 をLinux にインストールするには、(source ではなく)64-bit Linux ホスト環境ではinstall_x86_64.sh を、32-bit Linux ホスト環境ではinstall_x86_32.shを実行し、スクリーン上の手順に従ってください。インストーラは選択したディレクトリにARM Compiler 6.01 を解凍します。
-
●依存性について
armclang バイナリはARM Compiler 6.01 の一部としてインストール時に指定されたディレクトリ内にインストールされるlibstdc++ のコピーと動的にリンクされます。
インストールされる一部のツールは32-bit システムライブラリに対する依存性があります。ARM Compiler 6.01 を64-bit Linux ホストプラットフォームにインストールした場合、32-bit互換ライブラリがインストールされていることを確認する必要があります。32-bit互換ライブラリがインストールされていない場合、ARM Compiler 6.01 ツールの実行に失敗したり、ライブラリが見つからない為にエラーがレポートされる可能性があります。要求されるライブラリをインストールするにはroot権限を用いてプラットフォームに応じた適切なコマンドを実行してください:
Red Hat
yum install glibc.i686
Ubuntu
apt-get install lib32stdc++6
[Windowsでのインストール]
ARM Compiler 6.01 をWindows にインストールするには、64-bit Windows ホスト環境ではwin-x86_64setup.exe を、32-bit Windows ホスト環境ではwin-x86_32setup.exe を実行し、スクリーン上の手順に従ってください。以前のバージョンのARM Compiler 6 がすでにインストールされており、アップグレードしたい場合は、以前のバージョンを一旦アンインストールしてから新しいバージョンのARM Compiler 6 をインストールいただくことを推奨します。
インストールされる一部のツールはmsvcp110.dll およびmsvcr110.dll のVisual C++ ランタイムライブラリに対する依存性があります。ツールキットのインストーラはそれらが有効でない場合、インストールの際に対処します。
[インストール後]
ARM Compiler 6.01 はライセンス管理される製品であり、DS-5 およびARM Compiler ライセンスの両方とともに動作します。
- DS-5 Ultimate ライセンスではすべての機能が使用できます
- DS-5 Professional または ARM Compiler ライセンスではARMv8 を除くすべての機能が使用できます
ライセンスの取得については弊社または]license.support@arm.com にお問い合わせください。
ARMLMD_LICENSE_FILE 環境変数がライセンスファイルを指すように設定して下さい。Windows 環境ではpath の設定にダブルクォートを含む必要がないことに注意してください。スペースを含むpath はダブルクォートがなくとも動作します。
[アンインストール]
ARM Compiler 6.01 をWindows 上からアンインストールするにはコントロールパネルの"プログラムと機能"の"プログラムのアンインストール"でARM Compiler 6.01 を選択してアンインストールボタンをクリックします。
ARM Compiler 6.01 をLinux 上からアンインストールするには、インストールディレクトリを削除します。
単純なプログラムのビルド
ベアメタルAArch64 システム用の非常に単純なプログラムをコンパイルするには:- (Unix) echo "int main() {}" > simple.c
- (Windows) echo int main() {} > simple.c
- (両システム) armclang --target=aarch64-arm-none-eabi simple.c -o simple
armclang はClang コンパイラと同じオプションが使用できます。より詳細についてはhttp://clang.llvm.org/docs/UsersManual.html をご参照ください。旧バージョンのARM Compiler に対する下位互換性のため、一部のarmcc コマンドラインオプションをarmclang コマンドラインオプションに変換するコマンドライン変換ツールを提供しています。製品ドキュメントに含まれるMigration and Compatibility Guide をご参照ください。
ドキュメンテーション
以下のドキュメンテーションがARM Compiler 6.01 用に提供されます:- armar User Guide
- armasm Reference Guide
- armasm User Guide
- armclang Reference Guide
- armlink Reference Guide
- armlink User Guide
- fromelf User Guide
- ARM C and C++ Libraries and Floating-Point Support Reference Guide
- ARM C and C++ Libraries and Floating-Point Support User Guide
- Errors and Warnings Reference Guide
- Getting Started Guide
- Migration and Compatibility Guide
- Software Development Guide
ARM Compiler v6.01(Build 22) 改善と訂正
v6.01での一般的な変更
- [SDCOMP-25860]ARM Compiler 6.01 はFlexNet Publisher 11.12.1.0クライアントライブラリを含みます。このバージョンのライセンスクライアントは以前のバージョンのFlexNet Publisherライセンスサーバソフトウェアと互換性がありません。:
- ARM Compiler 6.01 は11.12.1.0以前のバージョンのarmlmd またはlmgrd がライセンスサーバで実行されている場合、FLEXnet Licensing error:-7,10015をレポートします。
- version 11.12.1.0以降のarmlmdおよびlmgrdが実行されているライセンスサーバはARM Compiler 6.01 およびそれ以前のARMツールと互換性があります。
- [SDCOMP-26207] --targetコンパイラオプションは必須となりました。このオプションなしでコンパイルした場合、fatal error: no target architecture given, use --target=tripleを引き起こします。--targetオプションについてはARM Compiler armclang Reference Guideをご参照ください。
- [SDCOMP-25289] -mfpu=none コンパイラオプションはサポートされなくなりました。代わりに、AArch32 用としては-mfloat-abi=soft を、AArch64 用としては-mcpu=
+nofp+nosimd を使用してください。-mfloat-abi および-mcpu オプションについてはARM Compiler armclang Reference Guideをご参照ください。 - [SDCOMP-24434] ARM Architecture Reference Manual for ARMv8-Aでは以下の記述があります:
"The ARMv8 AArch64 architecture permits instruction accesses to Non-cacheable Normal memory to be held in instruction caches. Correspondingly, the sequence for ensuring that modifications to instructions are available for execution must include invalidation of the modified locations from the instruction cache, even if the instructions are held in Normal Non-cacheable memory. This includes cases where the instruction cache is disabled."
AArch64 命令キャッシュをスキャッタローディングの後、且つスタックとヒープの初期化の前に無効化するには以下を行います:
- _platform_pre_stackheap_init内で命令キャッシュの無効化コードを実装します。
- プログラムのエントリから_platform_pre_stackheap_initを含む時点までのすべてのコードがルートリージョンに配置されることを保証してください。これは、AArch64 ARM C ライブラリの__rt_entry を含みます。
- [SDCOMP-26514] ARM Compiler 6.01 では以下の64-bit ホストプラットフォームのサポートが追加されました:
- Red Hat Enterprise Linux 7
- Ubuntu Desktop Edition 14.04 LTS
- Red Hat Enterprise Linux 5 Desktop with Workstation option
- Ubuntu Desktop Edition 12.04 LTS
- Windows 7 Enterprise Edition SP1
- Windows 7 Professional Edition SP1
v6.01での改善
- [SDCOMP-26554] integrated assembler はAArch32 Virtualization 命令のERET、HVC、MRS (Banked register)および MSR (Banked register)をサポートします。
- [SDCOMP-26333] AArch32 ベアメタルPosition Independent Executables のサポートが追加されました。この機能を有効にするには以下のオプションを使用します:
- -fbare-metal-pie
- [SDCOMP-25959] big-endian データのサポートが追加されました。この機能を有効にするには以下のオプションを使用します:
- -mbig-endian
- [SDCOMP-25957] integrated assembler はAArch64用にLDR Rd, =const 疑似命令をサポートします。
- [SDCOMP-25956] 以下のオプションのサポートが追加されました:
- -fshort-wchar
- -fshort-enums
- [SDCOMP-25688] link time optimization のサポートが追加されました。この機能を有効にするには以下のオプションを使用します:
- -flto
- [SDCOMP-26551] 以下のELF64 グループリロケーションのサポートが追加されました:
- 287 (R_AARCH64_MOVW_PREL_G0)
- 288 (R_AARCH64_MOVW_PREL_G0_NC)
- 289 (R_AARCH64_MOVW_PREL_G1)
- 290 (R_AARCH64_MOVW_PREL_G1_NC)
- 291 (R_AARCH64_MOVW_PREL_G2)
- 292 (R_AARCH64_MOVW_PREL_G2_NC)
- 293 (R_AARCH64_MOVW_PREL_G3)
- [SDCOMP-26550] AArch64 オブジェクトのリンク時に--callgraph オプションのサポートが追加されました。
- [SDCOMP-25853] ARM Cortex-A53 erratum 835769 に対する回避策のサポートが追加されました。この回避策を有効にするには以下のオプションを使用します:
- --branchpath=cortex-a53-835769
- --info=patches
- [SDCOMP-23499] リンカに対する以下の新しいオプションが追加されました:
- --callgraph_subset
- [SDCOMP-26253] DWARF 4 デバッグテーブルのサポートがfromelfに追加されました。
- [SDCOMP-26505] コンパイラは63バイトよりも大きな値を渡し、且つビットフィールドを含む構造体引数を持つ関数について、関数の実装および呼び出しの両方に対して誤ったコードを生成することがありました。
- [SDCOMP-26504] AArch32 としてコンパイルする際、他の引数とそれに連続する引数の両方が63バイトよりも大きな値を渡す場合にProcedure Call Standard for the ARM Architecture において8バイトアライメントを保持するように要求されている引数を持つ関数について不正なコードを生成することがありました。
- [SDCOMP-26503] AArch32 としてコンパイルする際、Procedure Call Standard for the ARM Architecture に定められているVFP およびAdvanced SIMD Register Arguments バリアントに準拠しないコードを生成することがありました。これにより引数として浮動小数点型Homogeneous Aggregate または、コンテナ化されたベクタ型Homogeneous Aggregate を取る関数の実装および呼び出しの両方に影響を与えます。
- [SDCOMP-26502] -g オプションを使ってアセンブルする際、integrated assembler は .textの名前を持つセクションだけデバッグ情報を生成していました。その結果、.textセクションしかデバッガ上でソースレベルデバッグできませんでした。
- [SDCOMP-26478] ツール使用時にライセンスサーバを利用した場合、適切なライセンスがすでに使用されているとコンパイラがerror: unable to execute command: Segmentation fault のエラーでクラッシュしていました。
- [SDCOMP-26430] C++ソースコードのコンパイル時、C++ライブラリヘッダとの互換性の欠乏により、error: no type named 'ptrdiff_t' in namespace 'std' をレポートすることがありました。
- [SDCOMP-26426] 特定の状況下において、integrated assembler は#のキャラクタによってリロケーション定義子がプリプロセスされなかった場合に不正にerror: expected compatible register, symbol or integer をレポートすることがありました。
- [SDCOMP-25627] AArch64 としてコンパイルする際、__attribute__((packed)) または#pragma pack(x) のいずれかを用いてpackedとして定義された構造体についてアンアラインドアクセスを用いる機会を誤って失っていました。
- [SDCOMP-25389] AArch64 としてコンパイルする際、完全なIEEE 754 準拠ライブラリを選択するオブジェクトしか生成しないことがありました。-ffast-math オプション選択時、コンパイラはfaster floating-point ライブラリを選択するオブジェクトを生成するようになりました。
- [SDCOMP-25140] コンパイラは不正にweak 関数をテイルコールするコードを生成することがありました。これにより、リンカが意図的に未定義なweak 関数の呼び出しを全てNOPや、NOPと同等な命令に置き換えてしまい不正な動作を引き起こす可能性がありました。
- [SDCOMP-25833] MSR 命令をARMv7-M プロセッサ用にアセンブルする際、アセンブラがIAPSR、EAPSR およびXPSR レジスタに対する_
- [SDCOMP-26535] スキャッタファイルでPI またはRELOC 属性を指定するか、--fpic 、--reloc オプションを指定してリンクした場合に、不正にべニアとそれに続くスキャッタローディングハンドラの間に2バイトのパディングを挿入することがありました。--pad オプション使用時、パディングバイトが--pad 値にセットされ不定動作や未定義命令の実行を引き起こす可能性がありました。
- [SDCOMP-26494] --info=stack オプションにおいてarmclangコンパイラによって生成されたオブジェクトに対し4倍大きなスタックサイズをレポートすることがありました。
- [SDCOMP-26457] --cpu=cortex-a12 オプション使用時、リンカが不正にFatal error: L3903U: Argument 'cortex-a12' not permitted for option 'cpu' をレポートすることがありました。
- [SDCOMP-26434] 多くの場合、リンカは重複する定数文字列を削除せず、代わりにWarning: L6412W: Disabling merging for section
, unsupported relocation をレポートしていました。その結果、不要にイメージのサイズが大きくなることがありました。from object - [SDCOMP-26432] --cpu=cortex-a7 オプションを付けてリンクする際、リンカが不正にError: L6366E: <object> attributes are not compatible with the provided cpu and fpu attributesをレポートすることがありました。
- [SDCOMP-24671] リンカが誤ってELFの仕様で要求されている8バイトアラインではなく、4バイトアラインでELF64 Program Header Table を保証することがありました。その結果、仕様に準拠しないイメージが生成されていました。
- [SDCOMP-13503] FILL または PADVALUE EMPTY ZEROPAD 属性を含むattribute_list を伴う実行リージョンを持つスキャッタファイルを利用してAArch64 用のリンクを行った際、リンカが誤って指定された属性ではなくEMPTY ZEROPAD が指定されたかのようにふるまうことがありました。
- [SDCOMP-12939] 特定の状況下において、リンカはError: L6286E: Relocation #
: のかわりにError: L6286E: ARM Linker: Execution interrupted due to an illegal storage access をレポートすることがありましたin ( ) with respect to . Value( ) out of range( ) for ( ) - [SDCOMP-26095] 正しい結果が (-2^-1053, -2^-1054) あるいは(2^-1054, 2^-1053) のいずれかの範囲であるとき、AArch64 実装のライブラリ関数ldexp() 、 pow() 、scalb() およびscalbn() は不正な結果を返すことがありました。
- [SDCOMP-25958] 引数が[0, 0x7fffffff] の範囲外の値に丸められるとき、AArch64 実装のライブラリ関数lrint() 、lrintf() 、 lround() およびlroundf() は不正な結果を生成することがありました。
- [SDCOMP-25701] 特定の環境下で、AArch64 実装のライブラリ関数_ll_sfrom_f_r() がフレイに丸められた結果を返すことがありました。
- [SDCOMP-25342] 最初の引数で表される値が[-UINT_MAX, UINT_MAX] の範囲外で且つオーバーフローしない範囲内にある場合、AArch64 実装のライブラリ関数strtol() 、strtoul() およびatol() が不正な結果を生成することがありました。
- [SDCOMP-24984] ライブラリ関数__rt_heap_extend() 、__user_heap_extend() および__user_heap_extent() が適切なstrongly typedのインタフェースを保持しませんでした。
- [SDCOMP-24508] AArch64 としてコンパイルされた際、マクロPRIdPTR 、PRIiPTR 、PRIoPTR 、PRIuPTR 、PRIxPTR および PRIXPTR は不正に32ビットフォーマット指定子"d" 、"i" 、"o" 、"u" 、"x" および"X"を期待される64ビットフォーマット指定子"ld" 、"li" 、"lo" 、"lu" 、"lx" および"lX" のかわりに返していました。
- [SDCOMP-23814] rt_fp.hで宣言のために使用される呼び出し規約と関連するAArch64 実装のライブラリ関数が合致していませんでした。
- [SDCOMP-21714] _membitcpy[b|h|w][b|l]() および_membitmove[b|h|w][b|l]() に対するAArch64 実装のライブラリ関数は不正に入力データをコピーすることがありました。
- [SDCOMP-21693] NaNと値の比較をする場合、AArch64 実装の特定のライブラリ関数が不正な動作をしていました:
- _feq() 、_fgr() 、_deq() および_dgr() は、不正に1を返すことがありました
- _fcmpge() および_dcmpge() は不正にキャリーフラグをセットすることがありました
- [SDCOMP-26083] 特定の状況下において、ツールが意図しないライセンスエラー9558E: System clock tampering detected を返すことがありました。
- [SDCOMP-28246] Red Hat Enterprise Linux 環境でリンク時最適化機能において32ビットバージョンのリンカがARM Linker: Execution interrupted due to an illegal storage access で終了してしまうことがあります。
- [SDCOMP-26574] -mcpu=name コンパイラオプションが以下のパラメータをサポートしていません:
- cortex-m0plus
- cortex-m1
- cortex-r7
- cortex-sc000
- cortex-sc300
- [SDCOMP-26563] --target=armv7r-arm-none-eabi オプションを使用したコンパイル時、-mcpu=cortex-r4 の指定があっても-mcpu オプションが指定されていなくても、コンパイラが'cortex-r4' is not a recognized processor for this target (ignoring processor) をレポートし、ARMv7-R アーキテクチャ固有のコードを生成しません。加えて、リンカにデフォルトでライブラリを選択させることのできないオブジェクトを生成してしまいます。回避策としては、-mcpu=cortex-r5 を使用してコンパイルしてください。
- [SDCOMP-25973] --cpu=cortex-a5 オプションを使用したリンク時、リンカがError: L6366E: <object> attributes are not compatible with the provided cpu and fpu attributes をレポートすることがあります。--target=armv7-arm-none-eabi -mcpu=cortex-a5 オプションを使用したコンパイル時、VFPv4 とNEON を実装したCPU用のオブジェクトを生成するのに対し、リンカオプション--cpu=cortex-a5 はVFP とNEON を実装していないCPUを想定します。回避策としては、--cpu=cortex-a5.neon を指定してリンクしてください。
- [SDCOMP-25971] AArch64 用long double がサポートされていません。
- [SDCOMP-25970] --cpu=cortex-a53 または--cpu=cortex-a57 のいずれかを使用してリンクする際、リンカが不正にFatal error: L3903U: Argument '
' not permitted for option 'cpu' を返します。ことがあります。この問題の回避策としては、--cpu オプションなしでリンクしてください。 - [SDCOMP-25969] コンパイラによって生成されるオブジェクトがLib$$Request を含んでいません。これはARMライブラリを自動的にリンクするかわりに、リンカがWarning: L6665: Neither Lib$$Request$$armlib Lib$$Request$$cpplib defined, not searching ARM libraries およびError: L6411E: No compatible library exists with a definition of startup symbol
を返すことを意味します。ARMライブラリとリンクするためには--force_scanlib リンカオプションを使用してください。 - [SDCOMP-25968] C++ の例外はサポートしていません。C++コードは-fno-exceptions オプションと共にコンパイルされる必要があります。
- [SDCOMP-25967] __fp16 半精度浮動小数点数データ型はサポートしていません。
- [SDCOMP-25966] fromelf --fieldoffsets --expandarrays は配列中の各要素の情報を出力することが期待されます。armclangを使ってコンパイルされたオブジェクトについては配列の最初の要素だけ現状は出力させることができます。
- [SDCOMP-25965] 複素数はサポートしていません。
Compiler and integrated assembler(armclang)
Linker (armlink)
Fromelf
v6.01での修正
Compiler and integrated assembler(armcc)
Legacy assembler (armasm)
Linker (armlink)
Libraries and system headers
その他の問題
ARM Compiler 6.01 の既知の問題