パッチプログラムをダウンロードするには、事前にARM社のコネクトサービスのアカウントを取得し、ログインしておく必要があります。アカウントの取得は以下のURLから無償で行う事ができます:
https://login.arm.com/register.php
RVCT4.0(Build 902から925) †
このRealView Compilation Tools(RVCT)4.0 Web Patch #10 Build925はRealView Developer Suite(RVDS) v4.0の製品とともに使用されることを意図しています。これはオリジナルのインストレーションまたは過去のパッチの適用の如何によらず、あらゆるRVDS v4.0 Standard、ProfessionalまたはEvaluationのインストレーションのアップデートを行う事ができます。その他のRVCT/RVDSのリリースとは互換性がありません。
このパッチはRVCT/RVDSv4.0のコンパイラ、リンカ、アセンブラ、fromelfおよびarmarの実行形式とアップデートされたインクルードファイルおよびC/C++ライブラリから構成されています。
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
サポートされるOSプラットフォーム
Windows 7 Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit また、このパッチは以下のノンサポートなプラットフォーム上でテストされています。 Windows 2000 SP4 SUSE Linux 9.2 Ubuntu Linux 8.10
パッチをインストールするには以下の手順で行います
1.以下をタイプしてRVCT 4.0のBuild400以降が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
2.ZIPファイルをテンポラリディレクトリに解凍してください。
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。既存のディレクトリはRVCT40INC環境変数で確認できます。
<Windowsの場合>
C:Program FilesARMRVCTData.00include
<Linuxの場合>
/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。既存のディレクトリはRVCT40LIB環境変数で確認できます。
<Windowsの場合>
C:Program FilesARMRVCTData.00lib
<Linuxの場合>
/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、 テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。 既存のディレクトリはRVCT40BIN環境変数で確認できます。
<Windowsの場合>
C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの場合>
/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 925が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。 その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 925での改善点は下記の通りとなります。
- BLX命令の生成をより厳密に制御するため2つのコマンドラインオプションが追加されました。--[no_]blx_arm_thumbはARMからThumbの呼び出しでBLX命令をリンカが生成するかどうかを制御します。--[no_]blx_thumb_armはThumbからARMの呼び出しでBLX命令をリンカが生成するかどうかを制御します。これらのオプションのデフォルトはBLX命令の生成を許可します。 [SDCOMP-14942]
RVCTパッチBuild 902での修正点は下記の通りとなります。
- 三項条件のうち1つの式がその条件よりも先に評価される可能性がありました。これは例えば、式がメモリアクセスであり条件がバウンダリチェックを行うような場合に安全ではないメモリアクセスを発生させることがありました。この問題は修正されました。 [SDCOMP-14344]
RVCT4.0(Build 870から902) †
このRealView Compilation Tools(RVCT)4.0 Web Patch #9 Build902はRealView Developer Suite(RVDS) v4.0の製品とともに使用されることを意図しています。これはオリジナルのインストレーションまたは過去のパッチの適用の如何によらず、あらゆるRVDS v4.0 Standard、ProfessionalまたはEvaluationのインストレーションのアップデートを行う事ができます。その他のRVCT/RVDSのリリースとは互換性がありません。
このパッチはRVCT/RVDSv4.0のコンパイラ、リンカ、アセンブラ、fromelfおよびarmarの実行形式とアップデートされたインクルードファイルおよびC/C++ライブラリから構成されています。
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
サポートされるOSプラットフォーム
Windows 7 Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit これらに加えて、以下のノンサポートなプラットフォームにおいてもパッチをテストしました: Windows 2000 SP4 SUSE Linux 9.2 Ubuntu Linux 8.10
パッチをインストールするには以下の手順で行います
1.以下をタイプしてRVCT 4.0のBuild400以降が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
2.ZIPファイルをテンポラリディレクトリに解凍してください。
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。既存のディレクトリはRVCT40INC環境変数で確認できます。
<Windowsの例>
C:>set RVCT40INC RVCT40INC=C:Program FilesARMRVCTData.00include
<Linuxの例>
> echo $RVCT40INC ~/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。既存のディレクトリはRVCT40LIB環境変数で確認できます。
<Windowsの例>
C:> set RVCT40LIB RVCT40LIB=C:Program FilesARMRVCTData.00lib
<Linuxの例>
> echo $RVCT40LIB ~/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、 テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。既存のディレクトリはRVCT40BIN環境変数で確認できます。
<Windowsの例>
C:> set RVCT40BIN RVCT40BIN=C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの例>
> echo $RVCT40BIN ~/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 902が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。 その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 870から902での改善点は下記の通りとなります。
- 新しいオプション--[no_]intermediate_object_filesが追加されました。-cオプションが指定されていないコンパイルとリンクが組み合わさったステップで--no_intermediate_object_filesが定義されているとコンパイラはコンパイルされたオブジェクトのために使用するテンポラリファイルをリンク終了後に削除します。通常ではオブジェクトファイルはカレントディレクトリに生成されません。通常のarmccの実行時のデフォルトは--intermediate_object_files(以前の動作通り)であり、GCCコマンドライントランスレーション使用時にはデフォルトが--no_intermediate_object_filesとなります。[SDCOMP-10711]
- symdefsファイルは1つのリンクステップの出力で使用されているグローバルシンボルを他のリンクステップに入力できるようにします。comdatグループのメンバーであるセクションによって定義されたグローバルシンボルをsymdefsファイルが含み、symdefsファイルのユーザが同一のcomdatグループを生成するとき、複数シンボル定義エラーL6200Eが発生することがありました。 そのようなシンボルの例はsymdefsファイルとアプリケーションの両方において定義されたコンパイラヘルパ関数です。どちらの定義が選択されるかはコマンドラインオプション--comdat_symdefs_preference=preferenceで制御され、<preference>はsymdefsまたはcomdatのいずれかとなります。<preference>がsymdefsである場合、リンカはその定義をsymdefsファイルから選択し、<preference>がcomdatである場合はcomdatグループから定義が選択されます。デフォルトの<preference>はsymdefsです。[SDCOMP-11078]
- armlinkはANY_SIZEスキャッタキーワードをサポートしました。このキーワードは実行リージョンにおける.ANYセレクタに割り当てることの出来る中身の量の制限をユーザ定義できるようにします。
シンタックス:exec_region <base> ANY_SIZE <size>
リージョンに対するANY_SIZEの定義はそのリージョンにおける自動且つ偶発的なサイズ割り当てをオーバーライドします。armlinkはユーザ定義された、制限を越えるような中身を全て割り当てないようにします。
armlink --info==any診断メッセージはそれぞれのリージョンに対する偶発的割り当てを表示するように拡張されました。
armlinkエラーメッセージL6220Eはリンカが生成した中身のうちリージョン内においてその制限を越えるような量をレポートするよう改善されました。
以前のarmlinkは時折、リージョンからの.ANYの偶発的な割り当てを不正にクリアしていました。この問題は修正されました。[SDCOMP-10588]
- 新しいソーティングアルゴリズムがリンカの--sortコマンドラインオプションで使用可能になりました。--sort=objectcodeを使用して選択可能です。アルゴリズムはコードセクションをタイブレーカーによってソートし、それ以外のセクションはアルファベット順でソートします。--tiebreaker=cmdlineがメモリマップ内でまとめられた同一オブジェクトから全てのセクションをグループ化するようにするためにこのアルゴリズムは一番有用でしょう。[SDCOMP-10898]
RVCTパッチBuild 870から902での修正点は下記の通りとなります。
コンパイラ(armcc)
- 最適化レベルが-O3 -Otimeの場合、ループ条件が符号なし整数とゼロ以外の定数での比較を伴い、ループの繰り返し数が小さい場合の、固定的な繰り返しの回数を持つループにおいてコンパイラが不正なコードを生成することがありました。[SDCOMP-11082]
- 最適化レベルが-O3 -Otimeの場合、1つの定義ブロック内で初期化として関数の参照が出現し、参照先のポインタが定義の同一ブロック内での初期化として出現し、関数がポインタによってポイントされる値を変更する場合にコンパイラが不正なコードを生成することがありました。[SDCOMP-10940]
- 特定の状況において、全ての最適化レベルで、それ自身の中で再帰的データ構造のアドレスへのストア(または同一の結果を得るようなポインタ演算の使用)がUNPREDICTABLEなストア命令が生成されることがありました。この問題は修正されました。[SDCOMP-10900]
- --gnu_instrument使用時にinternal fault 0x413ad2を発生させる一部要因を修正しました。[SDCOMP-10801]
- armccは-O3 -Otime使用時、不正なコードを生成することがありました。変数のデクリメントによるwhileループにおいて、ループエンドがアンロールされていた場合、最初の繰り返しがスキップされることがありました。[SDCOMP-10789]
- armccはO3 -Otime使用時、不正なコードを生成することがありました。ポインタからポインタにアクセスする特定のループでアンロール時にすでにout-of-dateとなった値への参照を行う事がありました。[SDCOMP-10787]
- 最適化レベルが-O1以上の特定の状況下で、localなshortの配列が? :を含む配列のインデックス式か、インライン化された関数を使用するよう記述されていると配列が間違った値を持つことがありました。この問題は修正されました。[SDCOMP-7494]
- NEONの'16-bitスカラーによる乗算'命令使用時に特定の状況下でinternal fault 0xa95feeが発生することがある問題を修正しました。[SDCOMP-7352]
- -O3 -Otimeオプション使用時に暗黙的なキャストをリターン時に行う関数のインライン化において、armccは不正に必要なキャストを削除することがありました。[SDCOMP-7346]
- thumbモードでリンク時コード生成を使用すると、モジュール間インライナーによって決定された結果によりinternal fault 0x2732f5が発生することがありました。この問題はもう起こりません。[SDCOMP-7333]
- NEON組み込み関数使用時、最初の引数が静的定数であった場合、armccは不正にVBICおよびVORNを可変処理として使用していました。この問題は修正されました。[SDCOMP-7318]
- --remove_unneeded_entities使用時にinternal fault 0xaac48dを発生させる一部要因を修正しました。[SDCOMP-7214]
リンカ(armlink)
- CYGPATH環境変数をcygpath.exeのロケーションにセットしているCygwin環境下で、RVCTツールはCygwinとネイティブなWindowsパス間のコンバートにcygpath.exeを呼び出すようになりました。Cygwin version 1.7.7使用時、リンカはCygwinパスに含まれる--libpathまたはRVCT40LIBを変換するためにcygpathを使用することができませんでした。この問題は修正されました。[SDCOMP-10621]
- --veneer_inject_type=poolベニア生成モデルはベニアが取ることのできる一番可能性の高いアドレスであるプールリミットに届くよう、プール内のベニアに分岐することを必要としていました。プールリミットに届くことのできない分岐が後から見つかった場合、armlinkはエラーメッセージL6828を出すことがありました。プール内の全てのベニアをより低いプールリミットに適用することができるなら、armlinkは分岐を受け入れるためのプールリミットを減少させるようになりました。エラーメッセージL6828はリンカがリミットを下げられない場合にのみ発生します。[SDCOMP-10620]
- armlink --info=anyの出力はセクションインデックスとサイズを含むように改善され、適当であればアーカイブ名を表示します。[SDCOMP-10604]
- armlinkはRVCT40_LINKOPT環境変数経由でオブジェクトファイルが渡されてもクラッシュしなくなりました。[SDCOMP-10589]
- UnixおよびWindowsツールは.ARM.attributesセクションのサブブロックを良い理由もなく、異なった順番で出力することがあり、イメージが重要な方法で変更されたかどうかを決定するのを難しくしてしまっていました。[SDCOMP-1836]
アセンブラ(armasm)
- アセンブラは直接イミディエイトなエンコードが定義されているとき、イミディエイトなARMデータ処理におけるローテーションの前に#をオプションとして受け付けられるようになりました。例:ADD r0,r1,#3,#4[SDCOMP-8966]
C/C++ライブラリ
- Cortex-M3 Cライブラリはアンアラインドアクセスに依存する、strcmpのバリアントを1つだけ持っていました。依存しないバリアントも提供するようになりました。[SDCOMP-7954]
- ライブラリ内の複素数関数clog()およびcexp()はerrnoがエントリ上ゼロでない場合、間違って振舞っていました。cexpはerronoをゼロにクリアすることがあり、clogは間違った答えを返すことがありました。[SDCOMP-1933]
ELFフォーマットコンバータ(fromelf)
- fromelfはアーカイブのメンバーの選択のためのシンタックス(例:'archive.a(*.o)')がアーカイブされていないか、存在しないファイルにおいて使用されるとエラーメッセージを表示することに失敗していました。メッセージは正しく表示されるようになりました。[SDCOMP-2381]
- microlibのqsort()関数は同等比較を行う要素を含む配列をソートするとき、無限にハングアップすることがありました。同様にハングアップしなくとも非常にパフォーマンスが低くなっていました。[SDCOMP-7957]
RVCT4.0(Build 821から870) †
このRealView Compilation Tools(RVCT)4.0 Web Patch #8 Build870はRealView Developer Suite(RVDS) v4.0の製品とともに使用されることを意図しています。これはオリジナルのインストレーションまたは過去のパッチの適用の如何によらず、あらゆるRVDS v4.0 Standard、ProfessionalまたはEvaluationのインストレーションのアップデートを行う事ができます。その他のRVCT/RVDSのリリースとは互換性がありません。
このパッチはRVCT/RVDSv4.0のコンパイラ、リンカ、アセンブラ、fromelfおよびarmarの実行形式とアップデートされたインクルードファイルおよびC/C++ライブラリから構成されています。
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
サポートされるOSプラットフォーム
Windows 7 Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit これらに加えて、以下のノンサポートなプラットフォームにおいてもパッチをテストしました: Windows 2000 SP4 SUSE Linux 9.2 Ubuntu Linux 8.10
パッチをインストールするには以下の手順で行います
1.以下をタイプしてRVCT 4.0のBuild400以降が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
2.ZIPファイルをテンポラリディレクトリに解凍してください。
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。既存のディレクトリはRVCT40INC環境変数で確認できます。
<Windowsの例>
C:>set RVCT40INC RVCT40INC=C:Program FilesARMRVCTData.00include
<Linuxの例>
> echo $RVCT40INC ~/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。既存のディレクトリはRVCT40LIB環境変数で確認できます。
<Windowsの例>
C:> set RVCT40LIB RVCT40LIB=C:Program FilesARMRVCTData.00lib
<Linuxの例>
> echo $RVCT40LIB ~/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、 テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。既存のディレクトリはRVCT40BIN環境変数で確認できます。
<Windowsの例>
C:> set RVCT40BIN RVCT40BIN=C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの例>
> echo $RVCT40BIN ~/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 870が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。 その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 821から870での変更点は下記の通りとなります。
コンパイラ(armcc)
- 参照型を含む関数例外の仕様で、C++例外を有効にして(--exceptions)コンパイルした場合、例えば、void g(void) throw(int&) {...}はコンパイラのinternal faultを発生させていました。この問題は修正されました。reference-to-pointer-to-class (C * &)の関数例外仕様の型は正常に扱うことができず、アラートとしてダウングレード可能なコンパイル時のエラー#2818を発生させます。
このエラーのダウングレードは、ソースによって暗黙的に意図される(pointer-to-derived-classのスローが許可されるようになる)ものに対し、少し異なったランタイムの意味をもたらす、参照(&)を省力したかのように型を扱います。TC1を含むC++ Standardのセクション15.4/7 15.3を参照してください。[727197]
- GNUモードにおいて、'aligned'属性を変数のアライメントを減少させようと使用した場合に、メッセージ#1039とともにフォルトしていました。これは(GCC同様)無視される配列変数を除いては許されるようになりました。[727773]
- internal fault 0x84aef9と0x45464が修正されました。[740654]
- -O3 -Otime使用時のinternal fault 0x44784cの原因が修正されました。[741821]
- --exceptions使用時のinternal fault 0x3e9d63の原因が修正されました。[730514]
- --dllimport_runtimeとLTCG使用時、コンパイラは時折コンパイラ生成のヘルパ関数を参照している特定のランタイム関数のインポートに失敗することがありました。この問題は修正されました。[735414]
- -O3 -Otime使用時のinternal fault 0xfe1945の原因が修正されました。[737716]
- 不正なbit-bandingの使用に対するエラーハンドリングが改善されました。ビットバンドオブジェクトがビットバンドリージョン外に(属性または整数リテラルポインタとともに)置かれた時、コンパイラは以下のアクションをとります:
- オブジェクト型がそれに適用されたビットバンド属性を持っており、--bitbandがコマンドラインで指定されていなければ、コンパイラはエラーとして扱います。
- オブジェクト型がそれに適用されたビットバンド属性を持っており、--bitbandがコマンドラインで指定されていれば、コンパイラはワーニングを発生させ、ビットバンドの要求を無視します。
- オブジェクト型がそれに適用されたビットバンド属性を持っておらず、--bitbandがコマンドラインで指定されていれば、コンパイラはビットバンドの要求を無視します。
これに加えて、at属性は不完全型の定義において許されなくなりました。[740150]
- GNU C++モードにおいてstd::type_infoは不完全型として事前定義されました。[740973]
- コンパイラは、多くのcase式(> 256 cases)を伴う、極めて大きな(128KB以上のコードを生成する)switch式がコンパイルされた時、internal faultを起こすことがありました。この問題は修正されました。[741084]
- -O3 -Otime --vectorizeが定義されたとき、同一の配列と、異なった代入式の左辺のキャストに関連する繰り返される式があるソースコードにおいて、コンパイラは不正なコードを生成することがありました。この問題は修正されました。[742024]
- 特定の状況において、他のメソッド呼び出しからの参照によって返されるオブジェクト上でメソッドが呼び出される場合にオブジェクトへのアクセスにおけるスタックオフセットが不正に生成される問題がありました。この問題は修正されました。[742819]
- コンパイラはアーキテクチャv5TEターゲット用のコンパイル時にワードアラインでありながら、非ダブルワードアラインなアドレスに対し、LDRDを生成することがありました。この問題は修正されました。[743326]
- コンパイラは-O3 -Otime使用時、unsigned intダウンカウントインデックスの繰り返し回数を間違って計算し、不正なコードを生成することがありました。この問題はloopインデックスがunsignedで1以外のインクリメントによるダウンカウントの場合に起こりえます。[744069]
アセンブラ(armasm)
- 以前、アセンブラはnが4の倍数でないときに、LDR/STR pc,[pc,#n]に対する診断エラーA1322Eを発生させることがありました。このメッセージは結果が予測不能であるLDR命令に対してのみ発生するべきです。この問題は修正されました。[731801]
- アセンブラは予測不可能なコプロセッサ0, 1, 10および11におけるコプロセッサ命令を診断していませんでした。この問題は修正され、アセンブラはエラーA1477をレポートするようになりました。[734903]
- アセンブラはNEONレーンから省略されるARMレジスタへの(VMOV.<dt> Rd,Dm[n])トランスファーのインデックスを許すことがありました。これは不正なシンタックスであり、フォルトするようになりました。[734910]
- アセンブラはディスティネーションがPCであるようなANDS, EORS, ADDSおよびSUBS命令をThumbとしてアセンブルするとき、以前はこの不正なシンタックスを黙ってアセンブルしていましたが、エラーA1912Eをレポートするようになりました。[741070]
- アセンブラはThumbにおいて.W修飾子をともなうIT命令を不正に許していました。この問題は修正されました。[741275]
- 並列ビルドにおいて--cpreprocオプション使用時にエラーA1023Eを引き起こす問題を修正しました。[741370]
- アセンブラにおいて、非アラインなオフセットへの分岐を記述した場合にinternal faultが診断に続いて引き起こされていました。この問題は修正されました。[742922]
- "MOVS pc,lr,<shift>"命令で指定されたあらゆるシフトがアセンブラによって無視されていました。このケースは予測できないのでアセンブラはエラーA1477を発生させます。[743220]
- アセンブラはPLD, PLDWおよびPLI命令におけるレジスタによるシフトを不正に許していました。この問題は修正されました。[743221]
- アセンブラはMRC命令において、ディスティネーションレジスタとしてのr15をフォルトしていました。これはCPSRが結果として補正される時のコプロセッサ命令のUAL以前のシンタックスです。この問題は修正されました。[744774]
リンカ(armlink)
- --sysvイメージにおいてデストラクタ関数が正しい順番で実行されることを保証するために、リンカは.fini_arrayセクションを正く並べるようになりました。[737347]
- --ltcgオプション使用時、リンカは2つのライセンスをチェックアウトしなくなりました。[737667]
- 想定されるベニアに対する予備の空き領域を許す--any_contingencyオプションが改善されました。このオプションの使用方法は以前の通りですが、以前のイメージでは大量のベニアが時折.ANYを持つリージョンをオーバーフローさせることがありました。[743027]
- comdatグループのマージを行う際、リンカは捨てられたグループでのweak定義に対する参照をweakな参照に間違って変更することがありました。これは保持しなければならないセクションを、未使用セクションの削除において捨ててしまう可能性がありました。この問題は修正されました。[743820]
- 巨大なリージョンサポートを有効にする--sort=LexicalStateが時々セクションを不正に(平均的な呼び出しの深さによって)ソートしていました。この問題はもう発生しません。[744630]
- --any_sort_order=cmdlineはマニュアルどおりに機能していませんでした。コマンドラインインデックス順の.ANYの配置により、処理のためのセクションを正しくソートします。[744636]
Cライブラリ
- posix_memalign関数がマルチスレッド環境において正しい処理を行っていませんでした:環境によって、全くmutexをロックしないか、実在しないものをロックすることがありました。[741380]
- build 762以降、マルチスレッドプログラムにおいてfgets(), gets(), fputs()およびputs()関数がエラーまたはEOFによってリターンするとき、ストリームのmutexのアンロックに失敗することがありました。mutexは確実にアンロックされるようになりました。[742769]
- microlib内の最小のstdio実装は_sys_seek()が正の値を返す際に不正な動作をしていました。内部ステートがfseekによってアップデートされず、fseekおよびfsetposの戻り値が不正になる可能性がありました。この問題は修正されました。[743383]
- ライブラリ内のstdio実装はヒープがメモリを使い尽くしたときにクラッシュしなくなっています。[743634]
ELFフォーマットコンバータ(fromelf)
- リロケーションを伴う16ビットThumb PC相対LDR命令のディスアセンブリはターゲットシンボル名に対し、みせかけだけの"+1024"をアペンドすることがありました。この問題は修正されました。[738998]
- Windows環境で.debug_str sectionを含むイメージに対する"fromelf -v -g"または"fromelf -y -g"は不正なストレージアクセスによってクラッシュすることがありました。[743339]
ツール全般
- Cライブラリ内のC99複素数関数(<complex.h>内で定義)は今までハードウェア浮動小数点環境において間違ったprocedure call standardを使用していました。ライブラリ関数はVFPレジスタ内の引数を、さらにコンパイラが同じ方法で呼び出しを生成することを期待して、標準の名称(csin, ccos, cexpなど)に基づいて定義されていました。結果的に複素数ライブラリ関数を呼び出すhardfpおよびsoftfpでコンパイルされたコードはリンクされませんでした(1つまたはその他は間違ってライブラリ関数を呼び出そうとするので)。
この問題はcsin, ccosなどがそれらの整数レジスタ内の引数を渡し、ライブラリも同様にVFPレジスタを使用する__hardfp_csin, __hardfp_ccosといった名前をもつ、代わりのエントリポイントを提供することで吸収されました。
残念ながら、この効果は固定小数点ライブラリに対してリンクされている場合、複素数ライブラリ関数の呼び出しを行う既存のhard-FPオブジェクトコードは正しく作用しないでしょう。armccの影響を受けたビルドと、AAPCSのVFPバリアントを使用していると示された.ARM.attributesセクション(Tag_ABI_VFP_args = 1)から識別ストリングを含む.commnentセクションがあるオブジェクトからのあらゆる<complex.h>関数への参照解決時、リンカはワーニングを発生させるでしょう。[741936]
RVCT4.0(Build 771から821) †
このRealView Compilation Tools(RVCT)4.0 Web Patch #7 Build821はRealView Developer Suite(RVDS) v4.0の製品とともに使用されることを意図しています。これはオリジナルのインストレーションまたは過去のパッチの適用の如何によらず、あらゆるRVDS v4.0 Standard、ProfessionalまたはEvaluationのインストレーションのアップデートを行う事ができます。その他のRVCT/RVDSまたはKeil MDK製品のリリースとは互換性がありません。
このパッチはRVCT/RVDSv4.0のコンパイラ、リンカ、アセンブラ、fromelfおよびarmarの実行形式とアップデートされたインクルードファイルおよびC/C++ライブラリから構成されています。
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
- Cortex-M4プロセッサの特長であるDSP機能拡張(飽和と32-bit SIMD)命令を伴う7-Mアーキテクチャ用のコード生成のために、--cpu=7E-Mをサポートしました。[736675]
- armlinkは新しいソーティングタイプ--sort=LexicalStateをサポートしました。このソートでは、ARMコードの前に全てのThumbコードを置き、さらに辞書順にソートします。[738147]
- armlinkは新しいオプション--[no_]crosser_veneershareをサポートしました。デフォルトは--crosser_veneershareで、実行リージョン間でのベニアの共有を許す既存の振る舞いを保持します。--no_crosser_veneershareは実行リージョン間でのベニア共有を禁止します。[737516]
- armlinkは新しいオプション--emit-non-debug-relocsをサポートしました。この機能は--emit-relocsに類似しますが、non-debugセクションからのリロケーションのみを出力します。[737515]
- 新しいリンカオプション--veneer_inject_type=<type>が追加されました。<type>は、<individual>または<pool>のいずれかを取ります。デフォルトは<individual>です。このオプションは--largeregionsモードがonであるときにベニアのレイアウトを制御します。--veneer_inject_type=individualの場合、リンカはベニアを使用するセクションの最大量によって到達することができるようにベニアの配置を行います。実行リージョン間でのベニアの再使用は許可されます。このタイプは必要とされるベニアの数を最小にしますが、最もイメージの構造を複雑にしてしまいます。--veneer_inject_type=poolの場合、リンカは実行リージョンの連続する範囲内からベニアを収集し、範囲内で生成された全てのベニアを範囲の末尾に配置されたプール領域に置きます。巨大な実行リージョンは1つ以上の範囲を持つことがあり、従って、1つ以上のプールを持つ可能性があります。このタイプはイメージ構造に影響を与えにくいですが、コードの範囲において他のプールにあるベニアの再使用ができないために、再使用の可能性が少なくなります。リンカは、ベニアを必要とする可能性についての予測をリンカが行う分岐命令の所在をベースにして範囲を計算します。状態の変化する場合、またはソースからターゲット(不確実なものも含む)への距離が分岐範囲を超える場合に分岐がベニアを必要とすることが予測されます。不確実な範囲については、--veneer_pool_size=<size>オプションで設定することができます。デフォルトでは102400バイトとなっています。--info=veneerpoolsオプションはリンカがベニアプールをどのように配置するかについての情報を提供します。[737514]
- 新しいリンカオプション--tiebreaker=<tiebreak>が追加されました。<tiebreak>は、<creation>または<cmdline>のいずれかを取ります。tiebreakerはソーティングのアルゴリズムが総合的にセクションの順番を決める必要がある場合に使用します。デフォルトのtiebreakerはcreationです。これはリンカ内部でのセクションデータ構造の生成順となります。もうひとつの--tiebreaker=cmdlineはコマンドラインに示されたセクション順となります。コマンドライン順はFile.Object.Sectionのように定義され、'Section'はオブジェクト内のセクションのsh_idxとなります。'Object'はファイル内に出現したオブジェクトの順番となります。'File'はコマンドラインに出現したファイルの順番になります。ファイル内に出現したオブジェクトの順番はファイルがarアーカイブである場合にのみ重要となります。コマンドライン順をマップファイル(--mapオプションで生成される)で表示させるようにフォーマット変更するには--section_index_display=cmdlineオプションを使用します。[737517]
- リンカは.ANYセクションの配置を制御するための追加オプションをサポートしました。2つのコマンドラインオプションがあります。
- --any_sort_order=<order>:<order>は、<descending_size>(サイズによる降順)または<cmdline>(コマンドラインインデックス順)のいずれかを取ります。デフォルトはdescending_sizeです。
- --any_placement=<algorithm>:<algorithm>は、<first_fit>(スペースを伴う最初の実行リージョンにセクションを配置)、<best_fit>(一番空きの少ないスペースを伴う実行リージョンにセクションを配置)、<worst_fit>(一番空きの多いスペースを伴う実行リージョンにセクションを配置)、または<next_fit>(適切なスペースがあれば現在の実行リージョン内に、ない場合はスキャッタファイル内の次の実行リージョンに移してセクションを配置。現在の実行リージョンからバックトラックはしない。)のいずれかを取ります。デフォルトはworst_fitです。加えて、新しいinfoオプション--info anyが追加されました。このオプションはソート順、割付アルゴリズムおよびどのセクションがどの実行リージョンに割り付けられたかを配置アルゴリズムによって処理された順に出力します。[737513]
サポートされるOSプラットフォーム
Windows 7 Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit これらに加えて、以下のノンサポートなプラットフォームにおいてもパッチをテストしました: Windows 2000 SP4 SUSE Linux 9.2 Ubuntu Linux 8.10
パッチをインストールするには以下の手順で行います
1.以下をタイプしてRVCT 4.0のBuild400以降が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
2.ZIPファイルをテンポラリディレクトリに解凍してください。
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。既存のディレクトリはRVCT40INC環境変数で確認できます。
<Windowsの例>
C:>set RVCT40INC RVCT40INC=C:Program FilesARMRVCTData.00include
<Linuxの例>
> echo $RVCT40INC ~/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。既存のディレクトリはRVCT40LIB環境変数で確認できます。
<Windowsの例>
C:> set RVCT40LIB RVCT40LIB=C:Program FilesARMRVCTData.00lib
<Linuxの例>
> echo $RVCT40LIB ~/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、 テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。既存のディレクトリはRVCT40BIN環境変数で確認できます。
<Windowsの例>
C:> set RVCT40BIN RVCT40BIN=C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの例>
> echo $RVCT40BIN ~/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 821が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。 その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 771から821での変更点は下記の通りとなります。
コンパイラ(armcc)
- 初期化されていないポインタに対して値を取得するようなコードを生成する問題を修正しました。[734706]
- システムヘッダファイル内でのワーニングおよびエラーは常に抑制されます。これは暗黙的に関連してインクルードされるテンプレート実装ファイルでも同様に抑制されるようになりました。[736105]
- --remarksオプション使用時、printf関数にワイド文字列(L"abc")を渡すと、関連するフォーマット文字列が"%ls"であったとしても互換性のないprintf引数に関するremark #181が発生する可能性がありました。このremarkはこの状況で発生しなくなりました。[735496]
- GNUモードで--multibyte_charsを使用した場合、コンパイラが1つ以上のスペースに続くマルチバイトキャラクタで終了する行(例:コメント内など)があると、不正な行結合キャラクタを検出する可能性がありました。C++形式の複数行にわたるコメントを使用するときに、ソースコードの不正な解釈を行う可能性がありました。[737748]
- GNU C++モードにおいて、ファイルスコープ変数を初期化する複合リテラル(C99/GNU拡張)を使用すると、ランタイムエラーを発生させる可能性がありました。この問題は修正されました。[736266]
- GCCコマンドライントランスレーションに多少の修正が行われました。[735554]
- -g --remove_unneded_entitiesオプション使用時のinternal fault 0xe70a0cの原因が修正されました。[738296]
- -O3 -Otimeオプション使用時のinternal fault 0xfe1945および0x0d9189の原因が修正されました。[737716, 735852]
アセンブラ(armasm)
- ページバウンダリにかかる広い分岐を避けるためのNOPの挿入によるCortex-A8のバグに対する回避策として新しいオプション--branchpatch=cortex-a8_q109が追加されました。[736360]
リンカ(armlink)
- armlinkはfromelf生成エラーQ0454Eを引き起こす可能性のある、.dynstrセクションへの不正な型の割り当てを行う可能性がありました。この問題は修正されました。[732898]
- armlinkは正しく古いスタイルのリージョンテーブルを扱うようになりました。以前、特定の環境下においてarmlinkは、古いスタイルのリージョンテーブルを使って独自のスキャッタローディングメカニズムを実装したイメージをリンクするとリンクに失敗し、以下のエラーによって終了する可能性がありました:
"ARM Linker: Execution interrupted due to an illegal storage access"[734549]
- armlinkは最大2GBよりも大きな連続するブロックの書き込みに失敗するとL6065Eのエラーメッセージを表示するようになりました。[728400]
- armlinkは--sysvイメージにおいてデストラクタ関数が正しい順番に実行されることを保証するように.fini_arrayセクションを正しく並べるようになりました。[737347]
- armlinkのコールグラフは同一のセクションから同一の関数ポインタに対して複数の呼び出しを結合した、機能改善された関数ポインタ情報を出力するようになりました。[736849]
- リンカは--ltcg使用時に2つのライセンスをチェックアウトしようとしなくなりました。[737667]
- armlinkは'Absolute'実行リージョン内をターゲットとする'PI'実行リージョンの位置独立なコードからの分岐のための長分岐ベニアを生成するようになりました。デフォルトではarmlinkはコードサイズの大幅な増加を引き起こすようなベニアの再使用は行いませんでした。この問題は修正され、armlinkは安全な場合にはベニアの再使用を行うようになりました。[738802]
C/C++ライブラリ
- フルユニコードワイドキャラクタctype関数であるtowupper()およびtowlower()において、それぞれの小文字および大文字が返されるべきですが、#pragma import __use_utf8_ctypeと#pragma import __use_full_wctypeが有効である場合で、且つ--wchar32を使用してコンパイルされると、U+1D79とU+A77Dのキャラクタのペアに対し間違った解を返す可能性がありました。[736950]
- strict C++モードにおいて、<wchar.h>および<cwchar>はFILEタイプを宣言しなくなりました。同様に、macro __ARM_WCHAR_NO_IOはそれらのヘッダがFILEまたはワイドI/O関数プロトタイプを宣言しなくなるよう定義することが出来ます。[733711]
ELFフォーマットコンバータ(fromelf)
- 時折、fromelf --binがファイルに含まれる部分として同一のファイルオフセットを共有する、関係のないSHT_NOBITSセクションに続いた出力ファイル名をつけていました。[735346]
ツール全般
- DWARFデバッグ情報生成時、サードパーティデバッグツールにおいて問題を引き起こす可能性のある4の倍数でないCIEおよびFIEレコードをアセンブラとコンパイラが出力する可能性がありました。この問題は修正され、適切な場所にパディングが生成されるようになりました。[733101]
- --cpu=Cortex-M4.fpオプションは以前のように__TARGET_CPU_CORTEX_M4_FPではなく、__TARGET_CPU_CORTEX_M4の事前定義マクロをセットするようになりました。FPの存在は__TARGET_FPU_VFPマクロを使用することによりテストが可能です。[736497]
- 日本語メッセージロケールにおいて、--diag_style=ideを使用するとファイル行と絡むの間におけるカンマが漢字のカンマではなくASCIIのカンマとなりました。[736125]
RVCT4.0(Build 697から771) †
このRealView Compilation Tools(RVCT)4.0 Patch #6 Build771はRealView Developer Suite(RVDS) v4.0の製品とともに使用されることを意図しています。これはオリジナルのインストレーションまたは過去のパッチの適用の如何によらず、あらゆるRVDS v4.0 Standard、ProfessionalまたはEvaluationのインストレーションのアップデートを行う事ができます。その他のRVCT/RVDSまたはKeil MDK製品のリリースとは互換性がありません。
このパッチはRVCT/RVDSv4.0のコンパイラ、リンカ、アセンブラ、fromelfおよびarmarの実行形式とアップデートされたインクルードファイルおよびC/C++ライブラリから構成されています。
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
- AEABIでは、volatileビットフィールドはそれらのコンテナの型のサイズによってアクセスされると定義されています。GCCの一部のバージョンでは、ビットフィールド全体を含む最小のアクセスサイズを使います。このようなABIに準拠していないような振る舞いをエミュレートするために、--narrow_volatile_bitfieldsコンパイラオプションが追加されました。[731902]
- x.y.zの形式でバージョン番号を保持するGCCのバージョンをレポートさせるために、 --configure_gcc_versionのコンパイラオプションが追加されました。このオプションはGCCのインストレーションに対して、レポートされるバージョンをオーバーライドしてコンフィグレーションするためにも使うことができますが、オーバーライドされたものがGCCのクエリによってレポートされたバージョンよりも古い場合には、警告が発生します。[729761]
- コンパイラにexecutableなのかnon-executableなのかをスタック上のコードにマーキングする.note.GNU-stackセクションを生成するための--[no_]execstackオプションが追加されました。このオプションが使用されていない場合、noteセクションは生成されません。--arm_linuxオプションは暗黙的に--no_execstackを用います。[725814]
- コンパイラは--gnuが定義されている場合、負の数を全く含まないenumについてunsignedな値を使用するようになりました。[728146]
- Cライブラリは整列されたストレージをアロケートするためにposix_memalign()関数を提供するようになりました。ストレージはfree()によって解放されます。[731812]
- RVCTはVFPv4浮動小数点アーキテクチャをサポートしました(--fpu=VFPv4)。[731258]
- コンパイラはカレントディレクトリと(または)ソースファイルディレクトリがPCH(プレコンパイルドヘッダ)ファイルが生成されたときと異なっていた場合PCHファイルを再利用できるようになりました。[375431]
- シンボルサイズをアセンブル時に定義できるように、IMPORT、EXPORTディレクティブにおいてSIZE属性をオプションでサポートするようになりました。(例:EXPORT dataSymbol[DATA, SIZE=8])[730839]
- コンパイラオプション--import_all_vtblが追加されました。これはクラスにメモリ使用量などの面で負荷をかけるような変数(vtables、RTTIなど)の外部参照に対し、ダイナミックリンケージがあるとマークします。このオプションはそのような変数にダイナミックリンケージの定義をするものではありません。[727750]
- リンカはダイナミックリロケーションがOVERLAYリージョン内に生成されるとL6491Wの、また、OVERLAYリージョンがダイナミックリロケーションのターゲットとなっている場合はL6492Wのワーニングメッセージを必ず生成するようになりました。[728049]
- 暗黙的にインスタンスが生成されたテンプレートメンバ関数がキー関数として選択できるかどうかを制御するために新しいオプション--[no_]implicit_key_functionが追加されました。(一般的に、キーまたは決め手となるクラスのための関数は、それ自身の最初の非インラインな仮想関数です。しかしながら、暗黙的にインスタンスが生成されたテンプレート関数の場合、関数ははっきりとしないリンケージを持つ可能性があります。例えば、多重定義の可能性などです。)デフォルトは、キー関数が暗黙的であることを可能にするunchangedです。また、キー関数が暗黙的である場合、新しいremark #2819-Dが生成されるようになりました。このremarkは--remarksまたは--diag_warning=2819とともに定義することによって表示されるようになります。[732323]
- マルチスレッドユーザ向けに、ライブラリは、一回が1文字ごとではなく、全体の呼び出しのためのターゲットストリームをロックする高レベルのstdio関数(fputs、fgets、printfなど)の異なった形式を提供するようになりました。これによってパフォーマンスが向上されるべきであり、またprintfの呼び出しが1度に出力全体を表示させる(他のスレッドからの出力が潜在的に文字と文字の間にはさまれるのではなく)ようになるでしょう。[727119]
- 以前のRVCTライブラリのバージョンにおけるバージョン特有の最適化をarmccが使用することができるように--library_interfaceにオプションが追加されました。これらのオプションは、rvct30、rvct30_c90、rvct31、rvct31_c90です。rvct40およびrvct40_c90オプションも提供されます。[717109]
- strict C++モードで、<wchar.h>と<cwchar>はFILE型を宣言しなくなりました。同様に、マクロ__ARM_WCHAR_NO_IOはこれらのヘッダがFILEおよびワイドI/O関数プロトタイプを宣言しないように定義することができるようになりました。[733711]
サポートされるOSプラットフォーム
Windows 7 Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit これらに加えて、以下のノンサポートなプラットフォームにおいてもパッチをテストしました: Windows 2000 SP4 SUSE Linux 9.2 Ubuntu Linux 8.10
パッチをインストールするには以下の手順で行います
1.以下をタイプしてRVCT 4.0のBuild400以降が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
2.ZIPファイルをテンポラリディレクトリに解凍してください。
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。既存のディレクトリはRVCT40INC環境変数で確認できます。
<Windowsの例>
C:>set RVCT40INC RVCT40INC=C:Program FilesARMRVCTData.00include
<Linuxの例>
> echo $RVCT40INC ~/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。既存のディレクトリはRVCT40LIB環境変数で確認できます。
<Windowsの例>
C:> set RVCT40LIB RVCT40LIB=C:Program FilesARMRVCTData.00lib
<Linuxの例>
> echo $RVCT40LIB ~/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、 テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。既存のディレクトリはRVCT40BIN環境変数で確認できます。
<Windowsの例>
C:> set RVCT40BIN RVCT40BIN=C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの例>
> echo $RVCT40BIN ~/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 771が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。 その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 697から771での変更点は下記の通りとなります。
コンパイラ(armcc)
- 以下のinternal faultの一部の原因について対応しました: 0x87ecef, 0x6bca8b, 0x6bca8b, 0x413ad2, 0xd9827b, 0xcc3958, 0x2732f5, 0xafc2db, 0xa05965, 0xf7584e, 0xb36758, 0x2d4b56, 0xa718ebおよび0x4553df
- volatile変数へのアクセスまたはテストが-O3 -Otimeオプション使用時、ループの外に不正に出されてしまっていました。この問題はもう発生しません。[733001, 729956]
- WindowsにおいてBOM(byte order mark)によって判別されたUTF-8ソースコードの正しい処理にコンパイラは失敗していました。この問題は修正されました。[732849]
- 以前、クラステンプレートメンバ関数がその宣言においてdllimportとして、また、out-of-classインライン定義においてdllexportとしてマークされている場合、dllexport関数(1つがインラインとマークされていても)のためのout-of-lineコピーは常に生成されるという原則に反して、クラスのインスタンス生成はメンバー関数のout-of-lineコピーを生成しない可能性がありました。この問題は修正されました。[732208]
- 最適化オプション-O3 -Otime使用時、正式なパラメータを使用した関数のインライン化が1度以上行われるとき、対応する実際の引数がインクリメントを含んでいると、このインクリメントが複数回行われることがありました。この問題は修正されました。[732499]
- 最適化レベル-O1以上において、#177-Dのワーニング(変数が宣言されましたが参照されませんでした)が空のボディを持ったデフォルトコンストラクタを使用してコンストラクトされたローカル変数のクラスタイプが生成される可能性がありました。このワーニングはコンストラクタがエンプティではないとき、そうであるように抑制されるようになりました。[732465]
- PCH(プレコンパイルドヘッダ)ファイルの生成および再使用に関する番号の振られていないメッセージが--message_localeが使用されている場合、正しくローカライズされていませんでした。この問題は修正されました。[732406]
- カウントダウンするdo-whileループ内での繰り返しごとに3バイトの書き込みを行う場合にバッファの最後を越した書き込みを行うような-O3 -Otimeのコード生成バグは修正されました。[732346]
- 8バイトより大きなアライメントを持つ型(つまり、'aligned'属性によってセットされる)におけるオブジェクトの配列に対する'new'や'delete'を使用する際に様々な問題がありました。この使用方法は正しく動作するようになりました。[731813]
- gotoまたはネストしたtryブロックからのリターンの一部として実行されるデストラクタからのthrowが例外テーブルの生成フォルトによって、間違ったcatchハンドラに渡されることがありました。この問題は修正されました。[730117]
- --visibility_inlines_hiddenオプション使用時、dllimportであるとマークされたクラスのインライン関数の一部が生成もインポートもされませんでした。これらの関数は生成されるようになりました。[731207]
- 構造体自身がvolatileでない場合に、構造体のvolatileフィールドへのアクセスが不正に最適化されていました。この問題は修正されました。[727881]
- 組み込みアセンブラソース内のエラーが出力オブジェクトファイルを不完全な状態なままにしてしまうという可能性がありました。この問題は修正されました。[726941]
- 関数が同じ定数を引数として渡す関数の直接の呼び出し全てにおいて、この値はルーチンの本体内に置き換えることができます。コンパイラは関数が間接的に関数を呼ぶ場合において、不正にこの操作を行っていました。この問題は修正されました。[730281]
- RVDSとともに提供されているXVIDサンプルに影響の有るコード生成フォルトは修正されました。[727352]
- -Eを伴わない--list_macrosオプションは、プリプロセスされたソースの末尾にあるように、マクロ定義のリストのみを正しく生成するようになりました。-E(または同等の-Pオプションなど)を渡された場合、マクロの#defineおよび#undefディレクティブは生成されたプリプロセス済みソース内にインターリーブされるでしょう。
- エイリアスが('alias'属性を使用して)作成されたスタティックルーチンが使われない場合でも永久に維持されていました。この問題は修正されました。[729567]
- C standardのAnnex F内にあるIEEE浮動小数点モデルの要求事項にFPモデルが完全に準拠していた(--fpmodeによってセットされるように)場合、__STDC_IEC_559__のみをコンパイラは定義するようになりました。これはソース言語に依存しません。(C90, C99 or C++)[724114]
- コンパイラは--multifileオプションが明示的または暗黙的に使用されている場合、__MULTIFILEマクロを定義するようになりました。__OPTIMISE_LEVELが少なくとも3であるかをテストすることによって、この機能を現在検知している、あらゆるソースレベルの条件付けは__MULTIFILEをテストするように変えられるべきです。[729445]
- __forceinlineでマークされた多重継承クラスの仮想関数に対するデバッグ情報の生成を行うときにInternal fault 0x04cb7bが発生する可能性がありました。この問題は修正されました。[732688]
- コンパイラは-O3 -Otime使用時、ループカウンタのクリーンされた最下位ビットの通知に失敗し、#pragma unrollの直前でアンロール後の不要なループのクリーンアップコードを生成していました。この問題は修正されました。[626066]
- LTCGと--dllimport_routineオプションの組み合わせは一部の例外ランタイムルーチンへの参照に対しダイナミックリンケージを与えないことがありました。この問題は修正されました。[733308]
- コンパイラは"--"オプションターミネータ引数に続いた場合でも、オプションとして'-'から始まるファイルネームをパースしようとすることがありました。この問題は修正されました。[733245]
- クラスタイプへの参照を使用するcatch文(例:catch (C &c))において、コンパイラはclass Cの根底となる型情報の生成に失敗することがありました。この問題は修正されました。[732867]
- コンパイラにおいて、__ssat(), __smuad()および__smlad()を含む一部の組み込み関数は一部のケースにおいて不正にQフラグに影響しないとみなされ、Qフラグアクセスを不要として削除していました。この問題は修正されました。[729899]
- コンパイラは大量のセクションを持つオブジェクトの生成時に実行が遅くなることがありました。例:巨大ソースに対する--split_sectionsの使用など。この問題は修正されました。[733748]
- Windowsにおいて、Perl、GNU makeおよびそのようなプログラム内で相対パス経由で実行されたとき、コンパイラは時々アセンブラやリンカを見つけられなくなっていました。例:組み込みアセンブラの処理など。この問題は修正されました。[733795]
- 最適化レベルが-O1以上の場合、コピーコンストラクタが正しく合成されないことがありました。これはそれらのフィールド全てがbitwiseコピーを伴ったコピーコンストラクトできるような複数の(もしかするとポリモーフィックな)基底クラスから派生したclass Bから派生したclass Aにおいて起こりえます。この場合、Aに合成されるコピーコンストラクタはvtableポインタのみをセットし、基底クラスの中身をコピーしません。この問題は修正されました。[733659]
- -O3 -Otime使用時、インクリメントされた添字を伴うオブジェクト式がインライン化されたメンバー関数呼び出しを持っている場合、添字のインクリメントが繰り返されました。この問題は修正されました。[734246]
アセンブラ(armasm)
- 以前のインスタンスをオーバーライドするREQUIRE8とPRESERVE8が使用可能になりました[732197]
- VMSRを使ったシステムレジスタMVFR0とMVFR1への書き込みは予測不能と診断されます。[720647]
- 以前、アセンブラはシンボル定義をする際に正しく解決することのできない、{ABSOLUTE}-{RELATIVE}の形式での式を伴うEQUディレクティブの使用を許していました。これを使用するとA1109Eエラーを発生させるようになりました。[647017]
- RELOCが直後に使用されるとREQUIREディレクティブが無視される可能性が有る問題を修正しました。[731252]
- CMNなしの16-bit Thumb命令セットを生成させるとき、アセンブラは不正なフラグセットの動作が発生するCMN Rn, #0のCMP Rn, #0への置き換えを行う可能性がありました。この命令はフォルトするようになりました。[728052]
- 4バイトの倍数でないオフセットを伴うALIGNディレクティブが使用されたときのメモリに関する問題は対応されました。[729860]
- ソースオペランドのデータタイプのみが指定されたNおよびLの形式の命令をアセンブラは受け付けられませんでした。(例:VADDHN.I16.I16 d0,q1,q2)この問題は修正されました。[719906]
リンカ(armlink)
- リンカインライニングは3つのハーフワード命令を含むThumb関数の2命令のみを不正にインライン化していました。この問題は修正されました。[732427]
- RWセクションではみせかけだけのL6265Eエラーを引き起こすことがないのと同等に、位置独立なROセクションは同一のPI実行リージョンに配置できるようになりました。[730622]
- ROの名称を持つセクションが不正にスキャッタローディングセレクタ(+RO)による名前とマッチされる可能性がありました。同様のケースがRWやZIでもありました。これらは修正されました。[730269]
- 大量のC++のマングリングされたシンボルを含む巨大なプロジェクトでarmlink --symbolsオプションを使用すると、リンカはアンマングリングされたシンボル名を表示しようとして'Fatal Error L6000U: Out of memory'のメッセージを表示することがありました。この問題は修正されました。armlinkは--symbolsオプション使用時より少ないメモリを使用するようになりました。[730197]
- --enum_is_intオプションを使用してコンパイルされたコードとmicrolibのリンクにおいて、リンクエラーL6242Eは発生しなくなりました。[729408]
C/C++ライブラリ
- Cライブラリは標準C関数srand(), rand()およびsetlocale()のようなCライブラリ内部のスタティックデータのかわりにユーザが提供したバッファを使用する_srand_r(), _rand_r()および_setlocale_r()関数を含むようになりました。[721560]
- C++例外使用時に選択される__cxa_vec_cctorのバージョンがコンストラクション関数ポインタがNULLとして渡された場合に正常にハンドルされていませんでした。この問題は修正されました。[730012]
- printfフォーマット文字列とその引数のミスマッチをレポートするように(--remarksまたはその他によって)設定されていた場合、armccは特別に(uint8_t)のマッチを想定しているinttypes.hマクロPRIu8とその引数タイプのミスマッチをレポートしていました。同様に、SCNd8, SCNi8, SCNo8, SCNu8およびSCNx8のinttypes.hマクロも間違ってレポートしていました。[733080]
ELFフォーマットコンバータ(fromelf)
- "fromelf --fieldoffsets"がオブジェクトファイルのデバッグ情報が、匿名のサブ構造体を含む構造体のタイプについて、または名前をもたない基底クラスからの継承を行ったC++のクラスを持つ場合にクラッシュするケースがありました。[733770]
ツール全般
- --version_numberオプションを使用した場合に、ライセンスを要求されることがありました。この問題は修正されました。[730056]
RVCT4.0(Build 650から697) †
このRealView Compilation Tools(RVCT)4.0 Patch #5 Build697はRealView Developer Suite(RVDS) v4.0の製品とともに使用されることを意図しています。これはオリジナルのインストレーションまたは過去のパッチの適用の如何によらず、あらゆるRVDS v4.0 Standard、ProfessionalまたはEvaluationのインストレーションのアップデートを行う事ができます。その他のRVCT/RVDSまたはKeil MDK製品のリリースとは互換性がありません。
このパッチはRVCT/RVDSv4.0のコンパイラ、リンカ、アセンブラ、fromelfおよびarmarの実行形式とアップデートされたインクルードファイルおよびC/C++ライブラリから構成されています。
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
他のツールチェインとの互換性を改善するために変更が行われました
- 互換性を改善するためにGCCコマンドライントランスレーション機能を修正しました。特に、通常のarmccのデフォルトの-O2とは異なり、GCCコマンドライントランスレーション使用時のデフォルト最適化レベルは-O0にセットされます。[727559]
- GCCとの互換性の為に、__builtin_bswap32および__builtin_bswap64の組み込み関数の定義を追加しました。これらは32ビットおよび64ビットワードをそれぞれリバースします。[714828]
- もし以前の正しい#ifまたは#elifによって#elifが通常評価されない場合でも、#elifディレクティブ内の式に誤りがあるとき、コンパイラは#29-Dの診断メッセージを表示します。このワーニングはGCCが4.4以前のバージョンをエミュレートしている場合には表示されません。(GCCのデフォルトエミュレーションモードではGCC4.2をエミュレートすることに注意してください)[728705]
- オプション--sysv使用時(同様に--arm_linuxで暗黙的に示される)リンカは.ARM.exidx セクションのsh_linkフィールドを.textセクションのインデックスにセットします。これはobjcopyにおける互換性を改善します。[723436]
- GNUモードにおいて、Cがclass名である場合に、式のコンテキスト内におけるC::Cの参照はコンストラクタの呼び出しとして扱われます。これはGCCの挙動により近い形となりす。[726327]
- オプション--gnu_defaultsはデフォルトで--no_implicit_includeオプションもセットするようになりました。[723702]
算術演算ライブラリの改善
- RVCTでは歴史的に数学演算ライブラリ(mathlib)のエラーケースの扱いを、Annex F of the C99 standardに準拠しない形で実装してきました。過去のRVCTの挙動はデフォルトで行われますが、C99-compliantエラーハンドリングがその代替としてサポートされました。C99の挙動はプログラム中で__use_c99_matherrをインポートすることで有効になります。特に影響を受ける関数は以下の通りです:
atan2, atanh, hypot, lgamma, log, log10, log2, log1p, pow, tgammaおよびこれらの単精度に相当するもの。[720506]
一般的な改善
- Cortex-A5がコンパイラサポートCPUに追加されました。[726103]
- リンカはDLLおよび共有ライブラリをビルドする場合、未使用セクションを削除することができるようになりました。[720889]
- 32ビットThumb命令を持つCPUに対してアセンブルを行う場合、命令内における推奨されないレジスタの診断メッセージはアセンブラによってのみ表示されます。他のアーキテクチャでこれを有効にするには--diag_warning=1745,1786,1788,1789のオプションを使用します。[728201]
- ARM Architecture Reference Manual内での変更をトラックするために、アセンブラはイミディエイトオペランドの前にある'#'キャラクタの省略を許します。他の(または古い)アセンブラではアセンブルされないかもしれないソースコードの検索を行うためにこのシンタックスを使用すると、A1865Wのワーニングが発生します。[365430]
- 新しいアセンブラオプション--[no_]execstackは実行可能スタックを要求するコードかどうかを記述する.note.GNU-stackセクションをビルドすることができます。[725813]
- コンパイラはソースファイルの先頭で、3バイトオーダーマーク(BOM)を無視できるようになりました。[725395]
- RVCT3.0以降、コンパイラはその結果がclass rvalueである条件式の結果を保持するためのテンポラリの使用を必要とするC++ Core Issue #446への解決を実装しています。これは(稀なケースで)プログラムの挙動を変更してしまいます。新しいremark#2814を使用することによってそのようなテンポラリがあった場合に診断できるケースとなりました。これは--remarksまたは--diag_warning=2816で有効になります。[726389]
- 出力ファイルのディレクトリを定義するための新しいオプションが追加されました。--output_dirは通常.oファイルを含む出力ディレクトリを定義します。アセンブラ出力ディレクトリは--asm_dirで、依存関係出力ディレクトリは--depend_dir、--listの出力は--list_dirで指定することができます。関係する出力に対してこれらのオプションが指定されない場合、--output_dirで指定されたディレクトリに出力され、これも指定がない場合はデフォルトの場所に出力されます(例:カレントディレクトリ)。[724352]
- makefile依存関係ファイルとプリプロセス済みソース出力を--md -E(または--md -Pによって行番号の出力を抑制した)の組み合わせで一度に出力することができるようになりました。[606117]
- リンクステップ実行時、他のファイルとの組み合わせで標準入力ストリームからソースコードを利用することができます。例えば次のような指定が可能です:
"armcc -o output.axf - object.o mylibrary.a"
"armcc -o output.axf --c90 source.c -"
標準入力で渡されるソースをコンパイルし、test.axfとリンクするように"armcc -o test.axf -"の挙動を上記に従って変更することができます。標準入力と他のソースファイルの結合はリンク時でない場合はまだ許されず、C3078Eエラーを引き起こします。[723225]
- 新しいリンカオプション--[no_]import_unresolvedが追加されました。デフォルトは--import_unresolvedです。--sysv --sharedオプションを用いて共有ライブラリをリンクするとき、解決されないシンボルはエラーを発生させるのではなく、通常はインポートされます。--no_import_unresolvedが指定されている場合、明示的にリンカコマンドラインに指定されているオブジェクトファイルからの未解決の参照はインポートされずに見て意義シンボルエラーを引き起こします。[727609]
- オブジェクトロード後にリンカがメモリ中のデバッグセクションデータを維持させないようにする新しいリンカオプション--no_eager_load_debugが追加されました。これはリンカのピークメモリ使用率を下げます。部分リンクも少ないメモリ使用の利点を得ることができます。[722351]
- 非実行可能スタックをサポートしました。リンカは--sysv(同様に--arm_linuxで暗黙的に示される)オプションが指定されているとき、適切なPT_GNU_STACKプログラムヘッダを生成します。リンカは入力オブジェクト内note.GNU-stackセクションの前からスタックの実行ステータスを得ます。新しく関連付けられたオプションは--[no_]execstackです。[725212]
- Cライブラリワイドキャラクタctype関数(isw*, towupeer, towlower)はUnicode 5.0に更新されました。[726104]
- fromelfは正しくDT_RELCOUNTを保持するようになりました。[727579]
非推奨となる機能
- ソースライン内で変数置換の問題を引き起こす:OR:の同義語としての|の使用はアセンブラにおいて非推奨となりました。
サポートされるOSプラットフォーム
Windows 7 Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit これらに加えて、以下のノンサポートなプラットフォームにおいてもパッチをテストしました: Windows 2000 SP4 SUSE Linux 9.2 Ubuntu Linux 8.10
パッチをインストールするには以下の手順で行います
1.以下をタイプしてRVCT 4.0のBuild400以降が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
2.ZIPファイルをテンポラリディレクトリに解凍してください。
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。既存のディレクトリはRVCT40INC環境変数で確認できます。
<Windowsの例>
C:>set RVCT40INC RVCT40INC=C:Program FilesARMRVCTData.00include
<Linuxの例>
> echo $RVCT40INC ~/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。既存のディレクトリはRVCT40LIB環境変数で確認できます。
<Windowsの例>
C:> set RVCT40LIB RVCT40LIB=C:Program FilesARMRVCTData.00lib
<Linuxの例>
> echo $RVCT40LIB ~/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、 テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。既存のディレクトリはRVCT40BIN環境変数で確認できます。
<Windowsの例>
C:> set RVCT40BIN RVCT40BIN=C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの例>
> echo $RVCT40BIN ~/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 697が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。 その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 650から697での変更点は下記の通りとなります。
コンパイラ(armcc)
- C++例外を有効にして(--exceptions)コンパイルを行う際、例えばvoid g(void) throw(int&) {...}のような参照型を含む関数例外仕様がコンパイラでinternal faultを起こしていました。この問題は修正されました。[727197]
- 複数のソースファイルを使用するとき最初のファイルのリスティングが生成されると--listについて間違ってドキュメントに記述されていました。実際には最後のファイルに対するリストを生成しますが、最初のソースファイル名からリストファイル名を生成するでしょう。コンパイラは関係するソースファイル名から生成された名前の分割された個々のリスティングが記述された全てのソースファイルに対するリスティングを生成するようになりました。[728254]
- #pragma unroll(1)はアンローリングの度合いについて正しく影響するようになりました。[727935]
- #pragma push/popは#pragma packによってセットされたカレント構造体アライメントを正しくpush popするようになりました。[727532]
- stdarg.hにおける型の標準定義(ARM Procedure Call Standardで与えられた)とtype-incompatibleなva_listのカスタム定義使用時、コンパイラは--gnuオプションが指定されると型が不正に再定義されたというエラー#256を返す可能性がありました。この問題は修正されました。[727506]
- 特定の状況下でerrnoをセットする引数を持ったfmodの呼び出しが不正に削除されていました。この問題は修正されました。[726236]
- __attribute__( (used) )でマークされた関数とデータはリンカの未使用セクション削除による削除を避けるようにオブジェクト内でタグをつけられるようになりました。[724019]
- コンパイラは全ての浮動小数点モデル(--fpmodeでセットされる)に対し逆比較において反転浮動小数点比較を最適化(例:!(a < b)が(a >= b)に変換される)を行っていました。これは浮動小数点モデルがNaNを意識しないことを示したとき(デフォルトでは--fpmode std, --fpmode fast)だけこの最適化が適用されるように変更されました。[725146]
- -O3 -Otimeの特定の状況で、ループテスト内のunsignedからsigned整数のキャストが捨てられるというサイレントコード生成の問題を修正しました。[726234]
- コンパイラ--localeオプション使用時、ワーニングメッセージの生成が時折カレントロケールをリセットしまい、ソースコード内の不正なマルチバイトキャラクタシーケンスの解釈を引き起こしていました。この問題は修正されました。[725074]
- C/C++ソースコードがマルチバイトエンコードを使ってエンコードされていたとき(特に、通常のASCIIキャラクタがUTF-8ではなく、Shift-JISを含むマルチバイト文字の次のバイトにあるとき)、マクロ式における'#'文字列化演算子の使用が期待しない結果を生成していました。この問題は修正されました。[725874]
- __attribute__( (section("name")) )を使用して明示的にセクション属性を与えられたインライン関数のアウトオブラインインスタンスがリンク時エラーを発生させる可能性がありました。この問題は修正されました。[723920]
- リンク時コード生成において"C2"コンストラクタおよび"D2"デストラクタに対するシンボルの生成に失敗するケースがありました。この問題は修正されました。[728099]
- makefile依存関係生成のオプション使用によってワーニング#629-Dを伴って不必要にコンパイラがプレコンパイルヘッダ(PCH)ファイルの再利用を妨げる可能性がありました。PCHファイルは再利用されるようになりました。[728897]
- --remarksが使用された場合、テンプレートでのfriend定義が呼び出された関数内にある変数と同名の変数を呼び出すと(例:最初のインスタンス生成から)、コンパイラから見せ掛けだけの警告を生成することがありました。この問題は修正されました。[728548]
- 以前コンパイラは仮想関数を持つdllimportクラスのインポートされたインライン関数のダイナミックリンクの提供に失敗することがありました。この問題は修正されました。[727752]
- 以下のinternal faultの一部の原因について対応しました:
0x87ecef, 0xcc3958, 0x87ecef, 0xa05965, 0xbfdfa3, 0x9be513, 0xa85545, 0x56e87b, 0x63faa5, 0xafee20, 0xfe1945 [728236, 685024, 727558, 589466, 726944, 726750, 726300, 725422, 728252, 728260]
アセンブラ(armasm)
- A1201を間違ってレポートする問題を修正しました。[722855]
リンカ(armlink)
- リンカはOVERLAY属性をもつ2つ以上の実行リージョンに続く実行リージョンのベースアドレスの計算を間違う可能性がありました。この問題は以前のOVERLEYリージョンのベースアドレスが同じではないとき発生します。この問題は修正されました。[725446]
- test_mla Cortex-M3サンプルのリンク時にL6967Eを発生させなくなりました。[725351]
- GNUツールの挙動により合致させるために、--arm_linuxモードが選択された場合、リンカは使用セクションからのセクションに対するweakな参照が生成されると、セクションを保持するようになりました。[726778]
- Thumbのシンボルを含むsymdefsファイルの読み込み時、リンカはThumbコード分岐がそのシンボルへの分岐を行う場合にみせかけだけのワーニングL6307Wを発生させていました。この問題は修正されました。[726869]
- リンカは$Sub$$Symbolへの不正な参照をオブジェクトが含む場合にエラーメッセージL62551を、また$Super$$Symbolの定義がある場合エラーメッセージL6250を表示します。もしリロケーションがこれらの不正なシンボルに対して生成される場合、リンカはinternal fault0x3ae533を起こしていました。この問題は修正されました。[726491]
- オブジェクトファイルが$Sub$$Symbolを含む場合、他のオブジェクトファイルが特定のシンボルを含み、同名のシンボルをライブラリも含む場合、リンカは不正にシンボルに対する検索をライブラリ内で行い、メンバーをロードして最終的にシンボルの多重定義エラーを発生させていました。この問題は修正されました。[726487]
- --arm_linuxの実行時、armlinkはワーニングとし、その重要度をremarkにダウングレードしたり完全に抑制することを許可せず、常にL6029E(入力オブジェクトファイル内のリロケーションが不正または存在しないシンボルに対するとき)をレポートしていました。この問題は修正されました。[725951]
C/C++ライブラリ
- ゼロを示すC99 16進浮動小数リテラル(例:"0x0.0p0")の解析を行うときscanfファミリの関数が解析の失敗をレポートするために使用されていました。これらは正常に解析されるようになりました。[726414]
- Cライブラリstdioクリーンアップ関数_terminateio()が同一のmutexに二度ロックしようとするときにデッドロックが以前のRVCTv4.0パッチリリースで行われた変更によって発生する可能性があります。この問題は修正されました。[726232]
- C++標準ライブラリissue #109の解決と一致して、<funttional>内binder1stおよびbinder2ndは非constの参照をとるoperator()の追加のオーバーロードを保持します。[724709]
- 一般的でない使用ケースにおける不正なランタイム動作を修正しました。例外を再throwするとき、スタックのアンワインディングを行っている間にデストラクタが再throwし、同一の例外オブジェクトをcatchすると、最初の再throwは間違った(不正なレジスタのリストアなど)継続がされる可能性がありました。[728231]
ライブラリアン(armar)
- armar -dが存在しないメンバの削除に使用されるとき、エラーメッセージL6831Eはワーニングとなりました。[727938]
ELFフォーマットコンバータ(fromelf)
- fromelf --elfコピーオプションはグローバルバージョンのシンボル定義に対するVersion Neededエントリを不正にトランスレートすることがありました。これはVersion Definitionsをもつ共有ライブラリ内のグローバルデータにアクセスするLinuxアプリケーションに影響を与えることがあります。この問題は修正されました。[727621]
- 他の初期化される部分にオーバーラップするELFセグメントの未初期化部分がある場合にfromelfの"--bincombined"オプションが不正なエラーをレポートしていました。この問題は修正されました。[725745]
RVCT4.0(Build 591から650) †
このRealView Compilation Tools(RVCT)4.0 Patch #4 Build650はRealView Developer Suite(RVDS) v4.0の製品とともに使用されることを意図しています。これはオリジナルのインストレーションまたは過去のパッチの適用の如何によらず、あらゆるRVDS v4.0 Standard、ProfessionalまたはEvaluationのインストレーションのアップデートを行う事ができます。その他のRVCT/RVDSまたはKeil MDK製品のリリースとは互換性がありません。
このパッチはRVCT/RVDSv4.0のコンパイラ、リンカ、アセンブラ、fromelfおよびarmarの実行形式とアップデートされたインクルードファイルおよびC/C++ライブラリから構成されています。
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
新しいコアのサポート
- ARMの新しいコアCortex-A5プロセッサをサポートしました。
他のツールチェインとの互換性を改善するために変更が行われました
- Link Time Code Generation (--ltcg)において、もし1つのトランスレーションユニット内の定数データが'const'として修飾されない外部参照として他のトランスレーションユニットにインポートされた場合、データは書き込み可能なセクションに入れられる可能性がありました。データは必ず読み取り専用のセクションに入るようになりました。このような宣言されたどのような場所でも一貫した型を持つ外部リンケージを伴うようなシンボルを必要とするプログラムは、Cに厳密に準拠していないことに注意してください。[721646]
- コンパイラのファイルの拡張子の扱いが既存の慣習により合致するようになりました。.ac、.tcおよびそれらの類似のものは--gnu_defaultsオプション使用時にはもうCソースとしては扱われません;かわりにそれらはリンカに渡されます。さらに.sx(およびUNIXホスト上での.S)はプリプロセスの必要なアセンブラソースを示します。[720541, 644030]
- コンパイラは#pragma weakをサポートするようになりました。これは既存の__weakキーワードまたはGCCにおける'weak'および'alias'属性の使用のかわりに、シンボルをweakとしてマークするか、シンボルのweakなエイリアスを定義するための非推奨となった言語拡張です。[720667]
- コンパイラはGNU Cの'constructor'および'destructor'属性での整数プライオリティ表記をサポートするようになりました。少ない優先度のコンストラクタはより大きい優先度のコンストラクタより前に呼び出されます。[722671]
- コンパイラは既存の__softfpキーワードのかわりとして、ハードウェア浮動小数点を持ったターゲットの呼び出し規約を定義する新しいGCCの'pcs'属性をサポートしました。__attribute__( (pcs("aapcs-vfp")) )は浮動小数点レジスタを使用します;__attribute__( (pcs("aapcs")) )では__softfp同様に整数レジスタを使用します。[721049]
- GNUモードにおいて、コンパイラは"#pragma GCC system_header"を実装しました。これはカレントファイルの後に続く定義がシステムヘッダで発生するとしてマークします。これは一部の診断における厳密さに影響させることができます。[723702]
- GNU C++モードにおいて、コンパイラはC++標準が要求する特定の状況下において、'template'キーワードの省略を許すようになりました。[722869]
- GNUモードにおいて、関数へのポインタは関数オーバーロードプロセスにおいて、部分的なオーダリングのために関数に対する参照と互換があると判断されるようになりました。標準モードにおいて、あいまいであると診断される一部のソースはGNUモードではコンパイルされます。[715526]
- --gnu_defaultsモード(--arm_linuxによって暗黙で示される)の選択は、nullオブジェクトポインタ上による非仮想メンバ関数の呼び出し時、より明確な振る舞いをさせることのできる--allow_null_thisを有効にします。[723911]
- コンパイラコマンドラインオプション"--gnu_defaults"は、GCCに対して一般的なデフォルトと一致させるように、暗黙的に--enum_is_intを有効にしなくなりました。このオプションは、--gnu, --no_debug_macros, --signed_bitfields, --wchar32 および--no_hide_allについては依然有効となります。[719559]
- 一部の稀で、古いGCCオプションに対するGCCコマンドライントランスレーションが追加されました。[722785]
- ソースが標準入力から取得され、makefile(例:--mdまたは-M使用時)に対する依存関係の行を生成するとき、コンパイラは'<stdin>'に関する依存関係を与えるような行を出力に生成しなくなりました。[723556]
- マルチファイルコンパイル使用時に、glibc math.hヘッダをインクルードする場合、__fabsまたは__fabsf関数において競合がレポートされることがありました。この問題は修正され、--gnu(または--gnuを暗黙的に有効にするような他のオプション)して維持に、競合がレポートされなくなりました。[722614]
- RVCTヘッダファイルのarm_linuxサブディレクトリはarm_linuxとarm_linux_compatサブディレクトリに分けられました。arm_linux_compatサブディレクトリは以前arm_linuxサブディレクトリ内にあるファイルのうち、glibcヘッダと互換性を要求されるヘッダファイルを含んでいます。ARM Linux-targetingモードである--arm_linux, --arm_linux_pathsおよびGCCコマンドライントランスレーションの使用においては、コンパイラはシステムインクルード検索パスにおいてarm_linux_compatサブディレクトリを優先し、それに対してarm_linuxサブディレクトリがサーチパスに追加されます。これによって、glibcヘッダからインクルードされる場合に、これらのファイルの厳密なインクルード順に依存するような特定のアプリケーションにおける互換性を改善します。[723765]
- armlinkはconstructor/destructorセクションをpriorityつきで扱う場合にGNUツールチェインの振る舞いに従うようになりました。優先度をつけられたコンストラクタは優先度のないものについて、GNUと同じ方法で順序付けられ--arm_linuxオプションによって保持されます。[722673]
- 一部のGCCでコンパイルされたコードとリンクを行う場合のエラーを避けるため、Error L6654Eは--arm_linuxオプションつきでリンクされる場合に抑制されます。[723142]
- GNUリンカLDはELFイメージのさまざまなポイントにおいて、リンカにシンボルを定義するように伝える制御スクリプトを持っています。armlinkはARM linuxスタートアップコードによって必要とされるシンボルだけを定義していました。今回、参照がされている場合に、デフォルト制御スクリプトに存在している全てのシンボルを定義するようになりました。サポートされるシンボルは次の通りです。:
__executable_start (executables only), etext, _etext, __etext, __data_start, edata, _edata, __bss_start, __bss_start__, __bss_end__, end, _end, __end, _bss_end__
これに加えて、リンカは.dynamicセクションが有る場合に必ずシンボル_DYNAMICを定義するようになりました。[720112]
- 定義されたシンボルへの参照を生成する、新しい"--undefined=<symbol>"オプションがリンカに追加されました。これは例えば、ライブラリから特定の定義をロードさせ、未使用セクションの削除処理から削除されないことをリンカに保証させるために使うことができます。STV_DEFAULTビジビリティとして参照が生成されます。これはGNU ldオプションの振る舞いに合致します。[719570]
- 新しい"--undefined_and_export=<symbol>"オプションが追加されました。これは--undefined=<symbol>と同じように<symbol>に対するSTV_DEFAULTビジビリティの参照を生成します。<symbol>の定義がSTV_DEFAULTまたはSTV_PROTECTEDビジビリティを持つ場合、"EXPORT symbol"ステアリングファイルコマンドが使用されたときと同様にダイナミックシンボルテーブルに配置されるでしょう。シンボルがSTV_HIDDENビジビリティを持つ場合、"--overide_visibility"が同じく指定されていなければダイナミックシンボルテーブルに置かれません。[719570]
入力ファイルに対する許容度を増すよう変更が行われました
- リンカの--[no_]muldefweakオプションのデフォルトが--muldefweakに変わりました。weakシンボルの多重定義が存在した場合、これはリンカに対してエラーを発生させるのではなく、最初にあるものを選択するようにさせます。[720148]
- 誤った文字列マージセクションによって引き起こされる6682および6683リンカエラーをダウングレードすることが可能になりました。これらのダウングレードは文字列マージを無効にします。[719900]
- リンカ入力ファイル内の誤ったリロケーションはfatalエラーにするのではなく、エラーをダウングレードすることが可能になりました。 以下のエラーのダウングレードは、リロケーションのスキップを引き起こします:
L6217E, L6286E, L6738E, L6769E, L6781E, L6923E, L6924E
以下のエラーのダウングレードは、リロケーションがエラー状態であるにもかかわらず、処理を行わせます:
L6237E, L6241E, L6802E, L6898E
- リンカのファイル書き込み(L6002U)エラーはクリティカルではない出力のためにワーニングにダウングレードすることができます。クリティカルではない出力は--feedback, --symdef, --callgraphおよび--listオプションによって指定されたファイルです。[719898]
- オブジェクトがARM VFPライブラリによって必要とされるVMOV d, r, r命令をサポートしていないVFPv2やVFPv3をサポートしていることを示す属性を持っている場合、リンカエラーメッセージ"L6242E: Cannot link object <objname> as its attributes are incompatible with the image attributes"が表示されます。この状況において、armlinkは"L6482E: Image Attributes have no support for VMOV d,r,r and VMOV r,r,d instructions used by C-Libraries, please use the --cpu and --fpu options to select a core that supports these instructions"を発生させるようになりました。このエラーメッセージは抑制可能で、リンカにVFPv2命令を使用する浮動小数点ライブラリを選択させます。[720433]
浮動小数点サポートの改善
- ハードウェア浮動小数点リンケージをARM Linuxのためにサポートしました。しかしながら、ハードウェア浮動小数点サポートを暗黙的に示す--cpuオプションが定義されている場合を含み、ソフトウェア浮動小数点リンケージがデフォルトで使用されます。ARM Linuxでの使用を目的とする場合にハードウェア浮動小数点リンケージを使用するためには、明示的に適切な--fpuオプション(例:--fpu=vfpv3)か、--apcs=/hardfpを定義する必要があります。ハードウェア浮動小数点リンケージはARM Linux ABI supplement (http://www.codesourcery.com/sgpp/lite/arm/arm_gnu_linux_abi.pdf)ではサポートされておらず、これを示すワーニングがコンパイラから返されることに注意してください。[720519]
- 以下のオプションが--library_interfaceコマンドラインオプションに追加されました:
aeabi_glibc_hardfp
aeabi_clib_hardfp
aeabi_clib90_hardfp
aeabi_clib99_hardfp
これらのオプションはハードウェア浮動小数点呼び出し規則を用いるために、Cライブラリ(演算ライブラリを含む)の呼び出しを行います。これらのライブラリインターフェイスを--fpu=softvfpオプションを指定してコンパイルするときに使用するとエラーとなります。[721565]
- microlib内の一部の浮動小数点ルーチンのパフォーマンスが明確に改善しました。[678021]
一般的な改善
- Windows 7をサポートしました。
- 既存の__smlad組み込み関数等同様の特性を持つ__smladx, __smlaldx, __smlsdx, __smlsldx, __smuadxおよび__smusdx組み込み関数がコンパイラに追加されました。これらは関連するオペランド内でのハーフワードスワップを伴う組み込み関数の'X'バリアントを生成させます。[721831]
- 以前ベクタライズができなかった一部のループをベクタライズ可能とできるようにベクタライゼーションが改善されました。[670517]
- アセンブラソースや組み込みアセンブラから実行されたときに、アセンブラに対してコンパイラは--[no_]hide_allオプションを渡します。これはダイナミックリンケージを使用した際にシンボルのデフォルトビジビリティをセットします。[512423]
- 組み込みアセンブラ関数をstaticとして定義することができるようになりました。以前__asm関数をstaticとして定義すると、分割されたプロトタイプにおいて、'static'が発生した場合にエラー#1122またはinternal error 0xafc2dbを引き起こしていました。[720153]
- 新しいコンパイラオプション--[no_]rtti_dataがC++ RTTIデータの生成を制御するために追加されました。--no_rttiはdynamic_castのようなソースレベルRTTI機能のみを無効にし、--no_rtti_dataはソースレベル機能とRTTIデータの生成の両方を無効にします。GCCトランスレーション使用時、-fno-rttiは暗黙的に--no_rtti_dataを有効にします。[721182]
- コンパイラは新しいオプション-Pを追加しました。これは-Eのようにコンパイルなしで、入力ファイルのぷリプロセスを行います。しかしながら、このオプションはプリプロセスされた出力内にラインマーカーを生成しません。これはプリプロセス後の出力を他のスクリプトユーティリティによってパースされるような場合に使用可能です。[719509]
- /dev/nullのようなキャラクタデバイスからの入力をコンパイラが受け付けられるようになりました。以前、これらは不正なものとしてフォルトされていました。--compile_all_inputオプションは一般的にそのような名前をソースとして扱うことを要求されることに注意してください。[723224]
- イメージ内にダイナミックセグメントが既存であった場合、non-hiddenシンボルをエクスポートする新しいリンカオプション"--export-dynamic"が追加されました。これは常にnon-hiddenシンボルを常にエクスポートし、ダイナミックセグメントを強制的に生成するので、静的にリンクされたイメージを生成させるために使うことのできない"--export-all"オプションの追加となります。[720121]
- リンカはコマンドラインで--override_visibilityオプションが指定されていない為にステアリングファイル内のIMPORTやEXPORTコマンドが実行できない場合、ワーニングを発生させます。[677320]
- 共有ライブラリの生成時、--symbolicオプションが共有ライブラリ内のグローバル定義のオーバーライドからのダイナミックローダーの使用を避けるために使用可能でした。 armlinkはこのナレッジの利点を用い、同一ライブラリからもたらされるリファレンスのためのPLTエントリを生成しなくなりました。[721954]
- armlinkはsymverスクリプトおよびスキャッタファイル内のCスタイルマルチラインコメントを許すようになりました。[720472]
サポートされるOSプラットフォーム
Windows 7(NEW) Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit これらに加えて、以下のノンサポートなプラットフォームにおいてもパッチをテストしました: Windows 2000 SP4 SUSE Linux 9.2 Ubuntu Linux 8.10
パッチをインストールするには以下の手順で行います
1.ZIPファイルをテンポラリディレクトリに解凍してください。
2.以下をタイプしてRVCT 4.0のBuild400以降が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。既存のディレクトリはRVCT40INC環境変数で確認できます。
<Windowsの例>
C:>set RVCT40INC RVCT40INC=C:Program FilesARMRVCTData.00include
<Linuxの例>
> echo $RVCT40INC ~/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。既存のディレクトリはRVCT40LIB環境変数で確認できます。
<Windowsの例>
C:> set RVCT40LIB RVCT40LIB=C:Program FilesARMRVCTData.00lib
<Linuxの例>
> echo $RVCT40LIB ~/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、 テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。 既存のディレクトリはRVCT40BIN環境変数で確認できます。
<Windowsの例>
C:> set RVCT40BIN RVCT40BIN=C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの例>
> echo $RVCT40BIN ~/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 650が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。 その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 591から650での変更点および改善点は下記の通りとなります。
コンパイラ(armcc)
- コンパイラは--[no_]type_traits_helpersオプションを__is_unionや__has_virtual_destructorのような型特性ヘルパをサポートできるようになりました。ヘルパはデフォルトでnon-GNU C++モードで有効になっており、g++4.3以降のエミュレート時にも有効となっていました。唯一の変更はデフォルトをオーバーライド可能となった点です。[721045]
- profiler-guided最適化使用時、switchステートメントにおけるコード生成の問題を修正しました。[720056]
- 一部の状況において、それに続くロードのオフセットをオーバーフローさせるような、ロードのベースレジスタの不正な再利用が発生していました。この問題は修正されました。[720891]
- GNU Cモードにおいて、"&&a - &&b"の形式での関連するラベルオフセットのスタティックテーブルが不正なデータを含む可能性がありました。この問題は修正されました。[721194]
- ネストされたループの融合は、データタイプの制限を越えるようなアッパーバウンドを引き起こすことがあります。一部の条件において、コンパイラはこの状況を避けることに失敗していました。この問題は修正されました。[722205]
- リターン値が使用されるprintf関数に対してフォーマット文字列引数としてchar配列を渡すことが、不正にシンボル_scanf_wstringの参照を発生させる可能性がありました。この問題は修正されました。[723780]
- 未使用セクションの削除機能によって、呼び出しを含むセクションがすべて削除されている場合に、printfはリンクされなくなりました。[667818]
- 以前、組み込みアセンブラはオリジナルのCの名称を使用しようとしていたために、組み込みアセンブラ関数においてプロトタイプで__asm("name")のシンボルリネームキーワードの使用は動作しませんでした。これは修正され、渡されたアセンブラ名が使われるようになりました。[721806]
- C++例外生成が空のデストラクタボディを伴うクラスのローカル変数の生存範囲内で、switch式が発生した場合にクラッシュを引き起こす可能性がありました。この問題は修正されました。[721019]
- インライン定義された(明示的、暗黙的いずれの場合も)C++クラスメソッドは名前をつけられたELFセクションに配置され、DWARF2デバッグ情報(--debug --dwarf2)を使用してコンパイルしたときにリンクに失敗していました。この問題は修正されました。[723369]
- 以下のinternal faultの一部の原因について対応しました:
0xe664d6, 0xfc68b8, 0x87ecef, 0xafee20, 0x9f28b9 & 0x0d9491
[720108, 722435, 722511, 722766, 723231 & 723245]
アセンブラ(armasm)
- ディスティネーションレジスタとしてSPを使用するMOVやMVNオプションに対するA1546Wの精密な検知が改善しました。[720034]
- 不正なモード番号を持つSRSはエラーになります。以前の振舞いに戻すには--diag_warning=1584を使用することができます。[720203]
- アセンブラはデータタイプのサイズと等しいイミディエイトシフトを持つNEON VSHLおよびVQSHL命令に対する不正なコードの受付および生成をしなくなりました。[719812]
- ARM1136-rev1およびARM1176においてYIELD, WFE, WFIおよびSEVはNOPの振舞いとして診断されるようになりました。(診断1807)[719465]
- ディスアセンブラにおいて非特権命令のアーキテクチャ依存の診断を改善しました。 [720255]
- ARMv7-Mにおいて、ワードアラインではないPC相対のLDRDのアセンブルは非特権であると診断されます。[720720]
リンカ(armlink)
- IMPORT *とEXPORT *の両方を含むステアリングファイルに関する問題を修正しました。 armlinkは以下のエラーメッセージを出さなくなりました。 Error: L6279E: Ambiguous selectors found for ('IMPORT *' and 'EXPORT *') [719859]
- ライブラリサーチを破壊するので、リンカステアリングファイルのRENAMEシンボルコマンドはLib$$Requestシンボルエントリにリネームされなくなりました。[719736]
- armlinkは--no_veneershare選択時、スキャッタファイルに対して誤ったエラー、"Error: L6236E: No section matches selector - no section to be FIRST/LAST."を発生させなくなりました。[720539]
- armlink --show_cmdlineは以前のリリースのように入力オブジェクトおよびライブラリを表示するようになりました。[720197]
- RWおよびZIセクションの両方を含む実行リージョンに対してアサインされる__ATセクションの使用時ZIセクションを失う可能性がありました。この問題は修正されました。 [720096}
- 部分リンクオブジェクトファイルが同じくグループの一部であるセクションのSHF_STRINGSフラグを失ってしまう可能性がありました。もし部分オブジェクトが継続するリンクで使用され、そのセクションをグループが含む場合に、リンカはL6883Eを発生させていました。この問題は修正されました。[720254]
- GCCによって生成されたELFオブジェクトの一部において、index 0におけるシンボルへのリロケーションを持つことがありました。これは通常オブジェクトプロデューサによってエラーとして扱われ、armlinkはタイプR_ARM_V4BXでないリロケーションならエラーL6029を表示します。この問題は修正されました。[721112]
- リンカは部分リンク時にSHF_COMDATグループがマージされるかを制御する--[no_]merge_partial_comdatオプションをサポートしました。[720884]
- リンカが大きなELFセクションの為に呼び出しサイトに十分に近いところにベニアを配置できない場合、リンカはセクションのためのベニア生成を無限にループする可能性がありました。この問題は修正されました。[720424]
- リンカは不正なVFEセクションを含む入力オブジェクトがあった場合、クラッシュする可能性がありました。この問題は修正され、不正なVFE情報のためのエラーメッセージL6643, L6644, L6645, L6656)は抑制することが可能です。リンカがエラーを検知し、メッセージが抑制されている場合、コマンドラインで--vfemode=offを指定したのと同様にVFE最適化が無効になります。[720128 & 719899]
- TLSリロケーションR_ARM_TLS_LDM32がイメージに存在する場合、--sysvオプションをつけて(--arm_linux使用時暗黙的に有効)リンクすると、GOTセクションのサイズを過小に見ることがありました。リンカが静的リンクを行うとき、ダイナミックリンカおよびarmlinkによってリロケーションが解決される場合に問題を引き起こす可能性があります。 この問題は修正されました。[723207]
- グローバルデータシンボルへのweak-aliasを含み、ライブラリとアプリケーションの両方がweak-aliasを参照するような共有ライブラリに対するアプリケーションのリンク時、問題がおきる可能性がありました。アプリケーションに対してリンカはweakなaliasとして同一のアドレスにおいてnon-weakなシンボルをインポートする必要があり、weak-aliasを定義として、再定義およびエクスポートをしなければなりません。これはアプリケーションとライブラリの両方をデータアイテムの同一のコピーを使用することを可能にします。この問題は修正され、armlinkはweak-aliasをエクスポートします。[720795]
- 自動的にベースアドレス+サイズが0xFFFFFFFFより大きくなるような.ARM.__ATを配置する場合L6260Eが発生する可能性がありました。この問題は修正されました。[721272]
- 一定の条件化におけるmicrolibの使用時、リンカは不正に"Fatal error: L6787U: Region table handler '__scatterload_null' needed by entry for ER_DECOMPRESS was not found"エラーを発生させていました。この問題は修正されました。[723439]
- 大量の入力ファイルが有る場合に、サブプロセスコマンドラインの制限によってWindowsホスト上で、Link Time Code Generation (--ltcg)が失敗することがありました。この問題は修正されました。
- リンカはアドレスがMOVTおよびMOVW命令シーケンスによって生成される場合、ストリングセクションをマージできるようになりました。以前、リンカはL6412Wのワーニングを発生させ、未サポートのリロケーションを含むセクションのストリングマージを無効にしていました。[720759]
ライブラリ
- exit()に渡されるまたはmain()から返されるプログラムexitコードは裏に潜む_sys_exit()関数への道筋が完全ではありませんでした。この問題は修正されました。[722485]
- マルチスレッドプログラム内でのリアルタイムヒープの使用時、malloc()はエラーを返すケースでヒープmutexを解放していませんでした。この問題は修正されました。[722557]
- C++ランタイムライブラリ関数__aeabi_vec_ctor_cookie_nodtorが不正に実装されており、修正されました。[713271]
ELFフォーマットコンバータ(fromelf)
- "fromelf --elf"はリンカによって挿入されたあらゆるファイルオフセットを不正に削除していました。これはp_align ELFフィールドによって定義されたファイルオフセットを維持します。[720261]
RVCT4.0(Build 529から591) †
このRealView Compilation Tools(RVCT)4.0 Patch #3 Build591はRealView Developer Suite(RVDS) v4.0の製品とともに使用されることを意図しています。これはオリジナルのインストレーションまたは過去のパッチの適用の如何によらず、あらゆるRVDS v4.0 Standard、ProfessionalまたはEvaluationのインストレーションのアップデートを行う事ができます。その他のRVCT/RVDSまたはKeil MDK製品のリリースとは互換性がありません。
このパッチはRVCT/RVDS v4.0コンパイラ、リンカ、アセンブラ、fromelfおよびarmarのプログラム実行形式、更新されたincludeファイル、および更新されたC/C++ライブラリから構成されています。
新しいターゲットサポート
- Cortex-M0プロセッサのコアサポート(--cpu=Cortex-M0)
- i.MX51およびOMAP4xxxのデバイスサポート。サポートされるデバイスの全リスト表示は"armcc --device list"(ダブルクオートなしで入力)とコマンドラインから入力してください。
強化された浮動小数点演算ライブラリ
単精度C演算関数(sinf, logf, powf等)は速度、確度、単調増加性の改善と、可能な場合、ハードウェア浮動小数点(VFP)をより効率的に使用するように再実装されました。新しい実装ではVFPハードウェアを持たないターゲットにおいて2-4倍、VFPハードウェアを持つターゲットでは5-10倍の速度改善が期待できます。
拡張されたgccとの互換性
- "--gnu_defaults"オプションを追加しました。これはARM Linuxをターゲットとするようなプラットフォーム固有の設定を除くほとんどのARM GCCコンフィグレーションに共通となる、GCCに類似した基本的デフォルト動作を設定します。特に、-gnu_defaultsは以下を有効にします:
--gnu, --no_debug_macros, --enum_is_int, --signed_bitfields, --wchar32, および--no_hide_all
--gnuオプションの動作は同じままです。これは他の設定をarmccのデフォルトから変更することなくGCC言語拡張を有効にします。--arm_linuxオプションおよび他のARM Linuxをターゲットとするオプションは--gnu_defaultsおよびLinuxのためのプラットフォーム固有の設定も暗黙的に示します。
- GCC4.3.1以降に対し、ARM Linux用のGCCコマンドライントランスレーションを使うような設定を行った場合、コンパイラは-O3指定時に自動的にNEONベクタライゼーションを有効にします(RVDS Professionalのみ)。GCCオプションの-ftree-vectorizeまたは-fno-tree-vectorizeオプションを使用して明示的にベクタライズの有効無効をきりかえることができます。
- arm_linux/linux_rvct.hとarm_linux/limits.hのヘッダファイルはMB_LEN_MAXを6(ABIの推奨値)ではなく、16(glibcの予期する値)と定義するようになりました。
- リンカのエラーメッセージ"Error: L6029E: Relocation #REL:0 in object.o(section) is wrt invalid/missing symbol"は、--arm_linux使用時、ワーニングにダウングレードされました。これはNULLへの不正なリロケーションを含むGNUオブジェクトを完全にリンクできるようにします。
一般的な機能拡張
コンパイラ(armcc):
- 配列オブジェクトのデストラクションは__cxa_vec_dtor関数のかわりにより効率的なABI関数__aeabi_vec_dtorを使用するようにアップデートされました。
- コンパイラはセミコロンの不正な配置によってしばしば引き起こされる、空の依存性のある式に対するワーニングを発生させます。
- インターリーブされたアセンブラ出力においてロングストリングと64ビットデータディレクティブのフォーマットを改善しました。
リンカ(armlink):
- エントリポイントを含む複数の入力オブジェクトをサポートするために--ltcgオプションを機能拡張しました。注意:入力オブジェクトが1つ以上のエントリポイントを含む場合、--entry=entrypointコマンドを使用してそのうちから1つを選択しなければなりません。--ltcgオプションはオブジェクトとセクション間のマッピングを失うので、エントリポイントはグローバルなシンボル定義を用いなければなりません。例:--entry=__rt_entry
- armlinkが自動的に他のコマンドラインオプションをベースとしたパッチを追加するかどうかを制御する新しいリンカオプション"--[no_]implicit_branchpatch"(デフォルトではオン)を追加しました。例えば、--cpu=cortex-a8が定義された場合、--branchpatch=cortex-a8_q10オプションが暗黙に指定されます。
- 新しいオプション"--[no_]keep_protected_symbols"(デフォルトではオン)はSTV_PROTECTEDビジビリティを伴うシンボルを含むセクションが削除されるのを避けます。
- ミスマッチしたPRES8/REQ8ビルド属性のワーニングを抑制する機能を追加しました。以前、--arm_linuxを使用した場合、リンカはそれらの属性を欠いているGNUオブジェクトとの互換性を維持するために警告するためのミスマッチしたPRES8/REQ8ビルド属性のエラーをダウングレードしていました。ユーザはこれらをまとめて"--diag_suppress=6238"などを使うことにより抑制可能となります。
- アプリケーション及び共有オブジェクト内のexportされた関数において、未使用セクション内の関数であっても必要な関数に関しては、リンカが未使用セクションの削除を行わないようにする"--[no_]keep_protected_symbols"を追加しました。
複数のツール
- WindowsにおいてCygwinパスを許可するようになりました。Cygwinコマンドセットからの'cygpath'プログラムは必要に応じてパス文字列を変換するフィルターとして実行されます。この変換を有効にするためにCYGPATH環境変数は完全な絶対Windowsパスと適切なcygpath.exeの名前を含む必要があります。例:"CYGPATH=C:/cygwin/bin/cygpath.exe"
- 新しいオプション--version_numberはパースしやすいフォーマットでバージョンとビルド番号を出力します。
- --apcs=/softfpおよび--apcs=/hardfpオプションは整数型または浮動小数点型のプロシジャーコールスタンダードバリアントをリクエストする代替の方法として有効となりました。これはプロシジャーコールスタンダードを--fpuオプションによって有効となる浮動小数点ハードウェアのバージョンとは別に定義することができます。以前同様、--fpuオプションによりプロシジャーコールスタンダードを定義することができますが、--apcsを使用することを推奨します。
- ソースがどのような浮動小数点演算についても使用することを許さないことを示す--fpu=noneオプションのかわりに--fpmode=noneの使用を許します。
RVCTパッチ アップデート時の注意点
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
上記ページに公開されているパッチはRVDSv4.0 Standard、Professionalおよび評価版にのみ適用可能です。過去(v3.1およびそれ以前)のRVCT/RVDSのリリースおよびKeil MDK製品には適用できません。
このパッチには、RVCT/RVDSv4.0のコンパイラ、リンカ、アセンブラ、fromelfおよびarmarの実行形式とアップデートされたインクルードファイルおよびC/C++ライブラリが含まれます。
サポートされるOSプラットフォーム
Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit これらに加えて、以下のノンサポートなプラットフォームにおいてもパッチをテストしました: Windows 2000 SP4 SUSE Linux 9.2 Ubuntu Linux 8.10
パッチをインストールするには以下の手順で行います
1.ZIPファイルをテンポラリディレクトリに解凍してください。
2.以下をタイプしてRVCT 4.0のBuild400以降が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。既存のディレクトリはRVCT40INC環境変数で確認できます。
<Windowsの例>
C:>set RVCT40INC RVCT40INC=C:Program FilesARMRVCTData.00include
<Linuxの例>
> echo $RVCT40INC ~/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。既存のディレクトリはRVCT40LIB環境変数で確認できます。
<Windowsの例>
C:> set RVCT40LIB RVCT40LIB=C:Program FilesARMRVCTData.00lib
<Linuxの例>
> echo $RVCT40LIB ~/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、 テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。 既存のディレクトリはRVCT40BIN環境変数で確認できます。
<Windowsの例>
C:> set RVCT40BIN RVCT40BIN=C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの例>
> echo $RVCT40BIN ~/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 591が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。 その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 529から591での修正点は下記の通りとなります。
コンパイラ(armcc)
- --wchar32のオプション使用時、構造体初期化子からの参照のために生成されたワイドキャラクタ文字のリテラルは正しいアライメントを保証し、4バイトアライメントのセクションに配置されるようになりました。
- コマンドラインの浮動小数点オプションはGCCコマンドライントランスレーション使用時に以前のオプションを正しくオーバーライドするようになりました。
- 64ビットの非整列な値がロードされ、部分的にのみ使用されている一部のケースにおいて、コンパイラが非整列なワードのロード命令を生成する可能性があったのを修正しました。
- "--cpu QSP"オプションを使用してコンパイルしたとき、SWP命令が不正に並べ替えられることがあったのを修正しました。
- シフトされたオペランドを伴うMVNをネゲーションのない単純なシフトに不正に最適化する可能性があったのを修正しました。
- 可変引数関数の8バイトスタックアライメントの処理をコンパイラが失敗する可能性があったのを修正しました。
- --sys_includeオプションと--preincludeオプションを組み合わせて使用したとき、インクルードファイルの参照に失敗する問題を修正しました。
- 関数の戻りが変数に割り当てられているとき、関数の引数を正しく設定するようになりました。
- 派生クラスのためのRTTIが基底クラスのRTTIを参照する必要があり、基底クラスがdllimportでマークされているときにコンパイラはそれが他のトランスレーションユニットからエクスポートされるかを決定できなくとも基底クラスのRTTIを定義することができます。
- 以下のinternal faultの原因を修正しました:
0x5ac887, 0x87ecef, 0xafee20, #2409, 0xc31b6d, 0x6bca8b, 0x19c380
- ループアンローリングに関連するクラッシュの問題を修正しました。
- try-blockを含む派生クラスのデストラクションと基底クラスのデストラクタが空の関数として定義されていた場合のクラッシュの問題を修正しました。
Cライブラリ
- ユーザコード内での__user_heap_extendの定義がライブラリ内におけるシンボルの多重定義によってリンクエラーを引き起こす問題を修正しました。
アセンブラ(armasm)
- --arm_only使用時、選択したターゲットアーキテクチャの値を{ARCHITECTURE}ビルトイン変数が持つようになりました。
- NEON命令において、.F16データタイプは.16データタイプの代わりとして許されるようになりました。
- 16以上の単精度レジスタをVLDM/VSTM命令が正しく扱うようになりました。
- LDM命令がレジスタリスト内のLRとPCを用いて(例:LDMFD sp!, {r0-r12, lr, pc}^)ARMステートの例外からリターンするときに、"Warning: A1745W: This register combination is DEPRECATED"を返さなくなりました。
ELFフォーマットコンバータ(fromelf)
- fromelf --elfはLinuxイメージを扱うときにinternal faultを起こさなくなりました。
- Thumb2EEコードを正しくディスアセンブルするようになりました。
ライブラリアン(armar)
- リプレース(r)モードでarmarが同一名称の2つの入力ファイルを渡されたとき、2番目のファイルは最初のものを置き換えなくなりました。
リンカ(armlink)
- リンカは追加のリンカ定義シンボルを生成します:
Load$$region_name$$ZI$$Base Load - 実行リージョン内のZI出力セクションのアドレス Load$$region_name$$ZI$$Length Load - ZI出力セクションのバイトサイズ Load$$region_name$$ZI$$Limit - 実行リージョン内のZI出力セクションの末尾を越えるバイトのロードアドレス
- region_nameがZEROPADスキャッタローディング実行リージョン属性を持たないならZIのロード長は0となります。ZEROPADがセットされていればロード長はImage$$region_name$$ZI$$Lengthと等しくなります。
- ターゲットアーキテクチャがARM-onlyまたはThumb-onlyの場合、armlinkはインターワーキングセクションが非インターワーキングセクションのアドレスを取るとき、エラーを返さなくなりました。
- ARM-stateシンボルに対して"Warning L6765W : Shared object entry points must be ARM-state when linking architecture 4T objects." のエラーは生成されなくなりました。
- --arm_linux, --ltcgおよび--library=<lib>コマンドラインオプションが一緒に使われているとき正しくarmlinkが動作するようになりました。
- 実行リージョンから派生される最初の出力セクションのsh_addralignを書き込むとき、スキャッタローディングリージョン属性ALIGNは考慮されるようになりました。同様に、ロードリージョンのALIGNは関連付けられたプログラムヘッダのp_alignフィールドをセットします。
RVCT4.0(Build 471から529) †
RVCTパッチ アップデート時の注意点
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
上記ページに公開されているパッチはRVDSv4.0 Standard、Professionalおよび評価版にのみ適用可能です。 過去(v3.1およびそれ以前)のRVCT/RVDSのリリースおよびKeil MDK製品には適用できません。
このパッチには、RVCT/RVDSv4.0のコンパイラ、リンカ、アセンブラ、fromelfおよびarmarの実行形式とアップデートされたインクルードファイルおよびC/C++ライブラリが含まれます。
サポートされるOSプラットフォーム
Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit
パッチをインストールするには以下の手順で行います
1.以下をタイプしてRVCT 4.0のBuild400以降が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
2.ZIPファイルをテンポラリディレクトリに解凍してください。
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。 デフォルトのincludeディレクトリの場所は次の場所になります。
<Windowsの場合>
C:Program FilesARMRVCTData.00include
<Linuxの場合>
~/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。 デフォルトのlibディレクトリの場所は次の場所になります。
<Windowsの場合>
C:Program FilesARMRVCTData.00lib
<Linuxの場合>
~/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、 テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。 デフォルトのインストールディレクトリの場所は次の場所になります。
<Windowsの場合>
C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの場合>
~/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 529が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。 その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 471から529への変更点および改善点は下記の通りとなります。
コンパイラ(armcc)
- 新しい"--version_number"オプションが追加されました。--vsnとは異なり、--version_numberでは、単純な6桁のコンパイラバージョン文字列(例:400529)のみを表示させ、ライセンスのチェックは行いません。これは使用されているRVCTのバージョンをチェックする必要があるビルドシステムでの使用を目的としています。
- 新しい"--visibility_inlines_hidden"オプションが追加されました。このオプションは、インラインメンバ関数が、class __declspec(dllexport)、クラスvisibility属性、#pragma GCC visibilityおよび--no_hide_allからのダイナミックリンケージ('default' visibility)の獲得を防ぎます。これは、非メンバ関数には影響しません。
- "--export_all_vtbl"オプションは、対応するvtablesがエクスポートされる場合に限り、必ずエクスポートされるvtable tables(_ZTT*)のコンストラクションを発生させます。
- コンパイラは算術関数に__hardfp_プレフィックスを追加しなくなりました。例えば、RVCTライブラリインタフェースを使用せず、ユーザコードで、sin()が定義されるような場合です。
- マクロ__FILE__はコマンドラインから再定義できるようになりました。例えば、"-D__FILE__= __MODULE__"は__FILE__においてパス情報なしにファイル名のみが用いられます。
- コンパイラはフルIEEEモード(--fpmode= ieee_full)において、Tag_ABI_FP_exceptionsをセットするようになりました。
- GNU Cモードにおいて、コンパイラは他の手段によって(動的に)初期化されるという仮定の下、未初期化のグローバルなconstオブジェクトを書き込み可能なストレージ内に配置するようになりました。これは、以下のような定義に適用されます:
int const n;
GCCコマンドライントランスレーションモードでのデフォルトである、--relaxed_ref_defにおいては、このような定義はcommonであることに注意してください。
- '-MD'を含むGCCコマンドラインのトランスレーションにおいて、-MFオプションによる明示的な依存関係ファイルロケーションの指定がない場合に、カレントワーキングディレクトリに不正に配置される可能性があります。依存関係ファイルは出力オブジェクトファイルと同じディレクトリに生成されるようになりました。
- コンパイラは、GCC "__attribute__ ( (destructor) )"をサポートするようになりました。これはルーチンへの参照をSHT_FINI_ARRAYセクションに配置します。"__attribute__ ( (constructor) )"はサポート済みです。
- 変数および関数に対するGCC 'weakref'属性は正しく実装されました。
- Google Androidベースプラットフォーム用のGCC設定をサポートする、既存のGNUツールチェインに対するGCCコマンドライントランスレーションのためのarmccの設定において、一部の改良が行われました。
- クラスにおける__declspec(dllexport)は、他のRTTI情報とともに、typeinfo name変数(_ZTS...)をエクスポートされるようになりました。
- 'dllexport'なしに'dllexport'とマークされたクラスのメンバがクラス外に定義された場合、以前のRVCT4.0パッチbuild471はdiagnosticを表示していました。'dllexport'はこの状況において、暗黙のうちにメンバ関数に適用されるので、diagnosticは発生させなくなりました。
- ZI変数の絶対アドレス(AT extension)はRWデータセクションではなく、ZIデータセクションに正しく配置されるようになりました。
- 以下のような最適化に関する改善が行われました:
-if/else条件分岐をともなう関数に対するポインタの置き換えによる、長いパイプラインを持つプロセッサにおけるパフォーマンスの改良。 -USAT命令の生成は-O3 -Otimeにおいて改善されました。
- builtin_parity組み込み関数の出力が修正されました。以前は結果の最下位ビットにパリティがありました。組み込み関数は、パリティビットに0か1のみを返すようになりました。
- 一部、gotoまたはswitch case経由でループのボディに入る折に、コンパイラワーニング#128-D "loop unreachable from preceding code"が見せ掛けで発生していたものが修正されました。
- 一部のまれなケースで、integer部分式が最小の負数(例:INT32_MIN)を-1による除算ををおこなった場合、オーバーフローを発生し、コンパイラがクラッシュする可能性がありました。これは修正されました。
- リターンの結果が用いられないvolatileオブジェクトを返す関数のインライン化によって、volatileオブジェクトのロードが削除される可能性がありました。これは修正されました。
- コンパイラはWindows上で実行された際に、C++ヘッダファイルへのパスを失うようなARM Linux用のコンフィグレーションファイルを生成する可能性がありました。これは修正されました。
- GCCコマンドライントランスレーションモードにおいて、サイズゼロのデータアイテム(GCC拡張)、またはより一般的な--bss_threshold=0の使用においてinternal fault 0x6e3f3bが発生する可能性がありました。これは修正されました。 これらのデータアイテムは、1バイトのzero-initialized store(BSS)をリザーブするようになりました。
- 以下のinternal faultを起こす可能性のある原因を修正しました: 0x265580, 0x6e3f3b, 0x87ecef, 0xb36758, 0xc31b6d, 0xc18024, 0xd24575, 0xdb2e1f, 0xeea2c1
- Windowsにおいて、コンパイラがリンカをサブプログラムとして起動した場合に、armccへのpathとリンカへのパスがスペースを含むようなある特定のケースで、"'C:Program' is not recognized..."のようなメッセージとともに実行が失敗することがありました。これは修正されました。
C/C++ライブラリ
- errono変数のアドレスを得る方法を提供することで、一部のアプリケーションおよびライブラリのリンクをアシストするために、Cライブラリは__errnoを__aeabi_errno_addrのエイリアスとして定義しました。Cプロトタイプは"int *__errno(void)"です。
- スタックポインタ(SP)はRWデータデコンプレッサが使われる前にMicrolibによって初期化されるようになりました。
- atan2f()は入力パラメータが+0/-0の場合、NaNを返すように修正されました。
- modf()は、最初の入力パラメータがNaNの場合、NaNを返すように修正されました。
アセンブラ(armasm)
- EXTERNディレクティブを使用した場合に、壊れたオブジェクトファイルを生成する可能性がある問題を修正しました。
- 空のAREA内に定義されたラベルはAREAのタイプによって常にそのタイプを持つようになりました。
リンカ(armlink)
- armlinkはターゲットアドレスが最初の4Kリージョンであり、2つの4K領域にかかる32ビットThumb-2分岐命令に影響のある、Cortex-A8エラッタ657417に対応しています。
以下の両方の条件が成り立つ場合にこの修正が有効となります。 -armlinkコマンドラインオプション--branchpatch=cortex-a8_q109が使用されている。 -armlinkコマンドラインオプション--cpu=cortex-a8が使用され、フルリンクが行われる。
これは、Cortex-A8 revision r3p0またはそれ以前のレビジョン上で実行されるThumb-2コードのためだけに必要となります。このエラッタのより詳細についてはご使用になられているシリコンのベンダに連絡してください。この修正が有効になると、リンカはエラッタにある振る舞いを引き起こす可能性のある命令シーケンスをスキャンします。オブジェクト、セクションおよびセクション内のオフセットを知るために、"--info patches"オプションを使用してください。リンカが検索するこの問題を引き起こす条件は以下の通りです:-領域の境界をまたがる4バイトのThumb-2直接分岐命令。 例:(address & 0xffe) == 0xffe -4KB以内の幅で、後方への分岐命令。 -分岐の前にある命令が4バイトの非分岐命令。 リンカパッチは後方分岐をセクションの最後のパッチに対する前方分岐に変換します。 このパッチはターゲットに対する無条件の後方分岐を含みます。 このパッチは後方分岐が領域の境界をまたがらないようにアラインされています。 以下の制限事項があります: -部分リンクの場合、そのアドレスが領域の境界に配置されないようなアドレスである ことがわかるようなアドレス情報をリンカが常に持つことができません。これは、パ ッチがフルリンクで使用される場合に比べ、より多くの命令に対してパッチを用いる 可能性があることを意味します。 -パッチを必要とする分岐は、セクションの終わりにあるパッチに届かなければなりま せん。リンカが分岐の範囲内にパッチを配置できない場合、ワーニングメッセージが 表示されます。無条件Thumb-2分岐の範囲は16MB、条件付Thumb-2分岐の範囲は512KBで あり、その為、事実上これは発生しません。 -リンカはパッチを含むあらゆるプログラムセグメントのアライメントを4KBに増やします。
- デフォルトでは抑制されている一部の診断メッセージを有効にする、新しい"--remarks"オプションが追加されました。追加の診断メッセージは以下を警告します:
-armccのバージョン4.0から完全にビルドされたオブジェクトにおいて必要とされないヘルパライブラリの使用 ---apcs=/fpicまたは--apcs=/ropiをもちいてオブジェクトがコンパイルされない時の--fpicの使用 -RW圧縮がoffになっている一部のケース -セクション外のアドレスを持つマッピングシンボル($a, $t, $d ...) -シンボルがステアリングファイル内のIMPORTおよびEXPORTコマンド経由でダイナミックシンボルテーブルに対し/から、インポート/エクスポートできない場合
- '--sysv'オプション使用時ELFファイル出力内に以下の為に追加のセクションが足されました:
-.init -.fini -.ARM.exidx -.preinit_array -.init_array -.fini_array 過去のバージョンでは、これらのセクションは.textまたは.dataセクションに割り当てられていました。
- マニュアルに記載されている通り、リンカは未アサインのセクションを.ANYセクションリージョンに割り当てるようになりました。
例:最大のセクションは、一番最初にある利用可能なスペースを持つ実行リージョンに割り当てられます、等。
- weakな参照およびダイナミックリンクに関するリンカの振る舞いは以下のように変更されました:
---sysv用:未解決のweakな参照はステアリングファイルのIMPORTディレクティブ経由でダイナミックシンボルテーブルに配置することができるようになりました。 ---bapi用:リンカはコマンドライン上で供給されたDLLによって定義されたシンボルの場合のみダイナミックシンボルテーブル内のweakな参照を許可します。 未解決のweakな参照はIMPORTディレクティブ経由のダイナミックシンボルテーブルには配置できません。
- 匿名のグローバルシンボル定義の直前におけるARM/Thumb同義語処理に関する問題が修正されました。
- RVCT v4.0のarmlink --info=debugオプションがv3.1よりも少なく重複したデバッグ情報をレポートする問題を修正しました。
- 1つの実行領域内に2つのセクションが+FIRSTでマークされているものを正しく診断するようになりました。
- イメージ内のC++のマングリングされた名前をもつシンボルがない場合に、armlink --match=crossmangledはクラッシュしなくなりました。
- 受け付けられないcomdatグループ内のセクションからターゲットシンボルなしで、正しくR_ARM_V4BXリロケーションを処理します。
ELFフォーマットコンバータ(fromelf)
- "fromelf --strip debug,symbols"はシンボルテーブル(.symtab)およびストリングテーブル(.strtab)を完全にストリップするようになりました。
RVCT4.0(Build 400から471) †
RVCTパッチ アップデート時の注意点
RVDSv4.0のパッチは、ARM社のWebサイトよりダウンロード可能です。
Standard:
https://silver.arm.com/browse/RVS40
Professional:
https://silver.arm.com/browse/RVP40
上記ページに公開されているパッチはRVDSv4.0 Standard、Professionalおよび評価版にのみ適用可能です。
過去(v3.1およびそれ以前)のRVCT/RVDSのリリースおよびKeil MDK製品には適用できません。
WindowsおよびLinux実行形式に含まれるFLEXnetクライアントライセンシングコードが10.8.5.0から10.8.7.0に更新されています。
このアップデートではWindows XP SP3での使用に関する追加チェックが行われています。
サポートされるOSプラットフォーム
Windows XP SP2, 32-bit & 64-bit Windows XP SP3, 32-bit Windows Vista Business Edition SP1, 32-bit & 64-bit Windows Vista Enterprise Edition SP1, 32-bit & 64-bit Windows Server 2003 32-bit & 64-bit Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit
インストール手順
パッチをインストールするには以下の手順で行います
1.以下をタイプしてRVCT 4.0が使用されていることを確認してください。
armcc --vsn
また、Linux環境の場合以下のコマンドを実行してarmccの場所を確認してください。
which armcc
2.ZIPファイルをテンポラリディレクトリに解凍してください。
3.includeディレクトリをテンポラリディレクトリから既存のRVCT includeディレクトリにコピーしてください。
デフォルトのincludeディレクトリの場所は次の場所になります。
<Windowsの場合>
C:Program FilesARMRVCTData.00include
<Linuxの場合>
~/ARM/RVCT/Data/4.0/400/include/
4.libディレクトリをテンポラリディレクトリから既存のRVCT libraryディレクトリにコピーしてください。
デフォルトのlibディレクトリの場所は次の場所になります。
<Windowsの場合>
C:Program FilesARMRVCTData.00lib
<Linuxの場合>
~/ARM/RVCT/Data/4.0/400/lib/
5.win_32-pentiumディレクトリ(Linux用の場合、linux-pentiumディレクトリ)を、
テンポラリディレクトリから既存のRVCTのインストールディレクトリにコピーしてください。
デフォルトのインストールディレクトリの場所は次の場所になります。
<Windowsの場合>
C:Program FilesARMRVCTPrograms.00win_32-pentium
<Linuxの場合>
~/ARM/RVCT/Programs/4.0/400/linux-pentium/
もし必要なら、解凍するディレクトリをツールのインストールしている場所にあうように変更してください。
6.これでアップデートツールがインストールされます。
コマンドラインから、以下の様に入力し、お客様の意図されるバージョンが返されるかを確認してください。
armcc --vsn armlink --vsn armasm --vsn fromelf --vsn armar --vsn
バージョンはRVCT 4.0 build 471が返されるべきです。
7.Linux版の場合、実行形式の解凍後にUNIXのパーミッションがリセットされる為実行ができなくなる場合があります。
その場合、次のようにユーザパーミッションをセットして、解決してください。
chmod u+x armcc
RVCTパッチBuild 400から471への変更点および改善点は下記の通りとなります。
コンパイラ(armcc)
- LDRDでベースレジスタが最初にロードされるレジスタと同じであった場合におけるCortex-M3エラッタ602117に対応しました。
C/C++ライブラリもこの命令を避けるようにリビルドされました。
- Profiler Guided最適化メカニズムにおいて、一部のコードサイズおよびパフォーマンスの改善が行われました。
- NEONコンパイルにおいて一部のコード生成および最適化の改善が行われました。
- --gnuおよび--arm-linuxオプションを使用したコンパイルにおいて次のような互換性の改善が行われました:
- gccトランスレーションモードについて、-mfpu=neonおよび-fno-inlineオプションを正しくトランスレートするようになりました。
- GCC浮動小数点最適化オプションに対するより良いトランスレーションが行われるようになりました。
- GCCコマンドラインオプションの一部のエイリアスについて正しくトランスレーションされるようになりました。
- --library_interface=aeabi_glibcオプション使用時のglibc setjmpバリアントを正しく認識し、これらの呼び出しの前に正しいコードを生成するようになりました。
- ARM Linuxモードにおいて、オーバーライドされるデフォルトシンボルの可視性を正しく許可するようになりました。
- gnu __builtin_va_...関数を改善しました。
- 既存のGNUツールチェインの全てのpathをベースとするARM Linuxコンパイラのコンフィグレーション時、名前だけで定義されたライブラリを正しくチェックするようになりました。
- __builtin_powi、__builtin_powifおよび__builtin_powilといったGNUビルトインを正しくトランスレートするようになりました。
- コンパイラによるDWARFデバッグ情報生成について一部修正が行われました。
- c55x.hに対し、さらなるTI C55x組み込み関数が追加されました。
- typeidオペレータの使用からスローされるbad_typeid例外をキャッチするコードを生成できるようになりました。
- __weakでマークされた組み込みアセンブラ(__asm)関数に対し、定義が失われないように、Cコードからのweakな参照を生成しなくなりました。weakシンボルは依然アセンブラの出力には生成されます。
- Cソースとしてプリプロセス済みの拡張子.iを持つファイルに加えて(例:プリプロセスを抑制したいソース)、.iiがプリプロセス済みのC++ソースを示すことを認識するようになりました。
- 一部のコード生成に対する問題を解消しました。
- ASRシフトを伴うPKHTB命令およびLSLシフトを伴うPKHBT命令をより多くのケースにおいて使用する可能性が増えました。
- 64bitデータタイプのvolatileアクセスに対しLDRD/STRDを生成します。
- クラスにおける__declspecの使用が無視されなくなりました。
以下のinternal faultを起こしうる問題に対応しました:
0x15f950, 0x298170, 0x3dd550, 0x44784c, 0x4ccb3b, 0x9c3725, 0x974f57, 0xafee20, 0xeeed90, 0xf28d9c
C/C++ライブラリ
- $RVCT40INC/arm_linuxディレクトリ内にあるARM Linuxで使用されるfloat.hのバリアントは変更されました。
デフォルトでは、FLT_ROUNDSはround-to-nearestを意味する1が定義されており、これはGCCの振る舞いに対応しています。
しかしながら、これはISO Cに準拠していません。
スタンダードに準拠するには、FLT_ROUNDSは浮動小数点環境においてその値が変化する式に拡張されなければなりません。
厳密にISO Cの振る舞いに準拠する必要があればFLT_ROUNDSの代わりの定義が提供されます。
これはソースコードをコンパイルする際に、マクロ__ARMCC_STRICT_FLT_ROUNDSの定義をすることによって可能になります。
このマクロのバリアントはfegetround()の呼び出しを使用しますので、
バリアント使用時には、glibc算術ライブラリ(libm.soまたはlibm.a)をリンクする必要があります。
- ARM Linux用のfloat.hのバリアントは正しく__ieee_status()を参照するようになりました。
- --gnuモードにおいてconstの同義語として用いられないようにするため、arm_neon.hは__constをマクロとして定義しないようになりました。
- glibcヘッダファイルsys/cdefs.hのラッパーが$RVCT40INC/arm_linuxに加えられました。
これはarmccではサポートされていない、GCC4.3ビルトイン__builtin_va_arg_packおよび__builtin_va_arg_pack_lenを使用しないようにします。
- RVCTで提供されるSTL実装内で、<list>および<vector>は時折アロケータによってスローされる例外をうまく伝えられないことがありました。この問題は解消されました。
- "typedef bool _Bool;"を有用に使用するC++コードを壊してしまうので、C++モードでは__Boolが事前定義されなくなりました。マニュアル等に記載されている通りCモードでは定義されています。
アセンブラ(armasm)
- v7-A用アセンブルを行う際に、SMC(以前はSMI)命令の使用を可能にする、v7-A + セキュリティ拡張の--cpuオプション("--cpu=7-A.security")が追加されました。
- Thumb-2コードをアセンブルする際にITブロック内のラベルに関するエラーをダウングレードするarmasm --diag_warning=1722に関する退行の問題を修正しました。
- BKPTは常に条件なしであるために、Thumb ITブロック内の条件付BKPT命令はエラーになるようになりました。
- 一部の正しいARMデータ処理命令を誤って予測できないまたは非推奨であるように判断しなくなりました。
- ATTRディレクティブが適用されていないことを警告するようになりました。
- EQUによるシンボル定義を伴うRELOCの使用に関する問題を修正しました。
リンカ(armlink)
- main()に対するCライブラリ初期化コードからの呼び出しが検出されなかたっために未使用であるとレポートされてしまう、main()に対する"Linker feedback"の問題を修正しました。
- セクション内での分岐のないリロケーションがあり、ディスティネーションシンボルとして同一のアドレスに複数のシンボルがあった場合に、リンカのコールグラフにおいて呼び出される関数が未使用であると出力される問題を修正しました。
- リンカコールグラフはリンカによってnopに変形されるテイルコールを正しく検出するようになりました。
- 例えば、"foo.o"は、"foo.bar"とは合致しないといったように、"."を含むオブジェクトファイルのセクションをスキャッタで正しく扱えるようになりました。
- イメージのビルド属性から得られるアーキテクチャが、入力オブジェクト内に存在するARMまたはThumbコードと合致しないときにarmlinkはInternal fault 0xb4562dを起こさなくなりました。
- Linuxアプリケーションをビルドする際に、オブジェクトの.note.ABI-tag SHT_NOTEセクションは、シェアドオブジェクトの.note.ABI-tagセクションと同様の方法で処理されるようになりました。
- 新しいコマンドラインオプション--gnu_linker_defined_symsが追加されました。
このオプションはデフォルトではoffですが、--arm_linuxを指定されると有効になります。
このオプションをリンカに渡すとGNUと同等な入力セクションシンボルのサポートが行われます。
__start_SectionName(RVCTでは、SectionName$$Base)-SectionNameと呼ばれる統合セクションの開始アドレス
__stop_SectionName(RVCTでは、SectionName$$Limit)-SectionNameと呼ばれる統合セクションの終端を越えるバイトのアドレス
GNU入力セクションシンボルによるSectionNameの参照はarmlinkによってunusedとしてセクションが削除されるのを避けるのに足りることに注意してください。
RVCT入力セクションシンボルによる参照はunusedとしてセクションが削除されるのを避けるのには不十分です。
- 新しいコマンドラインオプション--[no_]add_shared_referencesが追加されました。
このオプションはデフォルトではoffですが、--arm_linuxを指定されると有効になります。
このオプションは、--sysv modeの振る舞いに影響します。
--add_shared_referencesがセットされると、アプリケーションのリンク時にリンカは共有ライブラリからの参照を追加します。
リンカはそれらの参照がアプリケーションまたは他のシェアドライブラリによって定義されていなければ未定義シンボルエラーメッセージを発生させます。
それらの参照はstaticな'ar'フォーマットライブラリによって解決することができます。
*注意*
共有ライブラリからの参照は、動的シンボルテーブル内にエクスポートすることのできるシンボルだけ、
つまり、protectedまたはデフォルトの可視性をもったシンボル定義によってのみ解決することができます。
リンカはhiddenまたはinternalな可視性をもったシンボルによってシンボル参照が解決されるとき、エラーメッセージを表示します。
- シンボルバージョニングスクリプトによってローカルシンボルバージョンとされたデフォルトの可視性をもつシンボルはリロケーションによって必要とされない限り、
動的シンボルテーブルにエクスポートされなくなりました。
以前のarmlinkのバージョンでは、シンボルはローカルバージョンとしてエクスポートされていました。
- プログラムが依存する各共有ライブラリのために、リンカは動的セグメント内にDT_NEEDEDタグを追加します。
ld.soのようなプログラムローダはこれらの依存関係を読み、自動的にそれらの共有ライブラリをロードします。
ロードされるライブラリの順番は、コマンドラインに示されるライブラリの順番がDT_NEEDEDの順番と合致することが重要な場合があります。
4.0のリリースバージョンでは、この順番はリストにおけるポジション2用と意図されたライブラリがポジション3にくるという不正な結果になる可能性があります。
もしポジション2でのライブラリが、ポジション3でのライブラリ内のシンボルを先取りする必要がある場合に限ってこれは重要となります。
この問題は修正済みです。以前のarmlinkバージョンでは、シンボルはローカルバージョンとしてエクスポートされていました。
RVCT入力セクションシンボルによる参照はunusedとしてセクションが削除されるのを避けるのには不十分です。
ELFフォーマットコンバータ(fromelf)
- ゼロ初期化されるデータの長さが異なる2つのファイルを比較したときに、"fromelf --compare sections"がInternal fault 0x0ad3f4を起こさなくなりました。
- ライブラリ(複数のオブジェクトを含む)を処理している際に、fromelfがクラッシュする問題を解決しました。
- 実行可能イメージにおけるfromelf -ecはコードに対する例外テーブルからの参照におけるオフセットを正しく表示するようになりました。