RENESAS TOOL NEWS 2004年12月01日 : RSO-M3T-NC308WA-041201D
M3T-NC308WA および M3T-NC30WA
ご使用上のお願い
|
Cコンパイラパッケージ M3T-NC308WAおよびM3T-NC30WA の使用上の注意事項を連絡します。
- 該当製品
M32C/90, M32C/80シリーズ, M16C/80 およびM16C/70シリーズ用:
M3T-NC308WA V.5.00 Release 1 および V.5.10 Release 1
M16C/60, M16C/30, M16C/Tiny, M16C/20, M16C/10, およびR8C/Tinyシリーズ用:
M3T-NC30WA V.5.10 Release 1 および V.5.20 Release 1
- 内容
register変数をinline関数内で参照している箇所にたいして誤ったコードを生成する場合があります。
- 発生条件
2つの発生パターンがあります。以下のそれぞれの条件をすべて満たす場合に発生します。
発生パターン1
| (1) | inline関数の中でregister変数を宣言している。 |
| (2) | inline関数の中にif文がある。 |
| (3) | (1)のregister変数への代入式が2つ以上ある。そのうちのひとつを式Aとし、式Aよりも後に書かれている式のうちのひとつを式Bとする。 |
| (4) | 式Aが(2)のif文より前にある。 |
| (5) | 式Bが(2)のif文の真文または偽文のいずれか一方のみにある。 |
| (6) | コンパイルオプション-O,-OS, および-ORのいずれか1つ以上を指定している。 |
| (7) | コンパイルオプション-fERを使用している。 |
発生例1
-------------------------------------------------------------------
extern char a, b, c;
inline void func(void)
{
register int r = a; /* 発生条件(1),(3)および(4) */
if (r < b) { /* 発生条件(2) */
r = b; /* 発生条件(3)および(5) */
}
}
void testmain(void)
{
func();
}
-------------------------------------------------------------------
発生パターン2
| (1) | inline関数の中で、register変数を宣言している。 |
| (2) | (1)のregister変数への代入式が2つ以上ある。そのうちのひとつを式Aとし、式Aよりも後に書かれている式のうちのひとつを式Bとする。 |
| (3) | 式Aと式Bの間に、式Bと同じ右辺をもつ、register変数以外への代入式Cがある。 |
| (4) | 式Cと式Bの間で(1)のregister変数を参照している。 |
| (5) | コンパイルオプション -O, -O1, -O2, -O3, -O4, -O5, -OR, -OS のいずれか1つ以上を使用している。 |
| (6) | コンパイルオプション -fERを使用している。 |
発生例2
-------------------------------------------------------------------
extern char aa, bb, xx, yy, zz;
inline void func(void) /* 発生条件(1) */
{
register char r; /* 発生条件(1) */
char s;
r = aa + 2; /* 発生条件(2) */
xx = bb + 1; /* 発生条件(3) */
s = r; /* 発生条件(4) */
r = bb + 1; /* 発生条件(2) */
yy = r;
zz = s;
}
void testmain(void)
{
func();
}
-------------------------------------------------------------------
- 回避策
以下のいずれかの方法で回避してください。
| (1) |
register宣言をはずす。 |
| (2) |
コンパイルオプション-fERを使用しない。 |
| (3) |
register変数を参照する直前にasm関数を挿入する。 |
発生例1の回避例
-------------------------------------------------------------------
. . . . . . . . . . . . .
if (r < b) {
asm(); /* ダミーのasm()を挿入 */
r = b;
}
. . . . . . . . . . . . . .
-------------------------------------------------------------------
発生例2の回避例
-------------------------------------------------------------------
. . . . . . . . . . . . . . . . .
inline void func(void)
{
register char r;
char s;
r = aa + 2;
xx = bb + 1;
s = r;
asm(); /* ダミーのasm()を挿入 */
r = bb + 1;
yy = r;
zz = s;
}
. . . . . . . . . . . . . . . . . .
-------------------------------------------------------------------
- 恒久対策
最新版M3T-NC308WA V.5.20 Release 1 および M3T-NC30WA V.5.30 Release 1では発生しません。
最新版へは、オンラインバージョンアップサイトからバージョンアップ頂けます。