RENESAS TOOL NEWS 2007年08月01日 : 070801/tn2
| M32Rファミリ用C/C++コンパイラパッケージ
ご使用上のお願い
--非常に大きな実行文(コードサイズで128Kバイト以上)を持つ制御文や繰り返し文
を記述した場合の
注意事項-- |
M32Rファミリ用C/C++コンパイラパッケージの使用上の注意事項を連絡します。
- 非常に大きな実行文(コードサイズで128Kバイト以上)を持つ制御文や繰り返し文
を記述した場合の注意事項
1. 該当製品
M32Rファミリ用C/C++コンパイラパッケージ(M3T-CC32R)
V.1.00 Release 1 ~ V.5.01 Release 00
2. 内容
非常に大きなメモリを必要とする実行文を持つ制御文(if文など)や繰り返し文
(while文など)を記述したCソースコードをコンパイルすると、次のようなエラー
が発生してコンパイルできない場合があります。
a132R: "内部ファイル名": error: 16-bit displacement overflow in operand 2
注意:
"内部ファイル名"はコンパイル時に内部で自動的に作成されるファイル名です。
コンパイル対象のC/C++ソースファイル名ではありません。
2.1 発生条件
次の条件をすべて満たす場合に発生します。
(1)コードサイズが128Kバイト以上になる、規模の大きな実行文がある。
(2)上記(1)を実行文とする次のいずれかの文がある。
(a) if文。ただし、上記(1)の実行文がif判定式で真の場合の実行文である。
(b) switch文。ただし、実行文の合計が128Kバイトを超える場合。
(c) while文
(d) do ~ while文
(e) for文
2.2 発生例
sample1.c
-----------------------------------------------------------------------
int ans1;
void
func1(int a)
{
if (a) { /* 発生条件(2)(a) */
;
/* この部分が128KBに達する */ /* 発生条件(1) */
;
} else {
ans1 = 1;
}
}
-------------------------------------------------------------------------
sample2.c
------------------------------------------------------------------------
int ans2;
void
func2(int a)
{
switch (a) { /* 発生条件(2)(b) */
case 0:
;
/* この部分が128KBに達する */ /* 発生条件(1) */
;
break;
case 1:
ans2 = 2;
break;
}
}
------------------------------------------------------------------------
sample3.c
-------------------------------------------------------------------------
void
func3(int a)
{
while (--a) { /* 発生条件(2)(c) */
;
/* この部分が128KBに達する */ /* 発生条件(1) */
;
}
}
------------------------------------------------------------------------
3. 回避策
(1)当該実行文をelse側の実行文と入れ替える(if文の場合)
当該実行文がelse側の時は今回の問題は発生しないため、
判定式の意味を逆にし、真と偽の実行文を入れ替えてください。
変更の結果、真の実行文が空の場合は、この対策は効果がありませんので、
何らかの実行文を記述してください。
sample1.c の変更例
----------------------------------------------------------------------
int ans1;
void
func1(int a)
{
if (!a) { /* 判定文の意味を逆にする */
ans1 = 1; /* 実行文を入れ替え */
} else {
;
/* この部分が128KBに達する */ /* 実行文を入れ替え */
;
}
}
----------------------------------------------------------------------
(2)当該実行文を関数化する(どの制御文、繰り返し文でも有効)
当該実行文の一部または全部を、新規作成の関数に移動し、それを呼び出す
ように変更してください。
なお、新規作成した関数は、inline宣言をしないでください。
sample3.c の変更例
----------------------------------------------------------------------
void
sub_func3(void) /* 新規作成 */
{
;
/* この部分が128KBに達する */
;
}
void
func3(int a)
{
while (--a) {
sub_func3(); /* 新規作成の関数を呼び出し */
}
}
----------------------------------------------------------------------