リリース履歴
- V7.40 2015-02-19
- V7.30 2014-09-24
- V7.20 2014-05-19
- V7.10 2014-02-21
- V6.70 2013-10-29
- V6.60 2013-06-27
- V6.50 2012-11-10
- V6.40 2012-06-05
- V6.30 2011-10-22
- V6.21 2011-07-05
- V6.20 2011-04-29
- V6.10 2010-11-04
- V5.50 2010-04-21
- V5.41 2009-12-14
- V5.40 2009-07-10
- V5.30 2009-01-23
- V5.20 2008-06-24
- V5.11 2007-12-11
- V5.10 2007-06-12
- V4.41A 2006-12-08
- V4.40A 2006-06-03
- V4.31A 2006-02-03
- V4.30A 2005-06-23
- V4.20A 2005-01-10
- V4.11A 2004-06-10
- V4.10B 2004-03-09
- V4.10A 2004-02-21
- V3.40C 2003-12-12
- V3.40B-P1 2004-10-06
- V3.40A 2003-07-03
- V3.30B 2003-03-18
- V3.30A 2003-02-18
- V3.21A 2002-09-27
- V3.20A 2002-06-18
- V3.11A 2001-12-04
- V3.10A 2001-10-02
- V2.10D 2001-06-27
- V2.10A 2001-02-21
- V1.30C 2000-10-14
- V1.30A/B 2000-09-28
- V1.20A 2000-05-28
- V1.10A 2000-01-14
V7.40 2015-02-19
プログラム修正-
単精度の浮動小数点の値2つを乗算するときにCortex-M0/M0+/M1 (ARMv6-M)で使用されるライブラリ関数で、入力の値によっては、結果の最下位ビットに間違った値が生成されることがあります。
[EW25075] -
擬似命令が複数の命令に拡張される場合(
MOV32
が2つの命令に拡張)、インラインアセンブラがITブロックの擬似命令を正しく処理していませんでした。これが影響するのはTHUMBモードで、IT命令(ARMv6T2、またはそれ以降: ARMv6-M以外)を持つアーキテクチャのみです。
[EW25112] -
C-RUNで、アドレス0に保存されたポインタの境界をトラッキングする際、フラッシュメモリへのライト処理が行われなくなりました。その代わりに、ランタイムエラーが報告されます。この問題は、Cortex-MベクタテーブルがCまたはC++で記述された場合に見られました。つまり、最初のスタックポインタがアドレス0にあり、その境界がトラッキングされる場合です。解決方法として、ポインタ境界のトラッキングをしないベクタテーブルをビルドする方法があります。
[EW25122] -
減少パターンによって、ベクトル化の際にインターナルエラーが発生することがあります。
[EW25144、EW25154] -
stdarg.h
のインクルードは、大文字/小文字を区別します。Stdarg.h
をインクルードしようとすると、コンパイラは不完全なファイルをインクルードします。代わりに、コンパイラはFatal error[Pe1696]: cannot open source file
というメッセージを報告するようになりました。
[EW25156] -
コンパイラがテンプレートクラスPOD型の
const static
メンバ変数の動的初期化を処理する際に、インターナルエラーで終了することがあります。例:
[EW25157]template<class T> struct C { static const int a; }; extern const int k; template<class T> const int C<T>::a = k;
-
レベルとゴールの両方のフラグのある
#pragma optimize
を持つ関数が、正しく最適化されません。
[EW25169] -
仮数部の正規化ループに、仮数部のMSBが設定されているかどうかに関わらず、初期テストがありませんでした。場合によって結果が不完全であったり、ときには正規化によって無限ループが生じたりすることもありました。この問題は、ARMv4命令セットに適用された
fmod()
関数でのみ発生していました。
[EW25170] -
VFPを持たないARMv7-Mコアの例外を使用してC++アプリケーションをリンクし、明示的な
--cpu
オプションを用いる場合、リンカはrt7M_tl.a
の例外エンジンがNo vfpと互換性のないVFP命令を使用しているとして間違ったエラーを報告していました。
[EW25188] -
C++例外とVFPのサポートを有効にしてコンパイルする際、
std::complex<>
型のパラメータを受け入れる関数または関数タイプ、あるいはstd::complex<>
型のオブジェクトを戻す関数または関数タイプが、モジュール内の最初のパブリック変数もしくは関数定義より先に発生する場合、その関数のコードまたはその関数タイプの呼出しが間違って生成されることがあります。
[EW25215] -
テンプレートコード内にある自動記憶寿命変数の集合初期化で、少なくとも1つの集合要素が定数でない場合に、コンパイラがインターナルエラーで終了することがあります。
[EW25228] -
EWARM 7.40.2:
コンパイラが、静的記憶寿命を持つ構造体変数の配列フィールドにアクセスする際、MISRA-C:2004 規則17.4 (配列のインデックス化は配列を持つ場合のみ)に対する違反を誤って報告することがあります。
[EW25240] -
EWARM 7.40.2:
構造体変数の初期化によって最後にフレキシブルな配列メンバに値が供給されると、コンパイラがインターナルエラーで終了することがあります。
[EW25245] -
EWARM 7.40.2:
構造体変数のアドレスを別の型で異なるサイズの構造体変数にキャストし、構造体の割当てを実行すると、最適化レベル「高」でインターナルエラーが発生する可能性があります。
[EW25249、EW25296] -
EWARM 7.40.3:
アーキテクチャプロファイルMでないARMv6またはそれ以降のコアで、空のネストされた割込み関数をコンパイルする際、インターナルエラーが報告されていました。
[EW25229] -
EWARM 7.40.3:
スタックパラメータを受け入れて、異なるサイズのNEONレジスタを多数使用する関数が、ごく稀にスタック変数に対して間違ったオフセット値を持つことがあります。
[EW25336] -
EWARM 7.40.3:
稀なケースとして、複雑な条件コードを持つ関数を自動関数インライン化すると、インターナルエラーを引き起こす可能性があります。
[EW25346] -
EWARM 7.40.3:
##
演算子をコンマと__VA_ARGS__
間で使用し、__VA_ARGS__
がトークンに展開しない場合、コンパイラでワーニングPe1665 (連結で有効なトークンが作成されない)が間違って出力されます。
[EW25348] -
EWARM 7.40.3:
移動先が固定の場合、移動可能なブロック内からそのブロック外への相対的な再配置が使用可能になりました。その効果として、位置に依存しないコード(--ropi
でコンパイル)が位置に依存するコードを呼び出せるようになりました。
[EW25359] -
EWARM 7.40.3:
最適化レベル「高」、「サイズ」を使用する際、最適化while (n--)
ループが誤って最適化されることがあります。最適化されたループは、最終の繰返しで実行されません。
[EW25383] -
EWARM 7.40.3:
最適化された静的関数が#pragma
callsディレクティブで使用された場合、コンパイラがインターナルエラーで終了することがあります。
[EW25387] -
EWARM 7.40.3:
ゼロ初期化データのサイズが4の倍数でない場合、ゼロ初期化によって次のブロックの先頭が上書きされなくなりました。
[EW25395] -
EWARM 7.40.3:
VLDR
命令とVSTR
命令が、後で浮動小数点値に変換される整数のアラインメントされていないアクセスに使用されなくなりました。
[EW25407] -
EWARM 7.40.3:
最適化レベル「中」を使用する場合、ポインタ間接を含む共通部分式のシーケンスを最適化すると、シーケンスが並行したコントロールの流れの中で発生するときに、間違って最適化されることがあります。
[EW25415] -
EWARM 7.40.3:
小さい自動配列のアドレスをポインタ型にキャストして、その配列全体に別のタイプのオブジェクトを割り当てる場合、インターナルエラーが発生することがあります。
[EW25442] -
EWARM 7.40.5:
最適化レベル「高」で、不変の浮動小数点値を追加すると、--relaxed_fp
を有効にしていなくてもループ外にホイストされることがあります。これによって、値の丸め方に影響することがあります。
[EW25450] -
EWARM 7.40.5:
命令スケジューリングによって、命令が誤って移動することがあります。たとえば、WFI
やWFE
など、ストア命令が副作用のある命令を含むITブロックの後に来る場合です。本来であれば、こうした移動は禁じられています。この場合の効果として、コアが動作状態に戻る前ではなく、戻るまでストア命令が実行されないことになります。
[EW25466] -
EWARM 7.40.5:
組込み関数__get_LR
、__set_LR
、__get_SP
、__set_SP
の宣言が、ヘッダファイルintrinsics.h
にありません。
[EW25471] -
EWARM 7.40.5:
::
演算子がクラスや名前空間ではない何かの後に使用されるソースコードによって、コンパイラが問題の診断後にインターナルエラーで終了することがあります。
[EW25478] -
EWARM 7.40.5:
関数ローカルの静的記憶寿命変数がフレキシブルな配列メンバを拡張する場合、コンパイラがインターナルエラーで終了する可能性があります。
[EW25483] -
EWARM 7.40.5:
ポインタ経由の呼出しをコンパイラが間違ってメンバ関数にコンパイルし、メンバ関数がコピーのコンストラクタを呼び出してオブジェクトを返すことがあります。
[EW25501] -
EWARM 7.40.5:
#pragma default_function_attributes
および#pragma default_variable_attributes
の設定が、--mfc
(複数ファイルのコンパイル)を使用する際に各コンパイルユニットの開始部分でリセットされません。
[EW25508] -
EWARM 7.40.5:
任意のシステムヘッダファイルを使用したコードのプリプロセッサ出力に、内蔵タイプ_VA_LIST
への参照が含まれ、出力がその後の処理で役に立たなくなります。
[EW25553] -
EWARM 7.40.5:
#pragma weak
が使用され、複数のソースファイルが一緒にコンパイル(--mfc
)されると、コンパイラがPe1152
エラーで失敗する可能性があります。
[EW25556] -
EWARM 7.40.5:
同じループ内に複数のアキュムレータを持つループが、間違ってベクトル化されることがあります。.
[EW25574] -
EWARM 7.40.5:
VFP用にコンパイルする際、3つ以上の浮動小数点値を持つ2つの重複する同一の構造体間の割当てが失敗することがあります。
[EW25576] -
EWARM 7.40.5:
--no_unaligned_access
がthumb2コードとともに使用されると、パックされたshortおよびunsigned shortの読取り処理で間違った結果が出ることがあります。
[EW25578] -
EWARM 7.40.5:
C-RUN:オーバフローのチェックを伴う64ビットの符号付き乗算が、正の結果X
となっていました。この場合の正しい結果は-X
です。
[EW25587] -
EWARM 7.40.5:
オプティマイザが、const __weak
シンボルのイニシャライザからの値を誤って使用することがあります。
[EW25617] -
EWARM 7.40.5:
関数ポインタの整数へのキャストが、正しく処理されるようになりました。
[EW25620] -
EWARM 7.40.5:
スタックから、またはスタックへのコピーを実行するループが認識され、__aeabi_memcpy
(または__aeabi_memcpy4
)への呼出しとして書き換えられ場合があります。両方が同時にスコープ内にある場合でも同じスタック一に別のスタック変数が割り当てられます。
[EW25663] -
EWARM 7.40.5:
外部にホイストする最適化が、メモリ依存の順序で実行されます。この結果、環境のわずかな変化に応じて異なるコードが生成されます。
[EW25672] -
EWARM 7.40.5:
ヒープのリークチェックを実行し、何らかのRAMの内容が連続して配置されていなければ(一部のRAMの内容が0x20000000
、別の内容が0x40000000
にある場合など)、リークチェッカーが間違って領域間のメモリにアクセスする可能性があります。これによって、アクセス違反および/または間違った診断となる恐れがあります。
[EW25683] -
EWARM 7.40.7:
ごく稀に、生成されたコードに役に立たない命令が混ざり、予期しない結果となることがあります。これは修正されました。
[EW25702]
- なし
V7.30 2014-09-24
プログラム修正-
シンボルが使用されているかどうかをチェックする特殊なアルゴリズムによって、コンパイラから予期しないワーニングメッセージが表示されることがあります。
[EW23132] -
集合イニシャライザの配列名で何らかの括弧が省略されている場合、コンパイラで配列が未使用であるというワーニングが表示されることがあります。
[EW23448] -
コンパイラでMISRA-C:2004の規則5.4をチェックすると表示されますが、実際にはチェックされません。
[EW24679] -
クラスタリングがオンでリテラルがコード内に定数として配置された場合、配列サイズが不明な変数について、コンパイラで括弧内の文字列リテラルイニシャライザのサイズが間違った値になります。
[EW24888] -
memcpy
、memset
、またはmemclr
への呼出しに置換できるループが、最適化「高」、サイズでループのテストにインクリメント前後の演算が含まれる場合に、誤って最適化されることがあります。
[EW24928] -
MISRA-C:2004の規則9.2によって、複雑な型のイニシャライザ
{0}
が誤ってトリガされます。
[EW24938] -
コンパイラで、インラインアセンブラ命令内のレジスタ名を変更しようとしなくなりました。
[EW24942] -
EWARM 7.30.3:
ARMv7-Mの命令スケジューリングで、IT
ブロックの最後の命令が分岐命令の場合にインターナルエラーが発生し、分岐ターゲットに対する他のコントロールフローがありません。
[EW24982] -
EWARM 7.30.3:
MISRA-C:2004の規則14.2で、assert()
マクロのメッセージが表示されます。
[EW24992] -
EWARM 7.30.3:
配列アドレスが既知の低数値である配列式により、ベクトル化が有効な場合にインターナルエラーが発生することがあります。
[EW25012] -
EWARM 7.30.3:
個々のビットフィールドがvolatile
(構造体/共用体全体がvolatile
として宣言されている場合ではなく)として宣言されている場合、ビットフィールドへのアクセスをコンパイラが保持できません。
[EW25020] -
EWARM 7.30.3:
EC++/C++の匿名共用体のメンバについて指定されたイニシャライザが拡張言語モードで使用される場合、何らかの括弧が省略されると、コンパイラが間違ってError[Pe2358]: a designator for an anonymous union member can only appear within braces corresponding to that anonymous union
を表示することがあります。
[EW25025] -
EWARM 7.30.3:
char
配列メンバがコンストラクタの文字列リテラルにより初期化されると、コンパイラがインターナルエラーで終了することがあります。
[EW25046] -
EWARM 7.30.4:
最適化レベル「高」で、次の場合にループが間違って最適化されることがあります。
1) 変数(V)に関数呼出しの結果が割り当てられている、
2) 関数呼出しがインライン化されている、
3) Vがブレークによりループを終了する条件付きコード内で使用されている。
[EW25027] -
EWARM 7.30.4:
ベクトル化されたコードで、未知のシフトカウントを持つ右シフトの切捨てが正しく処理されません。
[EW25061] -
EWARM 7.30.4:
ベクトル化が有効な場合に、ポインタタイプへの整数変数キャストが配列アクセスのベースアドレスとして使用されていると、インターナルエラーが発生することがあります。
[EW25067] -
EWARM 7.30.4:
複数ファイルのコンパイルモードでコンパイルする際、2つ以上のソースファイルに含まれるヘッダファイル内のtypedef
に対して、MISRA-C:2004規定5.3のメッセージが間違って表示されます。
[EW25081] -
EWARM 7.30.4:
static
で初期化された変数が、モジュールで参照されない指定のセクション(#pragma location
または@
演算子を使用)に配置されていると、コンパイラでインターナルエラーが発生することがあります。
[EW25096] -
EWARM 7.30.4:
ベクタの最小値または最大値を算出する際、ベクトル化が有効になっていると、サイズが異なるタイプの特定のパターンによってインターナルエラーが発生することがあります。
[EW25102] -
EWARM 7.30.4:
ベクトル化が有効な場合、可変シフトカウントを持つシフトを含むループによってインターナルエラーが発生することがあります。
[EW25104] -
EWARM 7.30.4:
最適化レベル「高」で、ループ変数が関数で割り当てられていない場合、ループ条件のループ変数が事後インクリメントまたは事後デクリメントするループが間違って最適化されることがあります。
[EW25124]
- なし
V7.20 2014-05-19
プログラム修正-
#pragma pack
ディレクティブでアラインメントを16より高く設定すると、コンパイラでインターナルエラーが発生する可能性があります。
[EW24509] -
time.h
のstrftime
ライブラリ関数がAEABIモードで使用できません。また、AEABIモードではtime.h
をC++ソースモジュールにインクルードすることができません。
[EW24666] -
EWARM 7.20.2:
ステップ式で整数のオーバフローに依存するループが、間違って最適化されることがありました。
[EW24248、EW24256] -
EWARM 7.20.2:
ブール関数が、関数呼出しの直後の式でその結果が使用され、その式にポインタを介した間接的なアクセスが含まれる場合に、間違って最適化されることがありました。
[EW24710] -
EWARM 7.20.2:
空のステップ式を持つwhile
ループとfor
ループが、ループの最後の文が別のループである場合に、間違って初期化されることがあります。
[EW24742] -
EWARM 7.20.2:
EC++/C++で、stdarg.h
(またはcstdarg
)がその他の標準ヘッダより前にインクルードされていた場合、(std::)va_list
が定義されていませんでした。
[EW24746] -
EWARM 7.20.2:
ごく稀な場合に、条件付きコードにおけるポインタを介したグローバル変数または間接割り当てへの割り当てが、間違って最適化されることがあります。
[EW24748] -
EWARM 7.20.5:
符号なし整数のオーバフローに対するランタイムチェックにより、デクリメント前後に間違った正の値が生じることがあります。これは、負の値を持った追加としての中間の表現が原因で、符号なし算術においてはほとんどの場合にオーバフローとなります。
[EW24763、EW24851、EW24916] -
EWARM 7.20.5:
文字列リテラルに構文エラーがある場合、コンパイルが終了しなかったり、インターナルエラーで終了することがあります。
[EW24806] -
EWARM 7.20.5:
共通部分式最適化の結果、挿入された境界チェックコードにより間違ってコンパイラでインターナルエラーが生成されることがあります。
[EW24849、EW24853、EW24913] -
EWARM 7.20.5:
ワーニングメッセージが修正され、to complex
からtoo complex
に変更されました。
[EW24869] -
EWARM 7.20.5:
自動集合が定数以外の値のみによって部分的に初期化される場合、コンパイラが集合の残りの部分をゼロ初期化するコードを出力できません。
[EW24920] -
EWARM 7.20.5:
最適化レベル「中」で、条件内の関数呼出し周辺でコードが間違って最適化されることがあります。条件の後に両方のパスにおいて発生する非間接的なロードが、呼出しより先に誤って実行されることがあります。
ビットフィールドの代入について、同じビットフィールドコンテナの他のビットフィールドが呼出し以前の値にリセットされることがあります。
[EW24922]
- なし
V7.10 2014-02-21
プログラム修正-
エラーメッセージ
Pa053
とPa054
でELFの用語を使用するようになりました。
[EW24093] -
構造体が
__packed
で定義されていない場合、__packed
により宣言された構造体を参照すると、コンパイラはエラーを表示します。以前に__packed
を使用した宣言がある場合、__packed
なしに構造体を定義すると、ワーニングが表示されます。__packed struct X {...} * x;
は、__packed
をstruct X
とx
の両方に追加するべきではありません。
このプログラムの修正は、EWARM 6.70.2におけるEW24270の暫定的な解決方法についての通知(「IARにより拡張された、Cにおけるフィールド宣言の型より前の型属性は、誤ってフィールドではなく型に適用されています」)に優先します。
[EW24270] -
(
#pragma location
または@
を使用して)グローバルレジスタ内に配置された変数v
のincの前後(++v
またはv++
)によって、インターナルエラーが発生していました。
[EW24381] -
Thumb-1モードで乗算のコードを生成すると、インターナルエラーが発生することがありました。
[EW24385] -
関数を含むエラーを報告する際、コンパイラがインターナルエラーにより終了する場合がありました。
[EW24387] -
DLIBライブラリの
fileno
が、正規のファイルにエラーのステータスを返されていました。
[EW24393] -
c99を使用する際、MISRA-C規則14.10が正しくチェックされていませんでした。
[EW24402] -
パラメータがスタック上で渡されて後でその位置で更新された場合、古い値の上位部分と新しい値の下位部分が、32ビットより小さいパラメータ変数からロードされることがありました。
[EW24429] -
小さいアラインメントされていないコピーで
--no_unaligned_access
を使用してビルドする際、コピーするデータによっては、ARMv7-Mでループカウンタがmemcpy()
で誤ってラップされることがありました。
[EW24432] -
構造体の変数からそれ自身への割当ては、その変数のアドレスの直後にあるメモリへの書込みにつながる可能性があります。
[EW24458] -
最適化レベルが「中」または「高」の場合、拡張されたビットがビット単位の論理演算の後に保持されることが分かっている場合、ゼロ拡張がループ外にホイストされる可能性があります。また、拡張されたビットが保持されないことが分かっている場合の符号拡張演算についても最適化が実行されます。
[EW24459] -
ごく稀に、静的クラスタに関連して間違ったコードが生成される場合があります。
[EW24464] -
EWARM 7.10.3:
ARMモード、およびThumb-2 ISAを備えたデバイスにおけるThumbモードで、自動エリアのサイズがかなり大きい場合に、自動エリアのバックトレース調整が行われないか、または不具合となることがあります。こうなった場合、C-SPYはたとえば[ローカル]ウィンドウなど、自動エリアに配置された変数について不正なアドレスを表示します。
[EW24499] -
EWARM 7.10.3:
#pragma default_variable_attributes
が、constまたはvolatile型の変数に対して効果がありません。
[EW24525] -
EWARM 7.10.3:
MISRA-C:2004の規則14.10によって、構造体if (x) f1(); else { if (y) f2(); }
で間違ってエラーが発生します。
[EW24533] -
EWARM 7.10.3:
ネストされたif文を使用する場合、コンパイラが間違って、存在しないMISRA-C 2004の規則14.10違反(if...else if
の後にある最後のelse
)を報告することがあります。
[EW24545] -
EWARM 7.10.3:
場合によっては、x & ~(y << k)
に一致するフォーム~x & (y << k)
上の式について、コンパイラがコードを生成していました。これは、LSL
命令がBIC
命令内でシフトオペランドに置換され、BIC
命令のオペランドが可換の演算でない場合でも置換される場合に発生していました。
[EW24548] -
EWARM 7.10.3:
Thumb-2用にコードを生成する際、あるオペランドが否定され、そのオペランドの値がゼロの場合に、符号なしのcompare less/greater-than (またはequal)についてテストで問題が生じることがあります。
[EW24561]
- なし
V6.70 2013-10-29
プログラム修正-
最適化レベルが「中」および「高」の場合、ポインタ変数
p
に配列エレメントのアドレスが割り当てられ、インデックス式が他の配列式または間接的なロードで、インデックス式の値がp
の割当てとp
の使用で変わる場合、p
が間違って最適化されることがありました。
[EW24173] -
EWARM 6.70.2:
Thumb1用にコードを生成する際、明示的またはコンパイラの最適化を通じてSPからマイナスのオフセットを取得するスタックアクセスによって、インターナルエラーが発生しました。
[EW24231] -
EWARM 6.70.2:
2つ以上の式を含むループで、ループ変数+/-
a定数オフセットにループ不変式が乗算される場合、定数オフセットが式によって異なるとループが間違って最適化される可能性がありました。
[EW24238] -
EWARM 6.70.2:
ループ不変の切り詰めによる型変換が、変換前の値を使用する前のアドレスに間違ってホイストされる可能性がありました。
[EW24243] -
EWARM 6.70.2:
Thumb2でVFP用にコードを生成する際、プログラムに2つの浮動小数点値の小さい方を選択するコードシーケンスが含まれていると、コンパイラがインターナルエラーを起す可能性がありました。
[EW24246] -
EWARM 6.70.2:
ループ本体または条件付きブロックの最後にローカルのshort変数の部分的更新を設定すると、コンパイラがクラッシュすることがありました。
[EW24247] -
EWARM 6.70.2:
値を作成するマスクが見つかった場合に、符号つきまたはゼロ拡張された処理が過剰に最適化される可能性があり、その前の拡張が効果を持たなくなります。マスクが拡張処理に依存する場合にも、こういうことが起こる可能性があり、その場合は拡張を削除すると間違った値が生成されます。
[EW24255] -
EWARM 6.70.2:
CSmithで、コンパイラが間違ったコードを生成する問題が見つかりました。- パックされた構造体で、ビットフィールドの直前にパディングがある場合、そのコンテナの一部のみが使用されます。
- 構造体の変数に対するイニシャライザ。
- コンパイラがイニシャライザから値を減らすことがあります。
上記すべてが発生すると、コンパイラはビットフィールドの間違った値を伝播します。
[EW24258] -
EWARM 6.70.2:
高度な最適化の場合、関数内でg
が他に使用されることがない場合、マスキングの代入(&&
や||
条件内で使用されるg &= 1
など)が誤って最適化されることがあります。
[EW24278] -
EWARM 6.70.2:
符号なしのループ変数を持つループで、負の値で初期化されるものが、間違って最適化されることがあります。
[EW24280] -
EWARM 6.70.2:
完全なマクロ呼出しが同じ行で前に存在する場合、診断列の位置が間違っていることがあります。
[EW24308] -
EWARM 6.70.2:
厳密でないC89/(E)EC++/C++モードにおいて、LONG_MAX
よりも大きくULONG_MAX+1
よりも小さい、サフィックスを持たない整数リテラルに、long long
ではなくunsigned long
型が誤って割り当てられます。特に、プレフィックス-
演算子を持つ式で使用される場合、結果は予想通り、負のlong long
値ではなく正のunsigned long
値となります。例:-2388135082は1906832214となります。
[EW24323] -
EWARM 6.70.2:
複数または仮想の継承が関係する場合、一部の仮想関数呼出しについて、コンパイラがスタック使用分析の情報を生成しません。
[EW24329] -
EWARM 6.70.2:
データメンバへのC++ポインタを使用するコードについて、lower_il.c
、行13418におけるアサートが間違ってトリガされることがあります。
[EW24331] -
EWARM 6.70.2:
MISRA-C規則5.1 (31の重要な文字)の違反診断メッセージが、IARシステムズのランタイムルーチン__iar_unaligned___aeabi_memmove4
と__iar_unaligned___aeabi_memmove8
を利用するプログラムに対して、間違って出力されます。
[EW24337]
- なし
V6.60 2013-06-27
プログラム修正-
整数タイプへキャスティングされて、スイッチ表現式に使用されるポインタパラメータが、関数インライン化中に内部エラーを起こさなくなりました。
[EW23758,EW23941] -
割り込み関数へC++例外のフローがある場合でも、VFPサポートによるC++のコンパイルを実行しているときにインターナルエラーは発生しなくなりました。
[EW23804] -
MISRA-C:2004の規則5.4が正常にサポートされるようになりました。
[EW23907] -
Thumb2でコンパイルする際の一部のケースでは、シフトカウントが一定でない場合、右シフトを実行する前に、コンパイラは必要に応じて16ビット値を符号拡張またはゼロ拡張しませんでした。これは修正されました。
[EW23961] -
コンパイラは、明示的な
C
キャストにおいて基底にあるMISRA-C:2004タイプを変更しません。これにより、根底型に対してチェックを実施するルールで、MISRA-C:2004エラーが誤って生成されることがあります。
[EW23988] -
EWARM 6.60.2:
高度な最適化レベルでThumb2向けにコンパイルされるleaf関数において、関数内のその他の文が比較的シンプルである場合、一部のケースでゼロと乗算の比較によって、比較に対する欠陥コードが生成されることがありました。
[EW24014] -
EWARM 6.60.2:
memcpy
を使用してint
より短い型の自動変数の内容を変更すると、コンパイラでインターナルエラーが発生することがあります。この問題を引き起こす例:
[EW24037]void f (int *x) { short a; memcpy (&a, 0, 0); if (a == 1 || a == 2) *x = 0; }
-
EWARM 6.60.2:
同じファイルをコンパイルした2つの結果が、同じにならないことがごく稀にあります。
[EW24044] -
EWARM 6.60.2:
パック構造へのポインタなど、アラインメントされていないソースから16ビットの値を読み込む場合、それを反対の符号にキャストしてから32ビットの値にキャストすると、無効なコードが生成されることがあります。
[EW24066] -
EWARM 6.60.2:
assert()
がメッセージを生成するようになりました。6.60.2から動作が変更されました。詳しくはARM用IAR C-SPYデバッガのリリースノートを参照してください。
[EW24102] -
EWARM 6.60.2:
#pragma
呼出しで非静的なメンバ関数を指定すると、エラーPe028 (式には定数値が必要)が発生します。
[EW24137] -
EWARM 6.60.2:
テンプレート名をマングル化する際、テンプレートの型引数で__packed
のようなIARシステムズの型修飾子が考慮されず、コンパイラでインターナルエラーまたはリンクする際にエラーが発生するか、不正なコードが警告なしに使用されます。例:テンプレート
同じテンプレートがテンプレート型引数の型修飾子のみに違いがある形でインスタンス化された場合、このバグは問題となります。メモリ修飾子は正しく考慮されます。template<typename T> struct X;
のX<int>
およびX<int __packed>
の両方が同じマングル化された名前となります。
[EW24140] -
EWARM 6.60.2:
符号付き右シフトのマスクされた結果の左シフト(ビット単位AND)が、右シフトなしで表現されることがあります。最適化が正しい場合でも、OSにより割り当てられたアドレス間の順序によっては実行されないこともあります。
[EW24143]
高度なヒープの更新
高度なヒープの利用可能な機能はarm\inc\c\iar_dlmalloc.h
に記載されています。高度なヒープの静的機能は、このヘッダファイルを通して使用できます。
V6.50 2012-11-10
プログラム修正-
ライセンスのタイムシステムで、うるう日の計算が間違っていました。これは修正されました。
[EW23273] -
ごく稀にコンパイラが無限ループの状態になることがありました。これは修正されました。
[EW23308, EW23573] -
--macro_positions_in_diagnostics
の使用時に、コンパイラがインターナルエラーで終了しなくなりました。
[EW23337] -
VARARGSのコンストラクタについて間違ったコードが生成される場合がありました。これは修正されました。
[EW23358] -
コンパイラで、リターン値のない割込み関数についても役に立つスタックバックトレースが生成されるようになりました。
[EW23363] -
__section_size()
(およびそのエイリアス__segment_size()
)演算子の根底型は間違っていました。これはたとえば、その演算子が使用されるときに、MISRA-C:2004の規則10.1のエラーになることがありました。これは修正されました。
[EW23390] -
割込み関数(
__irq
または__fiq
)の関数の開始/終了地点で、VFPレジスタD16
~D31
が格納/リストアされるようになりました(使用可能な場合)。
[EW23418] -
コンパイラで、無限ループで終わる関数内のスタック上に配置された変数について、正しいデバッグ情報が生成されるようになりました。
[EW23422, EW23439] -
あるポインタからより小さい整数へキャストする際、エラー
Pa128
(定数式におけるキャストの切り詰め)が非表示またはワーニングに切り替えらると、コンパイラがインターナルエラーで終了していました。これは修正されました。
[EW23444] -
揮発性の自動構造体へのアクセスが、間違って最適化されることがありました。これは修正されました。
[EW23458] -
配列インデックス式における左シフト、右シフト、2乗の乗算、2乗の除算が、誤って最適化されることがありました。これは修正されました。
[EW23526] -
初期化されたグローバルまたは静的
const
ポインタからの間接的な式が、誤って最適化されることがありました。これは修正されました。
[EW23543] -
配列インデックス式がループ(L)で使用され、Lで不変である値が変数(V)に割り当てられ、Vがインデックス式で複数回発生する場合、配列インデックス式が誤って最適化されることがありました。
[EW23571] -
EWARM 6.50.2:
まれなケースとして、例えば、関数呼出しや間接アクセスとして、内部ループが潜在的なエイリアスを含んでいて、内部ループと外部ループの両方で変数が修正された場合、ネストされたループの静的変数あるいはグローバル変数は誤って最適化されることがありました。これは修正されました。
[EW23566] -
EWARM 6.50.2:
パターンでポインタの演算にポインタに対するポインタが使用された場合でも、インターナルエラーが発生しなくなりました。
[EW23579] -
EWARM 6.50.2:
配列のアドレスがエレメントタイプよりも大きなデータ型へのポインタにキャストされ、いくつかの配列エレメントが同時にアクセスされる場合でも、インターナルエラーは発生しなくなりました。
[EW23581] -
EWARM 6.50.2:
Cortex-M4Fにおいて、標準ライブラリコールlongjmp
は、VFPレジスタを正常に復旧するようになりました。
[EW23583] -
EWARM 6.50.2:
__iar_Mutex
は、通常のライブラリでロックを割り当てることはなくなりました。
[EW23584] -
EWARM 6.50.2:
void
への自動変数キャストのアドレスによって、インターナルエラーがトリガされることはなくなりました。
[EW23602] -
EWARM 6.50.2:
右シフト(演算と論理)でZeroExt
プロパティが負になることはなくなりました。
[EW23613] -
EWARM 6.50.2:
data_init.c
ファイル (data_init3.c
の代わり) およびrle_init.c
ファイル (rle_init3.c
の代わり)はIAR Embedded Workbenchインストールから消失しなくなりました。
[EW23616] -
EWARM 6.50.3:
ループ変数の初期化での部分割り当てはインターナルエラーを引き起こすことがあります。これは修正されました。
[EW23634] -
EWARM 6.50.3:
ARMモードにおいて、0とのシフト値の符号比較、例えば(x >> 16) < 0
は、インターナルエラーを引き起こすことがありました。これは修正されました。
[EW23665] -
EWARM 6.50.3:
メディア命令SMMUL
は、符号なし(ゼロ拡張)オペランドにおいて誤って生成されました。これは修正されました。
[EW23682] -
EWARM 6.50.3:
ヘッダファイルinit_streams.h
は、製品に同梱されて出荷されるライブラリソースコードに含められるようになりました。
[EW23709] -
EWARM 6.50.3:
MISRA-C:2004 規則12.7は根底型を使用して、規則が破られていないかどうかを決定できるようになりました。
[EW23717] -
EWARM 6.50.4:
右辺の式が定数によってマスクされて、唯一の用途はテストで値をゼロと比較することであり、場合によってはその値が割り当てと同じ定数またはより少ないビットセットを持つ定数によってマスクされた場合、間接割り当てが誤って最適化されることがありました。以下に例を示します。p->foo = x & 0x02;
...
if (p->foo & 0x02)
これは修正されました。
[EW23796] -
EWARM 6.50.4:
アドレス式がループ依存変数とループ不変変数の両方で構成される間接割り当てを含むループは、ループの後に同じアドレス式への割り当てが続く場合、誤って最適化されることがあります。これは修正されました。
[EW23815] -
EWARM 6.50.6:
高度な最適化レベル(-Oh
,-Ohs
、または-Ohz
)を有するThumb2でコンパイルする際、switch
式の値を評価後、追加使用した場合、まれなケースながらこれらの使用で別の値が生成されることがあります。
[EW23873] -
EWARM 6.50.6:
配列を初期化するために文字列リテラルを使用し、文字列リテラルに含まれるバイトが少なすぎる場合、コンパイラは配列の最後のバイトを正しく初期化しませんでした。失われたバイトは文字列リテラルの後から読み取られました。これは修正されました。
[EW23891]
- なし
V6.40 2012-06-05
プログラム修正-
16ビットと8ビットの整数変数をビットフィールドとして使用しても、インターナルエラーが発生しなくなりました。
[EW22858] -
複数のシフトを含む符号付きの式をコンパイルする際に、ごくまれにコンパイラがループする可能性がありました。これはもう発生しなくなりました。
[EW22896] -
複数ファイルのコンパイル、
--mfc
とインラインアセンブラの文を使用するファイルを併用すると、インターナルエラーになることがありました。
[EW22905] -
ごくまれに関数のスタックフレームが、デバッグ情報が間違っているような形で(たとえば、4つずれているなど)最適化されることがありました。これはデバッガにおいて、スタック変数が予期される値をおそらく保持しない場所にあるかもしれないということです。これはもう発生しなくなりました。
[EW22907] -
仮想関数のメンバ関数定数へのポインタを含むモジュールが、コンパイラで所有クラスのtypeinfoオブジェクトに対して、インターナルエラー
symbol_lookup_M31
となることがありました。
[EW22918] -
揮発性のロードが、遠くにシフトされてロードのビットがまったく使用されないような式の一部である場合に、間違って削除されることがありました。
[EW22974] -
コンストラクタの呼び出し直後に続く
asm
文によって、インターナルエラーが発生していました。
[EW22982] -
正しくないビットフィールドの処理のために、共通部分式除去(CSE)が誤って解除されていました。これは修正されました。
[EW22988] -
__weak
関数定義で#pragma call_graph_root
を使用する際の問題が修正されました。Thumbモードでは、結果がコンパイラのインターナルエラーとなっていました。Armモードでは、場合によってリンカが、これらの関数の関数シンボルではなく、セクションシンボル(.text_17
など)を使用していました。
[EW22996] -
モジュール内にある関数のローカルラベルを含む
asm
文で、関数が2度インライン化されている場合に、インターナルエラーが発生していました。これは修正されました。
[EW23006] -
コンパイラが、
IT
ブロック内でIT
命令を生成しなくなりました。これはインターナルエラーの原因となっていました。
[EW23020、EW23083] -
C99複合リテラルのアドレスを使用して集合内のポインタを初期化すると、コンパイラでインターナルエラーが発生していました。
[EW23021] -
ごくまれに特定のアクセスが間違って最適化されることがありました。
[EW23028] -
コンパイラに、スタックにより割り当てられたローカル変数の表示がC-SPY以外のデバッガで不正確になるというバグがありました。
[EW23042, EW23047] -
静的イニシャライザで
unsigned long
からunsigned int
へのキャストを行っても、エラーが発生しなくなりました。
[EW23054] -
コンパイラ、リンカ、elftoolsが、オプションを指定しないで実行するとエラーステータスを返していました。これは修正されました。
[EW23057] -
クロスコールの最適化が、ラベルから始まって、シーケンス内でそのラベルへの後方へのジャンプが1度あり、シーケンスの後にそこへの後方ジャンプが1度あるシーケンスを初期できませんでした。これは修正されました。
[EW23063] -
揮発性の引数を持つインラインアセンブラの式が、レジスタの割当てに失敗することがありました。
[EW23086] -
場合によっては、共通部分式を、その式の実行を制御する条件全体にホイストすることができました。
[EW23087] -
符号付きと符号なしの型が混在するインデックス式によって、まれにインターナルエラーが発生することがありました。
[EW23088] -
コンパイラで、
__weak
関数定義が誤ってインライン化されることがありました。
[EW23112] -
デバッグされたアプリケーションにcやdという名前のCシンボルが含まれていても、C-SPYでエラーが発生しなくなりました。
[EW23131] -
低い最適化レベルを使用する際、時間のインタフェースに64ビットの実装を使用すると機能しませんでした。これは修正されました。
[EW23162] -
コード
(void (**)(void)) 1
にMISRA-C:2004の規則17.5の違反がないかチェックする際、コンパイラがインターナルエラーを発行していました。これは修正されました。
[EW23164] -
コードを持たないアプリケーションをリンクするときや、Cortex-Mデバイスで、リンカが正しいライブラリを選��するようになりました。
[EW23204] -
Thumb2で、最適化レベルが[中]の場合、フォーム
(x >> K) & M
の式によって、消去されたビットが多すぎるコード(定数K > 0
およびM = (1 << N) - 1
定数N > 0
)が作成されていました。
[EW23214] -
ポインタと配列のエンディアン属性がコンパイラでサポートされるようになり、この問題はなくなりました。
[EW23220] -
静的変数が静的配列でインデックス式を使用するとインターナルエラーが引き起こされる可能性があるという、異常な問題を修正しました。
[EW23229] -
EWARM 6.40.2:
LDRD
命令を使用して、4バイト未満のアラインメントを持つ8バイトのstruct
をコピーできましたが、これはアプリケーションの実行時に例外(ハード障害)となることがありました。これはもう発生しなくなりました。
[EW23272] -
EWARM 6.40.2:
Thumb2でコンパイルする際、スタック上の単一バイトの配列をゼロに初期化することで、2バイトのメモリをクリアするコードが生成されなくなりました。
[EW23298] -
EWARM 6.40.3:
8ビットの変数と8ビットより広い定数の間にあるビット単位AND (&
)によって、インターナルエラーが発生しなくなりました。
[EW23295, EW23362, EW23365] -
EWARM 6.40.3:
まれに、同じ変数の複数のテストが誤って最適化されることがありました。これは修正されました。
[EW23360] -
EWARM 6.40.3:
最適化レベル「中」(または「高」)で、__PLD
や__PLI
組込み関数に渡されたアドレスの更新が、最適化され続けることがありました。これは修正されました。
[EW23387] -
EWARM 6.40.4:
複数の終了テスト(&&
or||
含むテストは複数のテストとみなされます)を持つループが、あるテストが1つのループカウンタでテストされ、別のテストがポインタから間接的にロードされた値をテストし、そのポインタがループにしたがって繰り返されるたびにインクリメント/ディクリメントされる場合、誤って最適化されることがありました。
[EW23318]
インラインアセンブラ
新しいオペランドの制約と修飾子。CMSISの更新
CMSISバージョン3.01が製品に含まれるようになりました。
V6.30 2011-10-22
プログラム修正-
MISRA-C 2004を選択したときに、診断メッセージに正しい規則番号が記載されるようになりました。
[EW22347] -
定数式の根底型が他の式と同じように評価されるようになりました。これは、MISRA-C:2004 6.10.4の特定の定数式に関する規則から逸脱します。IARシステムズとMISRA-C委員会はどちらも、この規則に意図が反映されていないと考えています。
[EW22373] -
クラスコンストラクタに文字列リテラルがあるメンバ
char
配列を初期化しても、インターナルエラーが発生しなくなりました。
[EW22503] -
Cortex-M0でコンパイルする際に、
__REV16
組込み関数が使用できるようになりました。
[EW22715] -
符号のない式の補数
~
が、式に右シフトや定数を持つビット単位が含まれる場合に、誤って最適化されなくなりました。
[EW22725] -
ファイルスコープや名前空間スコープの変数を初期化するときに、C++ 一時オブジェクトが、正しく作成されるようになりました。
[EW22751] -
テストの直前にシフトされた式の「未満」、「以下」、「より大きい」、「以上」の符号付きテストで、正しい結果が出るようになりました。
[EW22752] -
EWARM 6.30.3:
テンプレート関数が関係する状況で__packed
属性を使用しても、インターナルエラーが発生しなくなりました。
[EW22776] -
EWARM 6.30.3:
最適化レベル「高」で、複雑な配列インデックス式にsignedとunsignedの値が混在していても、インターナルエラーが発生しなくなりました。
[EW22787] -
EWARM 6.30.3:
定数を引数として、特定のアセンブラ命令を挿入する組込み関数に引き渡す場合、C++モードでインターナルエラーが発生しなくなりました。
[EW22808] -
EWARM 6.30.3:
帰納変数の初期化で稀にインターナルエラーが発生することがありました。これは修正されました。
[EW22815] -
EWARM 6.30.3:
複数ファイルのコンパイルオプション--mfc
を1つ以上のサイズがゼロのソースファイルと使用しても、コンパイラがインターナルエラーで終了しなくなりました。
[EW22828] -
EWARM 6.30.3:
ELFファイルのデバッグ情報が、コマンドラインオプション--preinclude
の使用時に正しいソースファイル名を参照するようになりました。
[EW22848] -
EWARM 6.30.3:
一部の診断(特に、順序通りでないアクセスについての未定義の動作のワーニングなど)が、ブロックローカルの匿名構造体/共用体変数のフィールドの使用に対してトリガされた場合、コンパイラがインターナルエラーで異常終了していました。この問題は修正されました。
[EW22850] -
EWARM 6.30.3:
thread-exit関数が、割当てられた可能性のある夏時間の構造体を正しく割当解除するようになりました。
[EW22862] -
EWARM 6.30.3:
IT-ブロック内の命令は、不要なコードの削除候補ではなくなりました。これを削除すると、IT-命令が不整合となるためです。
[EW22864] -
EWARM 6.30.5:
同等のビットごとまたは式が複数の場所で発生して、すべてではなく少なくとも1つがビットフィールド命令として書き直された場合に、共通部分式除去(CSE)が正常に機能しなくなることがありました。これはもう発生しなくなりました。
[EW22932] -
EWARM 6.30.6:
2つの?:
式(または同等のif
文)を持つ関数に、2つの異なる変数に同じ値が割り当てられた同一のテストがある場合、最初の変数が? :
式の後に続く基本ブロックに再び割り当てられると、正しく最適化されないことがありました。これは修正されました。
[EW22965] -
EWARM 6.30.6:
コンパイラが、式uchar = ~0 (int & 1)
を誤って最適化することがありました。これは修正されました。
[EW22972] -
EWARM 6.30.8:
左側が間接(ポインタや参照を通して)またはグローバル変数や静的変数で、右側が関数呼出しの場合に、一部の代入が誤って最適化されることがありました。これらの呼出しからスローされる例外は、正しく処理されませんでした。
最適化しようとするシーケンスのどれかが例外コードであった場合、最適化の内部クロスジャンプによって、正しいコードが作成されるとは限りませんでした。これは修正されました。
[EW23094, EW23185] -
EWARM 6.30.8:
((unsigned char) x)-48 < 10
のような範囲のチェックが、変数x
をゼロ拡張せずに実行されるときがありました。
[EW23141]
- なし
V6.21 2011-07-05
新機能- なし
-
アドレス情報(
#pragma location
または@
演算子から)が、関数の宣言から関数定義へと正しく引き継がれるようになりました。
例:int foo(void) @ "XXX";
関数
int foo(void) { return 1; }foo()
はセクションXXX
に配置されるべきですが、そうなっていませんでした。
[EW22448] -
一致しないアドレス文字列で
main
を再度宣言して結果のエラーを無効化すると、コンパイラでインターナルエラーが発生していました。この場合、エラーを無効化できなくなりました。
[EW22450] -
複数の定数を持つ可換の演算が、1つまたは複数の演算がより小さい型の場合であっても、間違って最適化されなくなりました。
[EW22470, EW22484] -
ネストされた割込みハンドラについて、
LR
が調整されました。
[EW22472] -
インラインテンプレート関数内の文字列リテラルが、constでない変数に変換されていました。これらの変数は
const
となり、仕様のとおりにROM内に配置されます。
[EW22475] -
インターナルエラーを修正しました。
[EW22479] -
EWARM 6.21.4:
特定の小さい切替え文で、コンパイラが呼び出しごとに異なるコードを生成していました。これは修正されました。
[EW22520] -
EWARM 6.21.4:
自動オブジェクト内の構造体メンバに対するストアが、オブジェクトのメンバがオブジェクトのアドレスが関数に引き渡される前に一度読み込まれる場合に、誤って最適化されていました。
[EW22537] -
EWARM 6.21.4:
コンパイラが、部分的な定義の範囲拡張を回避するようになりました。
[EW22539] -
EWARM 6.21.4:
Thumb-1命令ADD.N Rdn,Rdn,SP
の範囲が拡張されるとき、ADD.W Rdn,Rdn,SP
は予測不可能なため、同等のThumb-2命令ADD.W Rdn,SP,Rdn
が使用されます。
[EW22555] -
EWARM 6.21.4:
コンパイラが、分岐とターゲット間に非常に多くの定数や文字列リテラルを配置しなくなりました。LR
がプッシュされないThumb-1関数によって、"Internal error:Jump distance to far for B"が発生することがありました。
また、コンパイラがADR
命令とそのターゲットの間に多数の定数や文字列リテラルを配置しなくなりました。これによって、"Internal error:[AsmLine - OgAsm]:Error[400]:Expression out of range"が発生することがありました。
[EW22611] -
EWARM 6.21.4:
ASR
、LSR
、LSL
、ROR
、RRX
への参照をコンパイルするときに、コンパイラがクラッシュしなくなりました。
[EW22614]
V6.20 2011-04-29
新機能time.h
に-9999から9999までの年号をサポートするオプションの64ビットインタフェースが付属になりました。詳しくは、開発ガイドを参照してください。
-
--use_c++_inline
オプションを使用してCファイルをコンパイルするときに、publicインライン関数の定義がインターナルリンケージを持つ関数や変数を参照できないというC99の規則がチェックされなくなりました。
[EW22161] -
ループ本体の最後の文がswitchであるループによって、最適化レベルが「高」のときにインターナルエラーがトリガされなくなりました。
[EW22183] -
C++ Cシステムヘッダ(
errno.h
など)が、extern "C"
ブロック内にインクルード可能になりました。
[EW22188] -
ループ本体に複数のリターンを持つ
while
ループによって、インターナルエラーがトリガされなくなりました。
[EW22195] -
コンパイラで、マルチバイトを含むマクロパラメータを処理できるようになりました。
[EW22214] -
非常に多くの定数データシンボルを持つモジュールのコンパイルが、かなり高速になりました。
[EW22243] -
マクロ引数内でユーザ定義マクロに
offsetof
マクロが使用される場合、コンパイラがoffsetof
マクロの内容に関して不要なワーニングを出力しなくなりました。
[EW22250] -
製品に付属のファイル
arm\src\lib\thumb\cstartup_M.c
とリンクするときに、シンボル__vector_table
がインクルードされるようになりました。
[EW22252] -
コンパイラで、コメント内およびソース行の接合メカニズムでマルチバイト文字が正しく処理されるようになりました。
[EW22276] -
2番目のテストを使用して1回だけループの繰り返しを実行すると判断するときに、複数のテストと空白のループ本体を持つ1回きりのループが展開できるようになりました。
[EW22295] -
左シフトおよび減算の関係する複雑な式が、常に正しく最適化されるようになりました。
[EW22306] -
場合によっては、コンパイラがマイナス8ビットのイミディエイトを持つThumb-2
ADD
命令を生成することがあり、これがアセンブラによってnarrowThumb-1SUB
命令に変換されていました。これは修正されました。
[EW22308] -
MISRA-C規則が、
#pragma location
内や@
演算子の後のアドレスに誤って定数式に適用され、MISRA-Cチェックが有効な場合に間違った診断が行われていました。これは修正されました。
[EW22321] -
アドレスのオペランドが
[<Rn>,<Rm>,#<imm>]
の形式のときに、Thumb-2のコードを生成して64ビットのストアを32ビットのストアに分割しようとしても(アラインメントのためなど)、インターナルエラーが出力されなくなりました。
[EW22324] -
メンバへのポインタへの関数の非標準の暗黙的キャストに対して、コンパイラでエラーが出力されるようになりました。
[EW22337] -
トランポリン関数
__iar_via_rw_<Rn>
が書込み可能なセクションフラグメントとして生成されるようになり、こうした関数が必要なケースでも__ramcode
関数が使用可能になりました。
[EW22346] -
EWARM 6.20.2:
条件付きのジャンプを最適化するときに、コンパイラがインターナルエラーで終了しなくなりました。
[EW22404] -
EWARM 6.20.2:
メディア拡張を持つコアの場合、コンパイラで{S,U}XTA{B,H}
ではなくADD
が生成されなくなりました。
[EW22407] -
EWARM 6.20.2:
アドレスのオペランドが[<Rn>,<Rm>,#<imm>]
の形式のときに、Thumb-2のコードを生成して64ビットのロードを32ビットのロードに分割しようとしても(アラインメントのためなど)、インターナルエラーが出力されなくなりました。
[EW22415] -
EWARM 6.20.2:
構造体または構造体配列の静的初期化において、名前のないビットフィールドに続くフィールドで間違った値が取得されなくなりました。
[EW22416] -
EWARM 6.20.2:
構造体またはクラス定義に対してキーワード__packed
を使用する際に、コンパイラが間違ってワーニングPe021(この場合、型修飾子は無効)を出力していました。
[EW22417] -
EWARM 6.20.2:
goto
文を持つループで、すべてのケースについてインターナルエラーがトリガされなくなりました。
[EW22420] -
EWARM 6.20.2:
定数の整数だけからなる集合イニシャライザで、イニシャライザで指定されていない部分にある2つより下位レベルにネストされた非整数と非集合型が関係する場合、コンパイラがインターナルエラーにより終了しなくなりました。
[EW22424] -
EWARM 6.20.3:
Thumb-2コードを生成する際、大きなスタックフレーム上で32ビットの浮動小数点値にアクセスしてもインターナルエラーが発生しなくなりました。
[EW22439] -
EWARM 6.20.3:
整数からのキャストを含むポインタ定数が、間違った型を取得することがあり、不正なエラーやインターナルエラーの原因となっていました。これは修正されました。
[EW22441]
V6.10 2010-11-04
新機能本製品は1999年に定義された最新のC規格(C99)をデフォルトのC言語として使用しています。本製品の以前のメジャーバージョンでは、1989年に定義された古いC規格(C89)を使用していました。
--c89
オプションを使用すると、コンパイラでC89をまだ使用することができます。一部のC99の機能のサポートが中止されているため、この製品は旧バージョンと完全に互換性があるわけではありません。C99の可変長配列、VLAは、デフォルトのC言語ではサポートされていません。オプション--vla
を使用すると、これらを有効にできます。CライブラリはすべてのC99機能をサポートしていますが、C99言語か任意のC++言語と併用している場合に限ります。C89言語と併用する場合、C99で追加された機能は使用できません。EC++およびEEC++の実装は、大きくは変わってはいません。
C++言語のサポートが追加されました。デフォルトでは、2003 C++規格が完全にサポートされていますが、
--no_exceptions
および--no_rtti
を使用することにより、例外とランタイム型情報をそれぞれ無効にした状態で使用できます。スレッドセーフライブラリ
DLIBライブラリは、スレッド環境での使用をサポートするようになりました。ヒープやファイル構造と同じように、一部のライブラリシステムはロックにより保護されます。locale
やerrno
のような他のライブラリシステムは、静的データがスレッドのローカル記憶に割り当てられます。DLIBスレッドのサポートはユーザが選択したRTOSでサポートされるか、または手動で実装できます。詳しくは、開発ガイドを参照してください。コンパイラとアセンブラは、ライブラリのシステムヘッダファイルがある場所を自動的に認識できるようになりました。以下のオプションを使用してコンパイラを制御できます。
--dlib_config
を使用して、DLIBライブラリの構成を選択します。--system_include_dir
を使用すると、システムヘッダのベースとして使用するディレクトリをオーバライドできます。--no_system_include
を使用して、自動化をオフにすることができます。
コンパイラでオプション
--relaxed_fp
を使用すると、一部の浮動小数点式をより良く最適化できるようになりました。有効にした場合、コンパイラは浮動小数点式でより小さい浮動小数点型を小さくしようと試みます。これによって精度の劣化が小さくなります。
-
ライブラリ関数
fpclassify()
は、正規化数と非正規化数を正しく処理できるようになりました。
[EW21098] -
小さい
memcpy
の呼出しは、ソースと目的地のアドレスのアラインメントがどちらも正しい場合、代入に変換されなくなりました。
[EW21193] -
コンパイラは、異なる種類の変数が同じセクションに配置されていないかをチェックするようになりました。
[EW21351] -
__segment_begin()
または__segment_end()
が条件付きコードで使用されていても、インターナルエラーが発生しなくなりました。
[EW21770、EW21838、EW21905] -
符号なしのループカウンタでゼロを通り越してループがデクリメントすると、間違って最適化されることがありました。
[EW21795] -
すべてのシステムヘッダがMISRAエラーを出力しなくなりました。
[EW21799] -
最適化の実行中に、コンパイラがオフセットを持つ関数ポインタを含むイニシャライザを処理するようになりました。
[EW21870] -
エンディアン属性は、ポインタや配列ではサポートされていません。ポインタや配列については、エンディアン属性が指定できないようになりました。
[EW21887] -
バイトオーダの逆順が、エンディアン属性およびアラインメントされていないアクセスの組合せに対しても正しく実行されるようになりました。これまでは、これが処理されないときがありました。
[EW21888] -
最適化レベル[高]で、以下のような小さいループの速度を最適化した場合
間違って展開されて、インターナルエラーが発生することがありました。int test(int n) { while (n-- > 0) if (!foo(n)) break; return n; }
[EW21949] -
名前のない構造体であるメンバを持つクラス、または名前のない構造体の配列で、少なくともメンバの1つがPoDでない場合、コンパイル中にインターナルエラーが発生することがありました。
[EW21958] -
ループテストで事前インクリメントまたは事前デクリメントを持つwhileループが、ループ本体の最終部分がdoループの場合に、間違って最適化されることがありました。
[EW21999] -
コンパイラが、Thumb-2比較および分岐命令(
CBZ
またはCBNZ
)のレジスタオペランドによって、同等でない命令シーケンスを(クロスコールまたはクロスジャンプ初期化によって)マージしなくなりました。
[EW22000] -
enum
が定義される前にパラメータまたはリターン型として指定された場合、コンパイラが間違ったnumサイズ(属性Tag_ABI_enum_size
)をELFファイルに記録しなくなりました。
[EW22013] -
Thumb-2では、コンパイラが後に続く命令またはラベルの4バイトアラインメントを実現するために
MULS.N
をMULS.W
(これはThumb-2命令ではありません)に拡げようとしても、インターナルエラーが発生しなくなりました。
[EW22018] -
コンパイラが関数シンボルを、
memcpy
のようなコンパイラにより最適化された関数への引数として処理できるようになりました。
[EW22052] -
EWARM 6.10.2:
ネストされたfor
ループで、内部ループの初期または最終の値が外部ループの変数に定数の倍率係数や定数オフセットを掛けたものである場合、最適化レベル「高」でインターナルエラーが発生しなくなりました。
[EW22078] -
EWARM 6.10.2:
複数の出口を持つ一部のwhile
ループで、最適化レベル「高」のときにインターナルエラーが発生しなくなりました。
[EW22080] -
EWARM 6.10.2:
コンパイラが直接のADR
参照を生成してない場合に、定数データが.rodata
セクションに配置されるようになりました。ADR
参照がある場合、定数データは.text
セクションに配置されます。
[EW22081] -
EWARM 6.10.2:
標準C++がkickstart製品でも有効になりました。
[EW22089] -
EWARM 6.10.2:
MISRA-C:2004規則20.2チェッカが、長いプリプロセッサシンボル定義を処理できるようになりました。
[EW22117] -
EWARM 6.10.2:
Cortex-M3で、ソフトウェア割込み関数(SWI
)への呼出しで終わる同一の命令シーケンス(クロスコール)に対して、コンパイラがサブルーチンを生成しなくなり、インターナルエラーも発生しなくなりました。
[EW22118] -
EWARM 6.10.2:
コンパイラが、STREX
命令の結果を使用するコードを削除しなくなりました(この命令は、__STREX
組込み関数を使用して生成できます)。
[EW22119] -
EWARM 6.10.2:
コンパイラが符号付き16ビットの値を、MOVT
命令のイミディエイトのオペランドとして使用しなくなりました。代わりに、16ビットの符号なしの値が使用されます。この理由は、MOVT
が0から65535のイミディエイト値を想定するためです。
[EW22121] -
EWARM 6.10.2:
結果を使用せずに関数アドレスを評価しても、インターナルエラーが発生しなくなりました。
[EW22146]
V5.50 2010-04-21
新機能-
VFPを持たないデバイスについて、次のCライブラリ浮動小数点関数のスピードどサイズが最適化されています。
sqrt
、sqrtf
、modf
、modff
、fabs
、fabsf
、fmod
、fmodf
、floor
、floorf
、ceil
、ceilf
、ldexp
、ldexpf
、frexp
、frexpf
。 -
VFPを持つデバイスについて、次のCライブラリ浮動小数点関数のスピードどサイズが最適化されています。
sqrt
、sqrtf
、modf
、modff
、fabs
、fabsf
、fmod
、fmodf
、floor
、floorf
、ceil
、ceilf
、ldexp
、ldexpf
、frexp
、frexpf
、asin
、asinf
、acos
、acosf
、atan
、atanf
、atan2
、atan2f
。
-
関数の最後に到達するのを妨げるコードを含んだ関数を最適化する際に、最後に到達可能な命令の後にコンパイラが誤ってラベルを残していました。このラベルが後で、関数からの制御の流れの漏れと認識され、インターナルエラーが発生していました。
[EW21541] -
ベースタイプでもキーが見つからない場合に、マップインデックス演算子の呼出しがデフォルトで値を生成するようになりました。
[EW21592] -
C++動的初期化を必要とする静的記憶寿命オプションを持つ指定のイニシャライザ(IAR拡張が有効な場合にEC++で使用可能なC99機能)を使用する際に、誤った初期化が行われる可能性がありました。
[EW21649] -
LDC
およびSTC
に組込みを使用した場合に、コンパイラがクラッシュすることがありました(アクセス違反)。
[EW21657] -
関数
f
がグローバル変数を更新する際、以下の場合に誤って最適化されることがありました。
f
に複数のリターン文がある。- リターン文のどれか1つがループ内にあり、
f
が別の関数内にインライン化されている。
-
スタックパラメータを生成するためにコンパイラが
memcpy
への呼出しを挿入する関数呼出しの場合、レジスタR1
がmemcpy
の呼出し後も有効であると見なされなくなりました。
[EW21668] -
コンパイラがアラインメントされていないCortex-M0のメモリアクセスを生成しなくなりました。
[EW21687] -
Thumb-2対応のコアについて、サイズ指定子(
.W
または.N
)なしにはコンパイラが分岐命令を生成しなくなりました(Thumbモードの場合)。これを行うと、場合によってインターナルエラーが発生する恐れがあるためです。
[EW21699] -
EWARM 5.50.5:
列挙子の定数を直接的に浮動小数点値として使用しても、破損した値が生成されなくなりました。
[EW21704] -
EWARM 5.50.5:
テンプレートパラメータに依存するサイズを持つブロックローカル静的配列の配列ポインタディケイで、インターナルエラーが発生しなくなりました。
例:
template
[EW21728]struct Q { C * get() { static long x[sizeof(C)]; return (C *)x; } }; -
EWARM 5.50.5:
ARM11の命令スケジューリングで、シフトオペランドを持つPKHBT
をスケジューリングする際に、インターナルエラーが発生しなくなりました。
[EW21745] -
EWARM 5.50.5:
USAT
命令(飽和演算用)が、Thumb-2モードでも正しいビット幅により生成されるようになりました(1つずれていました)。
[EW21768] -
EWARM 5.50.5:
double
からlong long
へのキャストによって、少数部分がゼロではない非常に大きな入力についても間違った値が生成されなくなりました。範囲[2^32, 2^52]の値が影響を受けていました。
[EW21786] -
EWARM 5.50.5:
インターナルエラーがある条件でも発生しなくなりました。その条件において、テストは?:
式で、その形式は次の通りです:
if ((condition1 && condition2) ?1 : 0)
[EW21807] -
EWARM 5.50.5:
関数パラメータのアドレスの範囲チェックが正しく変換されるようになりました。以前はインターナルエラーが発生することがありました。
[EW21826] -
EWARM 5.50.5:
コンパイラで、本体で__noreturn
属性を持つ関数を呼び出す関数をインライン化することが可能になりました。
[EW21841] -
In EWARM 5.50.7:
複数の定数テーブル参照が、(LDR (immediate)
命令が関数の外にたどり着けないほどの)大きい関数と同じITブロックに配置された場合に、インターナルエラーが出力されなくなりました。
[EW21968] -
In EWARM 5.50.7:
不変ポインタ変数を通して条件付きアクセスを含むループが、間違って最適化されなくなりました。
[EW21992] -
In EWARM 5.50.7:
マイナスの除算を持つ式の符号付き除算が、最適化されて符号なしの除算を使用することがなくなりました。
[EW22043]
V5.41 2009-12-14
新機能- なし
-
cstartup_M.c
にデフォルトの割込みハンドラが含まれています。
[EW21314] -
フォーム
if (expr < 0) v = -expr;
の式が、正しく最適化されるようになりました。
[EW21340] -
次の場合に、ループ内のテストが正しく最適化されるようになりました。
a) ループの初回および最後の繰返しの値が一定である。
b) テストで式が定数と比較されている。
c) 式の計算によって初回または最後の繰返しのどちらかがオーバフローまたはアンダーフローとなる。
[EW21363] -
最適化の途中で、複雑な|-式が無限ループにならなくなりました。
[EW21380] -
レジスタよりもライブの変数が多いと、レジスタがスタックフレームにあふれることがありました。あふれた大きい(8バイトを超える)レジスタパラメータによるインターナルエラーが発生しなくなりました。
[EW21386] -
明示的に指定されたライブラリを使用したリンクでの属性チェックに関して、リンカがより柔軟になりました。
[EW21387] -
絶対アドレスの変数アクセスによって、最適化の際に
volatile
属性が失われなくなりました。
[EW21400] -
基本ベースが仮想的に継承された基底クラスから継承するクラスのデバッグ情報が、正しく生成されるようになりました。以前はこの問題によって、C-SPYで基底クラスが間違って表示されることがありました。
[EW21411] -
インラインアセンブラコードのアセンブラエラーが、コンパイラのインターナルエラーとして報告されなくなりました。
[EW21436] -
コンパイラで、エスケープシーケンスを使用して文字の値255が文字列リテラルにエンコードされるようになりました。これは、アセンブラがこうした値をファイル末尾として認識することを回避するためです。
[EW21443] -
未使用のレジスタが名称変更の後に使用される場合に、こうしたレジスタがスタックに保存されなくなるのを防ぐため、レジスタが名称変更されなくなりました。
[EW21449] -
すべての参照からアクセスできるように定数テーブルのエントリがコピーされる場合に、コンパイラがインターナルエラーを報告する代わりに、正しいコードを生成するようになりました。
[EW21471] -
EWARM 5.41.2:
ループ内の整数式で、式が変数(x + ...+ C)
に定数を追加したり、変数から定数を差し引く場合に誤って最適化されなくなりました。また、定数ループインデックス変数(x = i - C)
から差し引かれたもの、またはこの変数に追加されたものと同じ定数が変数に割り当てられます。
[EW21493] -
EWARM 5.41.2:
フォーム
expr1 > c1 && expr2 < c2
または
expr1 < c1 || expr2 > c2
に対する2つのテストは、expr1
がexpr2
と同じでない場合に範囲テストとして誤って最適化されなくなりました。.
[EW21498] -
EWARM 5.41.2:
定数とメモリからロードされた値間のビットごとのand処理が、ロードが切り詰められた状態に変換されることがあり、この場合は変数の一部しかメモリからロードされません。64ビットの変数の場合(つまりlong long
)、ロードが切り詰められでもインターナルエラーが発生しなくなりました。
[EW21517] -
EWARM 5.41.2:
ループに複雑な配列インデックス式があっても、インターナルエラーが発生しなくなりました。
[EW21545] -
EWARM 5.41.2:
32ビットより小さい型で、(たとえばCMP
、TST
、TEQ
を使用して)比較する前に、符号拡張またはゼロ拡張しなければならないことがありました。ビットごとのand/xor処理の結果がゼロと比較される場合(つまり、TST
またはTEQ
命令が生成される場合)
、必要があれば符号拡張およびゼロ拡張が生成されるようになりました。[EW21550] -
EWARM 5.41.2:
組込み__CLZ
、__REV
、__REVSH
が定数の引数とともに使用されるときに、正しい値が生成されるようになりました。
[EW21561]
V5.40 2009-07-10
新機能- なし
-
if-then-else文が最適化レベル「低」でも疑問符の式に最適化できてしまい、どちらが最新の文なのかデバッガが混乱していました。最適化レベル「低」および」「なし」での最適化が無効にされました。
[EW20828] -
オプション
--strict_ansi
および--warnings_are_errors
が使用されていても、システムヘッダでのlong long
の使用に対して、コンパイラによりメッセージが生成されなくなりました。
[EW20844] -
memcpy
またはmemset
の呼び出しに変換されたループ内の最後の値が、場合によって1つずれていることがありました。
[EW20886] -
行外のテンプレートメンバ関数定義を正しい宣言に突き合せようとする際の、コンパイラのインターナルエラーを修正しました。2つ以上のテンプレートメンバ関数が、メンバ関数型のパラメータへのポインタのthis修飾子で異なる場合に、この問題が発生していました。
例:
[EW20920]struct X { template
int fun(Y (Z::*fp)()); template int fun(Y (Z::*fp)() const); }; template int X::fun(Y (Z::*fp)()) { return 1; } -
MISRA-Cエラー
Pm020
がワーニングとして誤って報告され、対応する規則番号がエラーメッセージから省略されていました。
[EW20925] -
複数の入力ファイル(
--mfc
)をEmbedded C++モードでコンパイルする際、ある環境においてコンパイラで[assertion failed at:".\src\parser\edg\lower_il.c", line 2484]
というインターナルエラーが出力されることがありました。
[EW20927] -
グローバル変数(
g
)が結果(g
はループの繰返しの最中に値を引き渡さない)を保持するループが、誤って最適化される場合がありました。for (...) { g = ... if (...) break; g = ... }
[EW20952] -
コンパイラおよびアセンブラがオブジェクトファイルを生成し、グループセクションヘッダテーブルのエントリが、ELFフォーマットで要求されているとおりに、すべてのメンバのエントリの前に表示されませんでした。
[EW20988] -
memcpy
の呼出しの後、バッファ(b
)にn
文字が長さn
(ゼロ終了以外のすべての文字)の文字列リテラルから割当てられ、代入b[n] = 0
が誤って削除されていました。
[EW20991] -
除算と剰余の演算を両方含む関連付きの式が、ごく稀な場合に誤って最適化されることがありました。
[EW21010] -
3つ以上のクラスから継承するクラス(仮想メソッドが3つ以上の引数を持つ場合)であるTHUMB向けのEEC++をコンパイルする際、生成されたサンクのいずれかにエラーがありました(複数の継承がある場合にコンパイルする際、'this'ポインタを調整する小さなコードが必要なときがあります。このコードを'サンク'と呼びます)。
[EW21014] -
2つのフィールド
a
およびb
によってレジスタ変数として割当てられた、8バイト以上の構造体x
の場合、疑問符の式(x.a < x.b ? x.a :x.b
など) に短縮可能な、単純なif文がインターナルエラーの原因となることがありました。
[EW21017, 21108] -
memcpy
によって割当てられた自動構造体へのメンバアクセスが、誤って最適化される場合がありました。
[EW21020] -
VFP用にコンパイルする際、変数引数リストを用いた関数呼出しで、スタック上で引き渡された引数が
double
からint
に変換され、結果として間違ったスタックポインタ値になる可能���がありました。
[EW21023] -
Thumbモードの
--legacy RVCT3.0
を用いてコンパイルする場合に、同じコンパイルユニットの関数同士で定数が共有され、2バイトのアラインメントを持つ1つのセグメントパート内に関数のいずれかが生成されることがありました。こうした場合にR_ARM_THM_PC8
の再配置を正しく解決するには、4バイトのアラインメントが必要です。
[EW21031] -
コードジェネレータが、タイプで要求されたものよりも厳密なアラインメントを用いて配置されたオブジェクトを検出できないことがありました。これによって、後の段階でコードジェネレータが上位のアラインメントを必要とした場合に、コンパイラがクラッシュする可能性がありました。
[EW21059] -
ループ内の切替え文がマイナスのオフセットを持つテーブルとして生成される場合、テーブルルックアップで同じレジスタが2つの異なる目的で再利用できました。
[EW21100] -
テンプレートクラス内で定義されたenum型がある場合に、コンパイラがインターナルエラーにより終了することがありました。
[EW21101, 21112] -
ループを最適化するときに、ループの制限が、ビット単位のAND演算におけるマイナスの値が関係する式の結果である場合、ループ本体が少なくとも1回は実行され、制限に対する初期イテレータ値のテストを削除するものとして、コンパイラが間違った結論を出す恐れがありました。ループ本体がまったく実行されるべきでない場合でも、結果として間違ったループコードになっていました。
[EW21118,21120] -
EWARM 5.40.4:
ランタイムライブラリが、Cortex-M0またはCortex-M1でアラインメントされていないアクセスがサポートされていると想定しないようになりました。
[EW21262] -
EWARM 5.40.4:
32ビットより小さいスカラスタックパラメータは、関数が呼び出される前に正しく符号またはゼロで拡張されるようになりました。
[EW21271] -
EWARM 5.40.4:
組込み__get_interrupt_state
または__set_interrupt_state
のどちらかを使用したファイルのコンパイルで、インターナルエラーが発生しなくなりました。
[EW21272] -
EWARM 5.40.4:
MISRA-CがEWARM-CMで使用できるようになりました。
[EW21324] -
EWARM 5.40.4:
コンパイラで、別のモジュールで定義されたC++メンバ関数の呼出しに対して、正しいデバッグ情報が生成されるようになりました。こうした呼出し用のstep intoデバッガコマンドが現在は正常に機能します。
[EW21327]
V5.30 2009-01-23
新機能- __task拡張キーワード
デフォルトでは、関数は使用された保護レジスタの内容を入口でスタックに保存し、出口で復元します。_task
を使用して宣言された関数の場合、レジスタを保存しないため、必要なスタックエリアが小さくなります。これは通常、リアルタイムOSで使用されます。
-
フィールドのどれかにタイプエラーがある状態でタイプがクラス/構造体/共用体の変数を作成すると、インターナルエラーを引き起こすことがありました。これは修正されました。
[EW20367] -
ごく稀な場合に、コンパイラが異常終了することがありました。異常終了が回避されるようになりました。
[EW20380] -
リストファイルで報告されるスタックの使用は、再び安全な近似値になりました。
[EW20410] -
連続する2つの式の前後のインクリメント/ディクリメントによって、インターナルエラーが起きることがありました。この問題は修正されました。
[EW20419] -
ごく稀に、不規則なループが間違って最適化される場合がありました。この問題は修正されました。
[EW20428] -
複数レベルの匿名共用体/構造体の内部にあるフィールド上で指示されたイニシャライザを指定すると、コンパイラでインターナルエラーとなることがありました。この問題は修正されました。
[EW20439] -
インラインアセンブラの操作によって、ELFで絶対アドレッシングに対してエラーが正しく生成されるようになりました。
[EW20489] -
特定のループコンストラクトにコードを生成するときに、コンパイラが失敗することがありました。これは修正されました。
[EW20503] -
ネストされた2つのループ内にあるアドレス式が、値を割当てられる前に変数を使用できる場合がありました。これは修正されました。
[EW20531] -
Cortex-M3の最適化レベル「中」(またはそれ以上)の場合、定数256と疑問符演算子(
a?b:c
)の特定の組合せをコンパイルすると、"illegal state"(無効なステート)というメッセージが出力されてインターナルエラーとなることがありました。これは修正されました。
[EW20537] -
小さい型(
char
など)の変数が、ラップされる可能性がありながらも、ループカウンタとして間違って巻き上げられることがありました。これは修正されました。
[EW20563] -
連続するshort、integer、long longをコピーする
do
ループが、memcpy呼出しに変換されたときに、正しいバイトカウントを持つようになりました。
[EW20570] -
リターン値ポインタを使用する関数に作成されたリターン値の一時値が、アドレスを取得済みとしてマークされませんでした。これは修正されました。
[EW20572] -
同じメモリアドレスにアクセスするために異なるタイプのポインタが使用されていると、コードが誤って最適化される場合がありました。これは修正されました。
[EW20581] -
整数型のテンプレート静的データメンバが関係する特定の操作(通常はビットの操作)によって、テンプレートコードのコンパイル時にインターナルエラーが発生する場合がありました。これは修正されました。
[EW20608] -
グローバル変数と同じタイプの間接的なストアの後に続くグローバル変数をループが更新するときに、間違って最適化される場合がありました。
[EW20627] -
コンパイラがIT-ブロックに
CPSIE/CPSID
を入れようとしなくなりました。
[EW20652] -
最小および最大のテンプレートが、関数インライン化の後に正しく最適化されるようになりました。
[EW20654] -
コンパイラが、エラーPe020を出力した後にクラッシュしなくなりました。
[EW20684] -
組込み関数__set_CPSR() が、間違ったアセンブラ命令を生成していました。これは修正されました。
[EWARM-268]
V5.20 2008-06-24
新機能-
ベクタ浮動小数点(VFP)コプロセッサのサポート。
-
コンパイラが、初期化されていない揮発性の自動変数からのリードを、コードから削除しなくなりました。
[EW19167] -
フォールスルーを持つサンクが、必要なときにいつでも正しくパッドされるようになりました。
[EW19481] -
#line
ディレクティブの後のソース行が、コンパイラのリストファイルにインクルードされるようになりました。
[EW19654] -
コンパイラが、アセンブラ命令やレジスタ名などと同じセグメント/セクション名を処理できるようになりました。
[EW19674] -
テンプレートクラスのメンバ関数の行外の定義が、正しく仮になるようになりました。
[EW19678] -
クラス固有の2つのオペランドを持つ演算子、
delete
をクラステンプレートで宣言しても、コンパイラがクラッシュしなくなりました。
[EW19707] -
外部の
typename
キーワードがテンプレートにあるというエラーを出力した後に、コンパイラがクラッシュしなくなりました。
[EW19796] -
MISRA-C規則23で、コード以外のシンボルにエラーが出力されなくなりました。
[EW19802] -
Reallocが、ヒープにある以上のメモリを割り当てようとする呼出しの後で、ヒープを破損したステートのままにしなくなりました。
[EW19803] -
10以上の定数を持つクラスによってスコープされた
enum
型のクラス外部typedef
にDWARFデバッグ情報を生成するときに、コンパイラがクラッシュすることがなくなりました。
[EW19820] -
Cortex-M3で
memcpy
を実行していて、ソースと対象へのポインタのアラインメントが異なる場合、サイズが以下のときに最後の16バイトがコピーされるようになりました。size = 32 + ((4 -(DstPtr & 3)) & 3) + (y * 16); // y = 0、1、2など
[EW19837] -
命令スケジューリングが、関数/ライブラリの呼出しよりもLRのポップを優先しなくなりました。
[EW19872] -
アラインメントされたパラメータを持つ
memmove
への呼出しが、__aeabi_memmove4
ではなく、誤って__aeabi_memcpy4
に変換されることがなくなりました。
[EW19878] -
long long
値のマスクが機能するようになりました。
[EW19908] -
関数の呼出し(あるパラメータが、同じサイズの符号なしの型へのポインタのキャストである符号付き整数型へのポインタであるか、またはその逆の場合)、関数の呼出しがインライン化されるときにインターナルエラーが起こらなくなりました。
[EW19933] -
0から1へと変わる符号なしのループ変数を持つループが、間違って最適化されなくなりました。
[EW19973] -
Thumb2コードの定数テーブルのレイアウト生成が調整されました。
[EW19984] -
ソースが増分された前または後のポインタの間接であるときに、構造体の割当てが間違って最適化される場合が稀にありました。これは修正されました。
[EW20071] -
Thumb2コード内の大きなレジスタ(
r8-r14
)の変数のデバッグ情報が改善されました。
[EW20098]
[EW20100] -
クラスタ化で、セグメント/セクションにより配置された初期化済みの変数が処理できるようになりました。
[EW20149] -
ごく稀に、レジスタへのメモリセル(グローバル変数や構造体メンバなど)を一時的に巻き上げる最適化によって、コードが正しく変換されず、1つまたは複数の使用がそのメモリセルを参照したままになることがありました。これは修正されました。
[EW20150] -
ARM関数からthumb関数へのフォールスルーが、生成されなくなりました。
[EW20164] -
無効な命令でインターナルエラーが生成されなくなりました。
[EW20199] -
Tag_ABI_enum_size
が、使用されるenum
の実際のサイズを反映するようになりました。
[EW20203]
V5.11 2007-12-11
新機能- Cortex-M1およびCortex-M3のサポート。
-
コードジェネレータが集合タイプの小さなオブジェクトをレジスタ内に配置できなかった場合、代わりにオブジェクトをスタック上に配置しようとしても失敗することがありました。オブジェクトのアラインメントが集合メンバのサイズと一致せず、アラインメント境界上に配置されたものを除くすべてのメンバに間違ったオフセットが使用されるときに、この問題が発生していました。
[EW19478] -
最上位ビットを除くすべてに対する32ビットのマスク処理と、同じ変数の最上位ビットへのテストが、Thumbモードで間違ったコードを生成する場合がありました。
[EW19480] -
セクション".textrw" の名前を変更できるようになりました。
[EW19672] -
コンパイラで、アセンブラ命令、レジスタなどと同じ名前を持つセグメント/セクションを処理できるようになりました。
[EW19674] -
テンプレートクラスのメンバ関数の行外の定義が、正しく仮のものにならず、リンクの際に誤って'重複する定義'となっていました。これは修正されました。
[EW19678] -
クラス固有の2つのオペランドを持つ演算子、 deleteをクラステンプレートで宣言しても、コンパイラがクラッシュしなくなりました。
[EW19707] -
関数の宣言の不正な構文によって、インターナルエラーが生成されなくなりました。
[EW19718] -
Doubleが正しく丸められるようになりました。
[EW20026]
V5.10 2007-06-12
新機能- オブジェクトファイルがELF/DWARFフォーマットで生成されるようになりました。
- AEABIのサポート(ARM EABIに準拠する他のツールとの相互運用性)
-
静的変数のイニシャライザにビットフィールドメンバのアドレスが含まれる場合に、コンパイラがエラーを出力するようになりました。
[EW17962] -
関数に類似したマクロで、事前定義されたIAR属性名として名前が付けられていても、コンパイラが異常終了しなくなりました。
[EW18386] -
ごく稀な場合に、64ビット変数の上位部分だけがロードされました。
[EW18735] -
組込み関数
__no_operation()
を使用して挿入されたNOP命令が、コード内の希望する位置に表示されないままスケジュールされていました。
[EW18767] -
ヘッダファイル
MtxWrapper.h
がC++から動作するようになりました。
[EW18769] -
char
型のインデックス式を持つ配列アクセスを含むループが、間違って最適化される場合がありました。
[EW18815,EW18963] -
宣言同士の不一致、または同じ関数の宣言と定義の不一致について、正しい診断結果が出るようになりました。
[EW18818] -
ヘッダファイル
Dlib_Product.h
がMISRA-Cと互換になりました。
[EW18843] -
ゼロおよび同じ構造体からのリードを持つ、織り交ざったストアが、以前は間違った順序で行われていました。
[EW18845] -
ア��インメントされていない構造体をビッグエンディアンモードでパラメータとして引き渡す際に、間違ったコードが生成されました。
[EW18900] -
swprintf
とvswprintf
で、末尾の\0
が正しく処理されるようになりました。
[EW18948] -
ごく稀な場合に、同じ構造体の他のメンバと定数 (
p->y == 0
)間の等式テストが式の前にあると、構造体ポインタ(p->x
)を含む共通部分式が、間違って最適化されていました。
[EW19015] -
__irq
と__fiq
を持つ関数が、vfpについてコンパイルする際に、vfpステータスレジスタを保存するようになりました。
[EW19047] -
コンパイラが、ファイルでスコープ化された初期化で使用される複合リテラルに間違った定数を生成しなくなりました。
[EW19076] -
swprintf
が大きな文字列を正しく処理するようになりました。
[EW19105] -
大きな関数が以下のインターナルエラーを出力する場合がありました:
Internal Error:[CoreUtil/General]:Jump distance to far for B
.
[EW19179] -
クラスタ化によって、ゼロに初期化されたデータが、ゼロ初期化を使用するのでなく、ROM空間を占有する場合がありました。
[EW19232] -
char
バッファのバイト上の!
演算子(例:return !buf[0];
) でインターナルエラーが起きる可能性がありました:Const_Folding - Internal error Unequal types for operator !=
Internal Error:[CoreUtil/General]:Const_Folding - Internal error
[EW19337]