パッチプログラムをダウンロードするには、事前にARM社のコネクトサービスのアカウントを取得し、ログインしておく必要があります。アカウントの取得は以下のURL から無償で行う事ができます:
https://login.arm.com/register.php
ARM Compiler toolchain v5.04 (build 27)
このARM Compiler Toolchain v5.04 Build 27 は、既存のDS-5を更新することを目的として使用されます。このパッチは、RVCT/RVDS での使用は適切でありません。 異なったバージョン番号を持つARMコンパイラの複数の機能リリースは、同一のマシンに共存インストール可能です。同一の機能リリースに対する複数のアップデートバージョン(例:5.03u2と5.03u3)を同一マシンにインストールすることはサポートされておりません。
DS-5のパッチは、ARM社のWebサイトよりダウンロード可能です。
https://silver.arm.com/browse/DS500
このアップデートは、最新のコンパイラおよび、リンカ、アセンブラ、 fromelf、およびarmarの実行可能形式と、インクルードファイルおよびC / C++ ライブラリから構成されています。
サポートされるOSプラットフォーム
Windows XP Service Pack 3 (32-bit only) Windows Server 2003 Windows Server 2008 R2 Windows 7 Enterprise Service Pack 1 Windows 7 Professional Service Pack 1 Windows 8 (64-bit) Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit Red Hat Linux Enterprise 6 for x86, 32-bit & 64-bit Ubuntu Linux 12.04 LTS, 32-bit & 64-bit
パッチをインストールするには以下の手順で行います
Linux の場合
1.上記サイトからパッチプログラムをダウンロードしてください。
2.tgz ファイルをテンポラリディレクトリに解凍してください。
3.Installer ディレクトリ内の "setup.sh" を実行し、画面の指示に従って、ARM Compiler v5.04をインストールしてください。
4.これでアップデートツールがインストールされます。
Windows の場合
1.上記サイトからパッチプログラムをダウンロードしてください。
2.ZIP ファイルをテンポラリディレクトリに解凍してください。
3.Installer ディレクトリ内の "setup.exe" をダブルクリックし、インストーラの画面の指示に従って、ARM Compiler v5.03をインストールしてください。
4.これでアップデートツールがインストールされます。
v5.04での追加機能
アセンブラ(armasm)
- アセンブラは、M プロファイルコアにおいて条件実行 MSR インストラクションの IT ブロックの生成に失敗する場合があり、代わりに条件なしの命令を生成していました。この不具合は修正されました。 [SDCOMP-22671]
コンパイラ( armcc )
- データフロー解析の診断 [bule]C4017: <entity> may be used before being set[/bule]は全ての最適化レベルにおいてデフォルトで抑制されるようになりました。これは--diag_warning=C4017によって有効にすることができます。 [SDCOMP-23470]
- リテラルプールと分岐テーブルの生成を制御するオプションが追加されました。リテラルプールと分岐テーブルの生成を無効にすることでコンパイラがコードセクションにデータを配置することを、データをデータセクションに配置するか行に定数を統合することによって抑止します。デフォルトでは全てのリテラルプールと分岐テーブルが生成されます。新しいオプションは次の通りです:
- --integer_literal_pools / --no_integer_literal_pools
- --float_literal_pools / --no_float_literal_pools
- --string_literal_pools / --no_string_literal_pools
- --branch_tables / --no_branch_tables
ライブラリ
- ライブラリ関数__rt_sdiv32by16, __rt_udiv32by16 および__rt_sdiv64by32は非推奨となりました。[SDCOMP-22595]
その他の改善
- ARM CompilerはカレントワーキングディレクトリがWindows UNCパスである場合、サブプロセスの呼び出しをサポートします。この変更によって行われるサブプロセスの呼び出しは以下に影響します:
- armcc による armlink または armasm の呼び出し
- armasm による armcc の呼び出し
- armlink による armcc の呼び出し
- ARM Compiler 5.04 では armar, armasm, armcc, armlink および fromelfによって出力されるバージョン文字列に変更があります。次のような形式で3つのパートに分けて表示されます:
- Product: ARM Compiler 5.04
- Component: ARM Compiler 5.04
- Tool: armcc
- Productの文字列はそのツールチェインがコンポーネントである製品を、例えばDS-5やARM Compiler 5.04のように反映します。Componentの文字列は使用されているARM Compilerのバージョンを反映します。Toolは使用されている個別のツールの固有の識別子を表示します。[SDCOMP-23344]
- ARM Compiler 5.04では ARMv7-M のビルド時にexecute-onlyのメモリリージョンをサポートします。この機能の詳細な情報については、ARM Compiler ドキュメンテーションを参照してください。[SDCOMP-23284]
- ARM Compiler 5.04 では以下のサポートを追加しました:
- Windows 8 (64-bit)
- 以下のサポートは非推奨となりました:
- Ubuntu 10.04 LTS (32-bit) platform
- Cygwinサポート(32-bit platforms only)は、Cygwin version 1.7.25に移行しました。[SDCOMP-23283]
- 以下のプラットフォームサポートは将来のARM Compiler 5.05で非推奨となる予定です:
- Windows Server 2003 (32-bit)
- Red Hat Enterprise Linux 5 (32-bit and 64-bit)
v5.04での不具合修正
アセンブラ(armasm)
- ABIで定義されていないセクションフラグを使用するオブジェクトはABI-compliantとマークされなくなりました。[SDCOMP-23039]
- アセンブラは以前Mプロファイルのコアの条件付きMSR命令に対してITブロックを生成しないことがあり、条件なしの命令を不正に生成することがありました。この問題は修正されました。[SDCOMP-22554]
コンパイラ( armcc )
- -O3 -Otime使用時、単純な配列の初期化シーケンスにおいて不正なコード生成を引き起こす可能性のあるmemsetを使用してさらにインライニングを行う方法に置き換えを行うことがありました。この問題は修正されました。[SDCOMP-23465]
- -O3 -Otime使用時ループの展開を行う事がありますが、特定の状況でループ変数の計算を誤り、不正なコード生成を引き起こすことがありました。この問題は修正されました。[SDCOMP-23413]
- --multifileが使用されたとき、二番目以降の入力ファイルがインラインアセンブリ内で数値のラベルを使用しているとクラッシュする可能性がありました。この問題は修正されました。[SDCOMP-23317]
- ローカルで非スタティックなオブジェクトはnewの呼び出しを引き起こすコンストラクタでT obj(new S())のフォーマットで初期化され、スローされる例外のためにオブジェクトのスコープ範囲外に制御が渡り、オブジェクトのデストラクタが呼び出されない可能性がありました。この問題は修正されました。[SDCOMP-23297]
- -O3 -Otime使用時、定数且つ奇数のイテレーションが、二度のループ外にリフトされた単一のイテレーションに展開してしまうことがありました。コンパイラはループ外にリフトされたシーケンス内で、依存性を保持することができなくなり、不正な結果を引き起こすことがありました。この問題は修正されました。[SDCOMP-23265]
- -O3 -Otime使用時、ループカウンタを用いて配列の初期化をするループに続いて、配列を使用するループがある場合に、1つのループにまとめられることがありました。配列の参照に対しての不正な変更となるために新しいループは本来のコードと等価ではなくなります。この問題は修正されました。[SDCOMP-23264]
- --multifile使用時、コンパイラは2番目以降の入力ファイルでNOPを使用するインラインアセンブラがある場合にクラッシュする可能性がありました。この問題は修正されました。[SDCOMP-23263]
- -O0 指定時のみ、64-bit整数のbit 31を判断する条件式においてコンパイルを失敗し、不正な結果を引き起こす可能性がありました。この問題は修正されました。[SDCOMP-23237]
- if-elseブロック内のmemset()呼び出しの後に、ビットフィールドへの書き込み(コンパイラが read-modify-write のシーケンスを生成しなければならないような)が発生する場合、ビットフィールドコンテナに間違った値の書き込みを引き起こす、ビットフィールドのコンテナの読み出しをmemsetの処理の前に移動する可能性がありました。この問題は修正されました。[SDCOMP-23136]
- ABIで定義されていないセクションフラグを使用するオブジェクトは ABI-compliant とマークされなくなりました。[SDCOMP-23039]
- --multifile使用時、コンパイラは2番目以降の入力ファイルで1つ以上のオペランドをもつ命令を使用するインラインアセンブラがある場合にクラッシュする可能性がありました。この問題は修正されました。[SDCOMP-23023]
- -O3 -Otime使用時、2つの個別のループが1つの共用型の配列の処理があり、1番目のループでそこに書き込みを行い、2番目のループがそこから読み出しを行うようなコードをコンパイルする際、2つのループをマージして書き込みの前に読み込みを行うようなコード移動を行う可能性がありました。これによりランタイムに不正な動作を引き起こしていました。この問題は修正されました。 [SDCOMP-23016]
- -O3 -Otime使用時、小さい定数のリミット値の場合ループを展開することができますが、イテレーション変数の全ての使用について検出を失敗する可能性がありました。これにより不正なコード生成が起きる可能性がありました。この問題は修正されました。[SDCOMP-23015]
- -O3 -Otime使用時、ローカルの整数型変数がループ内でポインタを経由してアクセスおよびインクリメントされ、値が加算される時コンパイラが不正なコードを生成することがありました。この問題は修正されました。[SDCOMP-23013]
- -O3 -Otime使用時、if文の条件において使用される(INT_MIN / -INT_MAX) の形式の式で不正な変形が行われる可能性がありました。この問題は修正されました。[SDCOMP-23011]
- -O3 -Otime使用時、if文内の条件を単純化しようとした場合に大きな整数の定数値に関する整数式の計算を間違う可能性がありました。この問題は修正されました。[SDCOMP-23010]
- -O3 -Otime使用時、charまたはshort 型変数を用いたループの最適化において変数をintと誤り、予期しない結果を引き起こすことがありました。この問題は修正されました。[SDCOMP-23009]
- -O3 -Otime使用時、INT_MIN に反するような定数の比較を誤り、不正な結果を引き起こす可能性がありました。この問題は修正されました。[SDCOMP-23007]
- -O3 -Otime使用時、ポインタを経由した読み込みを伴う変数への書き込みを含むループ内の処理において誤った値を読み出す可能性がありました。この問題は修正されました。[SDCOMP-23006]
- -O3 -Otime使用時、配列の要素に対する代入を伴う単純でネストしたループの展開を行う際に、一部の代入を不正に削除する可能性がありました。この問題は修正されました。[SDCOMP-23005]
- -O3 -Otime使用時、初期化において定数の代入を伴う変数に対して条件代入を行うループで不正なコードを生成する可能性がありました。この問題は修正されました。[SDCOMP-23004]
- -O3 -Otime使用時、INT_MINで始まるforループがオーバーフローする可能性のある式によってガードされた条件式内に誤って展開される可能性がありました。この問題は修正されました。[SDCOMP-23003]
- -O1 以上の最適化レベルにおいて、不正なコード生成に結び付く、不正なコード解析法で小さなグローバルの配列に対するmemsetの呼び出しがインライン展開される可能性がありました。この問題は修正されました。[SDCOMP-23002]
- -O3 -Otime使用時、多次元配列がスパースリストによって初期化されている場合、未初期化の要素の値について誤った想定を行う可能性がありました。この問題は修正されました。[SDCOMP-23001]
- -O3 -Otime使用時、本体が空のswitch式についてターミネーションを誤る可能性がありました。この問題は修正されました。[SDCOMP-22995]
- Windows環境下で-O3 -Otimeの使用時、一部の整数式においてINT_MIN に対して誤った値を使用する可能性がありました。これは典型的には整数の限界値を必要とする式において条件実行を単純化したりループの変形を伴う場合に発生します。この問題は修正されました。[SDCOMP-22994]
- -O3 -Otime使用時、ループカウンタ変数へのポインタがループの後に参照先の値を取得する場合、ループの前にカウンタの値を返すようなコードを誤って生成することがありました。この問題は修正されました。[SDCOMP-22993]
- Windows環境下で-O3 -Otimeの使用時、一部のINT_MIN に関連する算術処理が整数のオーバーフローフォルトを伴ってコンパイラを停止させることがありました。この問題は修正されました。[SDCOMP-22992]
- 構造体のアドレスを構造体のメンバに対してストアするようなコードを不正に変形し、メンバのアドレスをストアしてしまうことがありました。この問題は修正されました。[SDCOMP-22884]
- -O3 -Otime使用時、構造体または共用体のフィールド上でのvolatile修飾子を不正に無視することがありました。この問題は全てのアクセスが例えば構造体または共用体を単一のオブジェクトとして読み出すように間接的である場合のみ発生します。この問題は修正されました。[SDCOMP-22879]
- xがint型 でxとyの差が負ではないintの値 の最大のよりも大きい場合にx <= yを不正に解釈することがありました。この問題は修正されました。[SDCOMP-22770]
- ベース型がlong long であるビットフィールドへのアクセスにおいて、値の破壊をおこしたり、間違ったメモリ位置へのアクセスを起こすコードを生成することがありました。この問題は修正されました。[SDCOMP-22760]
- ターゲットの命令セットにおいてLDR命令で使用できる直値の最大を超すようなスタックオフセットを伴う可能性があるlong long またはdouble を関数の引数として渡す場合に、引数の値を誤る可能性がありました。この問題は修正されました。[SDCOMP-22712]
- -O1 以上の最適化レベルにおいて、制限付きポインタ引数を伴う関数がインライン化されると関数にインライン化されたコードが不正である可能性がありました。この問題は修正されました。[SDCOMP-22538]
- 特定の条件でポインタの参照先の値を代入する場合に-O3 -Otimeによってインライン化された関数がinternal fault 0x87ecefを起こすことがありました。この問題は修正されました。[SDCOMP-22511]
- -O3 -Otime --vectorize使用時、ポインタのオーバーラップを経由してchar型のデータをshort型のデータにコピーする際に誤ったベクタライズの方法を選択する事がありました。加えて、ベクタライズを行わないコード内でデクリメントループをインクリメントループに誤って変形することがありました。これら両方の問題は修正されました。[SDCOMP-22486]
- 1つ以上のvolatileメンバを含む構造体に対する代入において非効率なコードを生成することがありました。この問題は修正されました。適切であれば非volatileなメンバに対してはmemcpy を使うようになりました。[SDCOMP-22471]
- 関数属性__attribute__((weakref))がエイリアスされた関数への参照をweakとしてマークしていませんでした。この問題は修正されました。[SDCOMP-22376]
- -O3 指定時に例外を有効にしたC++コードをコンパイルするとinternal fault 0xe35e83 が発生することがありました。このinternal faultの原因は修正されました。[SDCOMP-22337]
- -O3 -Otime使用時、浮動小数点演算を伴うループの最適化においてint型の中間変数を生成させることがありました。この変数は浮動小数点値をストアする際に使用され、値の切り捨てと小数点部が破棄されてfloatからintへの型変換が行われるために、不正な計算を引き起こしていました。この問題は修正されました。[SDCOMP-22321]
- __stack_chk_guard を誤ってデータではなくコードとして定義した場合にerror 3094 を返し、また__stack_chk_fail を誤ってデータではなくコードとして定義した場合にはerror 3095 をそれぞれ返すようになりました。[SDCOMP-22301]
- 初期化あり/初期化なしのファイルスコープ変数が混在するファイルにおいて--no_data_reorder が正しく動作しませんでした。この問題は修正されました。[SDCOMP-19892]
- 1つ以上のvolatileメンバを含むクラスに対する代入において非効率なコードを生成することがありました。この問題は修正されました。適切であれば非volatileなメンバに対してはmemcpy を使うようになりました。[SDCOMP-18315]
- ある条件下で、error 137: expression must be a modifiable lvalue のエラーに対し warning 1441-D: nonstandard cast on lvalueを誤って伴う事がありました。この問題は修正されました。[SDCOMP-11964]
リンカ( armlink )
- ABIで定義されていないセクションフラグを使用するオブジェクトは[navyABI-compliantとマークされなくなりました。[SDCOMP-23039]
- ロード時と実行時でアドレスが同じであり、RWデータ圧縮が適用されたデータを含む実行リージョンはリンカによって圧縮されたRWデータを上書きする前に、圧縮されたRWデータをテンポラリエリアに展開しなければなりません。この目的に対してEMPTYおよびUNINIT属性を持つ実行リージョンではリンカはテンポラリエリアを使用しなくなりました。[SDCOMP-22938]
- 未使用である__thread変数に関連したデバッグ情報の処理時に発生していたinternal fault 0x3d9eed は発生しなくなりました。[SDCOMP-22483]
- --feedback_imageオプションに関連する以下の問題は修正されました:
-
none または noerrors使用時:
- FIXEDリージョンのアドレスが他とオーバーラップするときクラッシュする可能性がありました。
- スキャッタファイルの.ANYセレクタに関連するエラー(L6406E, L6407E)がダウングレードできませんでした。
- スキャッタローディングの失敗の可能性に関連するエラー(L6788E)がダウングレードできませんでした。
- ScatterAssert式に起因するエラー(L6388E)がダウングレードできませんでした。
- ビットバンドリージョンがサポートされず、error L6191E が起きていました。
- __atセクションのアドレスがデフォルトでスキャッタファイル内にすでに存在するアドレスとオーバーラップしているとエラーを起こすことがありました。 [SDCOMP-22246]