MESC TOOL NEWS:
MESCT-NC79WA-980901D
NC79WA V.3.00 Release 1
ご使用上のお願い
|
7900シリーズ用Cコンパイラ(アセンブラ・統合化開発環境付き)NC79WAをご使用される際の注意事項をご連絡致します。
-OS オプションのご使用にあたって
最適化オプション-OS を指定した場合に以下の誤ったコードを出力していました。
- 条件判断式の判断結果が偽の場合、分岐先のreturn文(または関数の末尾)に対するコード (rts命令等) が出力されません。
- 呼出し元の関数が管理している値に対して、その値がフレーム領域にある場合、正しい値を参照することができません。
発生条件
[条件1] 以下の条件を同時に満たす場合に発生する可能性があります。
- 最適化オプション-OSを指定している。
- 条件判断式の判断結果が偽の場合の分岐先がreturn文(または関数の末尾)である。
- 条件判断式の判断結果が真の場合にサブルーチン関数があり、その復帰直後がreturn文(または関数の末尾)である。
[条件2] 以下の条件を同時に満たす場合に発生する可能性があります。
- 最適化オプション-OSを指定している。
- サブルーチン関数が呼出し元のフレーム領域をアクセスする。
- サブルーチン関数からの復帰直後がreturn文(または関数の末尾)である。
発生例
- 発生条件1
[Cソースファイル]
-----------------------------------------------------------------------
unsigned int i, j, k;
void sub2(void);
void sub1(void)
{
if (i) {
if (j){ /* 分岐 1 */
sub2();
return;
}
/* 分岐 2 */
} else {
k = 0x01;
}
/* return */
}
-----------------------------------------------------------------------
[生成コード]
-----------------------------------------------------------------------
_sub1:
._line 7
;## # C_SRC : if (i){
lda A,DT+:_i
beq L2
._line 8
;## # C_SRC : if (j){ /* 分岐 1 */
lda A,DT+:_j
beq L4
._line 9
;## # C_SRC : sub2();
jmpl _sub2
L4:
; <=== rtl命令が出力されない
._line 13
;## # C_SRC : } else {
L2:
._line 14
;## # C_SRC : k = 0x01;
movm.W DT+:_k,#0001H
._line 17
;## # C_SRC : }
rtl
-----------------------------------------------------------------------
- 発生条件2
[Cソースファイル]
-----------------------------------------------------------------------
void jmpsub( unsigned int near *);
unsigned int out;
void main(void)
{
unsigned int near i = 1;
jmpsub( (unsigned int near *)&i);
return;
}
void jmpsub( unsigned int near *p)
{
unsigned int arr[10];
arr[1] = 0;
out = *p;
}
-----------------------------------------------------------------------
[生成コード]
-----------------------------------------------------------------------
_main:
phd 0
subs #0002H
tsd
._line 6
;## # C_SRC : unsigned int near i = 1;
movm.W DP0:1,#0001H ; i
._line 7
;## # C_SRC : jmpsub( (unsigned int near *)&i);
tda 0
inc A
adds #0002H
pld 0 <===フレームが開放されています
jmpl $jmpsub
;
:
(中略)
:
._line 12
;## # C_SRC : {
.DT __DT
.DP0 OFF
.glb $jmpsub
$jmpsub:
._line 16
;## # C_SRC : out = *p;
tax
lda A,DT+:0000H,X <===開放されたフレームを参照しています
sta A,DT+:_out
._line 17
;## # C_SRC : }
rtl
-----------------------------------------------------------------------
対処方法
最適化オプション-OSを指定する場合には、最適化抑止オプション「-Off=2583 」をあわせて指定していただきますようお願いいたします。
- コマンドライン入力の場合
C:\> nc79 -OS -Off=2583 sample.c
- TM 使用の場合
「 Environment 」→「 Project Setting 」→「 BUILD 」→「 C Compiler 」の「 Options... 」→「 Extra options 」で-Off=2583を追加指定してください。