RENESAS TOOL NEWS 2005年11月16日 : RSO-SHC-051116D
SuperH RISC engineファミリ
C/C++コンパイラパッケージ V.9
ご使用上のお願い |
SuperH RISC engine ファミリ C/C++コンパイラパッケージ V.9の使用上の注意事項 2件を連絡します。
- スタック渡しの引数を持つ関数を呼び出した場合の注意事項(SHC-0050)
- 同じ構造体型または共用体型のメンバを複数持つ共用体を使用した場合の注意事項(SHC-0051)
- 該当製品
SuperH RISC engine ファミリ C/C++コンパイラパッケージ
V.9.00 Release 00 ~ V.9.00 Release 03
- 内容
| 2.1 |
|
スタック渡しの引数を持つ関数を呼び出した場合の注意事項(SHC-0050)
スタック渡しの引数を持つ関数を呼び出した後に割り込みが発生した場合に、割り込みルーチン先頭のスタックポインタの値が奇数になる場合があります。
発生条件:
以下の条件をすべて満たす場合に発生することがあります。
- optimize=1 を使用している。
- スタック渡しの引数を持つ関数呼び出しが存在する。
- 2項のスタック渡しの引数の合計サイズが124バイト以上252バイト以下である。
例:
----------------------------------------------
typedef struct {
char a[128];
} ST;
extern void f(ST fc);
ST a;
void func() {
f(a); // 発生条件2項および3項
}
----------------------------------------------
コンパイル結果:
----------------------------------------------
_func:
STS.L PR,@-R15
ADD #-128,R15
MOV.L L11,R2 ; _a
MOV.L L11+4,R6 ; __slow_mvn
MOV #-128,R0 ; H'FFFFFF80
MOV R15,R1
JSR @R6
EXTU.B R0,R0
MOV.L L11+8,R1 ; _f
JSR @R1
NOP
ADD #127,R15 ; スタックポインタの値が奇数になる
ADD #1,R15 ; この直前に割り込みが発生した場合、
; 割り込みルーチンの先頭のスタック
; ポインタの値が奇数になる
LDS.L @R15+,PR
RTS
NOP
----------------------------------------------
回避策: optimize=0を使用してください。
|
| 2.2 |
|
同じ構造体型または共用体型のメンバを複数持つ共用体を使用した場合の注意事項(SHC-0051)
同じ構造体型または共用体型のメンバを複数持つ共用体を使用した場合、共用体メンバの共用体先頭からのオフセット値が正しくない場合があります。
発生条件:
以下の条件をすべて満たす場合に発生することがあります。
- 共用体を使用している。
- 1項の共用体は構造体型または共用体型のメンバを持つ。
- 1項の共用体は2項のメンバとは別に2項のメンバと同じ構造体型または共用体型のメンバを持つ。
- 2項と3項のメンバの共用体先頭からのオフセット値が同じである。
- 2項と3項のメンバのうち、宣言順が2番目以降のメンバの参照もしくは定義を行っている。
例:
----------------------------------------------
typedef struct {
unsigned int x;
} ST;
typedef union { // 発生条件1項
struct {
unsigned char a;
ST s2[1]; // 発生条件2項および4項
} st1;
struct {
unsigned char c;
ST s3; // 発生条件3項および4項
} st2;
} UN;
void func() {
volatile int a=0;
UN u;
f(u.st2.s3.x); // 発生条件5項
}
----------------------------------------------
コンパイル結果:
----------------------------------------------
_func:
STS.L PR,@-R15
ADD #-12,R15
MOV.L L11+2,R2 ; _f
MOV.L @(4,R15),R4 ; MOV.L @(8,R15),R4が正しい
MOV #0,R3
JSR @R2
MOV.L R3,@R15
ADD #12,R15
LDS.L @R15+,PR
RTS
NOP
----------------------------------------------
| 回避策: |
同じメンバ名で別の名前の構造体型または共用体型を定義し、
該当する構造体型または共用体型メンバを別の名前の型で宣言してください。 |
例:
----------------------------------------------------------
typedef struct {
unsigned int x;
} ST;
typedef struct {
unsigned int x;
} ST1;
typedef union {
struct {
unsigned char a;
ST s2[1];
} st1;
struct {
unsigned char c;
ST1 s3;
} st2;
} UN;
---------------------------------------------------------- |
- 恒久対策
次期リビジョンアップで改修する予定です。(2006年1Q予定)