リリース履歴
- 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
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"が発生することがありました。
[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]