MESC TOOL NEWS:
MESCT-NC30WA-980716D
この度、M16C/60シリーズ用CコンパイラNC30WA, NC30のご使用上の注意事項をご連絡致します。
1ビット同士のxorについて
- 内 容
ビット同士のxorを行う場合に不正なコードを出力する場合がありました。
- 対象バージョン
対象バージョンは、 V.1.00 Release 1~V.3.00 Release 1です。
- 発生条件
以下の3つの条件を満たした場合に発生します。
- 1ビット同士のxor(and,or)を行ったとき。
- xorを行っているビットと格納先のビットが同じメモリを指している。
- 上記ビットの各ビット位置が異なっている。
------------------------------------------------------------------
[例]
struct tag{
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:2;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
}bit;
struct tt{
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:2;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
}bb;
bb.b0=bb.b1^bit.b0;
------------------------------------------------------------------
- 対処方法
演算結果を一時的にテンポラリ変数に代入後、最終格納先へ代入してください。
NC30WA, NC30 ご使用上のお願い
MESCT-NC30WA-980716D
定数に対してandを行った時
- 内 容
定数にvolatile型のポインタにキャストを行ったメモリに対してand演算を行った時にsystem errorが発生する場合がありました。
- 対象バージョン
対象バージョンは、 V.1.00 Release 1~V.3.00 Release 1です。
- 発生条件
- 最適化オプション-O, -OR, -OSを使用している。
- 定数にvolatile型のポインタにキャストを行ったメモリに対してand演算を行う。
この2つの条件を満たした時で、かつ、特定の分岐のパターンにおいて発生していました。分岐のパターンは、生成されるアセンブラにおいて分岐先の後ろにreturnあるいはbranchが発生する場合です。
------------------------------------------------------------------
[例]
unsigned char c;
func(void)
{
switch(c){
case 1:
func();
break;
case 2:
break;
default:
*(volatile int*)(0x0300) &= 0x04 ;
return;
}
func1();
return;
}
------------------------------------------------------------------
- 対処方法
and演算を行う記述の直前にasm関数を追加してください。
NC30WA, NC30 ご使用上のお願い
MESCT-NC30WA-980716D
ループ内の不変式を追い出す最適化に関して
- 内 容
ループ内の不変式を追い出す最適化において不正なコードを出力する場合がありました。
- 対象バージョン
対象バージョンは、V.1.00 Release 2~V.3.00 Release 1です。
- 発生条件
以下の4つの条件を満たした場合に発生します。
- 最適化オプション-OSを指定している。
- ループ内にポインタもしくは、共用体のread、writeがある。
- readのアクセスとwriteのアクセスの記述が異なっている。
- readとwriteのメモリ(ポインタ)が同じアドレスを指している。
------------------------------------------------------------------
[例]
for(i = 0x00 ; i < 0x10 ; i++){
if(str->uni.bit.bit16)
a= 1;
str->uni.word[1] = str->uni.word[1] >> 1;
}
------------------------------------------------------------------
上記の場合、str->uni.bit.bit16がstr->uni.word[1]と同じところを指しています。
- 対処方法
最適化オプション-OSを使用しない、もしくはビットアクセスの前にダミーのinline関数を追加してください。
------------------------------------------------------------------
[例]
inline void dummy_inline(void){};
for(i = 0x00 ; i < 0x10 ; i++){
dummy_inline();
if(str->uni.bit.bit16)
(以下 省略)
------------------------------------------------------------------