MAEC TOOL NEWS:
MAECT-CC32R-010616D
M32Rファミリ用クロスツールキットCC32Rの使用上の注意事項を連絡します。
- short型あるいはchar型のauto変数に対して誤ったデバッグ情報が出力され、デバッガで変数が正しく参照できない場合があります。
- 該当製品
CC32R V.1.00 Release 1 ~ V.3.00 Release 1
- 内容
発生条件を満たす変数がスタックに割り付けられる場合、デバッグ情報が正常に出力されず、デバッガで正常に変数を参照できなくなります。
なお、本問題はデバッグ情報に関してのみであり、生成される命令コードには問題ありません。
- 2.1 発生条件
- 同一関数内に以下の条件(1)~(4)を満たす変数と、条件(2)~(4)を満たす変数の合計が約10以上存在している。
- (1) short型もしくはchar型である (signed型/unsigned型の両方を含みます)。
- (2) 記憶クラスがautoである。
- (3) &演算子によるアドレスの参照を行っていない。
- (4) 次の(a)もしくは(b)に該当する。
- (a) register宣言されている。
- (b) その変数を含むソースファイルをコンパイルする際に "-O4" を含む最適化オプションを指定している。
- 2.2 確認方法
- スタックに割り付けられたauto変数は、C言語ソースマージユーティリティ (cmerge) が出力する[ASSIGN]情報で確認することができます。
スタックに割り付けられている場合は、
;[ASSIGN] 変数名 @(オフセット値,R15)
と表示されます。発生条件をすべて満たした変数が上記のように表示された場合、その変数はデバッガ上で正常に表示されなくなります。
- [参考]
レジスタに割り付けられている場合は、
;[ASSIGN] 変数名 レジスタ名
と表示されます。
- 2.3 発生例
- 変数v01~v12で条件(4)を有効にしているのは、以下のコマンド操作例において "-O4" オプション付きでコンパイルしているためです。
-----------------------------------------------------------------------
extern int func1(void);
extern int func2(int, int, int, int);
void foo( void )
{
char v01 = 0x1001; /* 条件(1)~(4) */
unsigned char v02 = 0x1002; /* 条件(1)~(4) */
short v03 = 0x1003; /* 条件(1)~(4) */
unsigned short v04 = 0x1074; /* 条件(1)~(4) */
int v05 = 0x1005; /* 条件(2)~(4) */
int v06 = 0x1006; /* 条件(2)~(4) */
int v07 = 0x1007; /* 条件(2)~(4) */
int v08 = 0x1008; /* 条件(2)~(4) */
int v09 = 0x1009; /* 条件(2)~(4) */
int v10 = 0x100a; /* 条件(2)~(4) */
int v11 = 0x100b; /* 条件(2)~(4) */
int v12 = 0x100c; /* 条件(2)~(4) */
if (func1() == 2) {
v01 = 0x2001;
v02 = 0x2002;
v03 = 0x2003;
v04 = 0x2004;
v05 = 0x2005;
v06 = 0x2006;
v07 = 0x2007;
v08 = 0x2008;
v09 = 0x2009;
v10 = 0x200a;
v11 = 0x200b;
v12 = 0x200c;
}
func2(v01, v02, v03, v04);
func2(v05, v06, v07, v08);
func2(v09, v10, v11, v12);
}
-----------------------------------------------------------------------
[CC32Rのコマンド操作例(%はプロンプトを表します)]
-----------------------------------------------------------------------
% cc32R -g -c -O4 test.c ... (条件(4)(b))
-----------------------------------------------------------------------
- 作成されたオブジェクトモジュール (test.mo) をリンクしてSYSROFのロードモジュールを作成し、PD32R等のデバッガに読み込ませて変数を参照した場合、変数v01~v04 の内容がデバッガで正常に表示されません。
- 回避策
- 発生条件に応じて次の回避策を (両方該当する場合は両方共) 行ってください。
- (1) 該当変数をregister宣言している場合 (発生条件(4)(a))
- -> register宣言を解除してください。
- (2) "-O4" を含む最適化オプションを指定している場合 (発生条件(4)(b))
- -> 該当する変数の宣言行の後に、&でアドレスを参照するコードを付加してください。
-----------------------------------------------------------------
short var_shalf = 0x1072; /* 該当する変数の宣言行 */
short *dummy_addr = &var_shalf; /* この1行を追加 */
-----------------------------------------------------------------
※追加した変数dummy_addrの代入式は、最適化により削除されます。
- 恒久対策
本内容は、次期バージョンアップ時に改修する予定です。