SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Similar documents
RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Cコンパイラパッケージお知らせ

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

統合開発環境CS+ V へのリビジョンアップのお知らせ

統合開発環境CubeSuite+ V へのバージョンアップのお知らせ

統合開発環境CubeSuite+ V へのバージョンアップのお知らせ

Microsoft PowerPoint - CproNt02.ppt [互換モード]

統合開発環境 High-performance Embedded Workshop V へのリビジョンアップのお知らせ

untitled

Microsoft PowerPoint - 計算機言語 第7回.ppt

JavaプログラミングⅠ

【注意事項】RXファミリ 組み込み用TCP/IP M3S-T4-Tiny

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft PowerPoint - 13th.ppt [互換モード]

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

Microsoft PowerPoint - 13.ppt [互換モード]

Microsoft PowerPoint - 12.ppt [互換モード]

02: 変数と標準入出力

Microsoft PowerPoint - 09.pptx

02: 変数と標準入出力

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

プログラミング実習I

program7app.ppt

第3回 配列とリスト

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

Microsoft Word - Training10_プリプロセッサ.docx

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

【注意事項】RX Driver Package、 RXファミリ RTC モジュール Firmware Integration Technology

Prog1_10th

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

memo

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

Microsoft PowerPoint pptx

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft Word - no12.doc

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

gengo1-11

演算増幅器

CS+ RL78コンパイラ CC-RL V リリースノート

memo

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

memo

Microsoft PowerPoint - handout07.ppt [互換モード]

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

< F2D837C E95CF CF68A4A94C5816A2E6A>

Slide 1

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

DVIOUT

Microsoft PowerPoint - 11.pptx

プログラミングI第10回

PowerPoint プレゼンテーション

Prog1_15th

02: 変数と標準入出力

Microsoft PowerPoint - kougi9.ppt

RX開発環境移行ガイド V850からRXへの移行(コンパイラ編)(CA850/CX→CC-RX)

情報処理Ⅰ演習

Taro-リストⅢ(公開版).jtd

講習No.12

02: 変数と標準入出力

‚æ4›ñ

Taro-リストⅠ(公開版).jtd

数値計算

R2.7 ポインタの型に気を付ける R2.7.1 (1) ポインタ型は 他のポインタ型及び整数型と相互に変換してはならない ただし データへのポインタ型における void* 型との相互変換は除く (2) ポインタ型は 他のポインタ型 及びポインタ型のデータ幅未満の整数型と相互に変換してはならない た

02: 変数と標準入出力

プログラミング基礎

Microsoft PowerPoint - kougi11.ppt

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Microsoft Word - no02.doc

PowerPoint Presentation

C言語講座

PowerPoint プレゼンテーション

8 / 0 1 i++ i 1 i-- i C !!! C 2

Prog1_12th

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

Microsoft Word - Cプログラミング演習(7)

第2回

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

プログラミング基礎

Microsoft Word - Cプログラミング演習(12)

Microsoft PowerPoint pptx[読み取り専用]

Microsoft PowerPoint ppt

PowerPoint プレゼンテーション

AquesTalk Win Manual

プログラミング実習I

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

Microsoft Word - Cプログラミング演習(11)

Microsoft PowerPoint - 12.ppt [互換モード]

PowerPoint プレゼンテーション

第1回 プログラミング演習3 センサーアプリケーション

memo

RL78ファミリ用CコンパイラCC-RL プログラミングテクニック

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft Word - CHAP2.DOC

Microsoft PowerPoint pptx

Microsoft PowerPoint - lec10.ppt

2006年10月5日(木)実施

RL78開発環境移行ガイド RL78ファミリ間の移行 (コンパイラ編:コンパイラオプション・アセンブラオプション)(CA78K0R→CC-RL)

Transcription:

ツールニュース RENESAS TOOL NEWS 2014 年 02 月 01 日 : 140201/tn1 SuperH RISC engine ファミリ用 C/C++ コンパイラパッケージ V.7~V.9 ご使用上のお願い SuperH RISC engine ファミリ用 C/C++ コンパイラパッケージ V.7~V.9の使用上の注意事項 4 件を連絡します 同一ループ内の異なる配列要素に 同一の添え字を使用した場合の注意事項 (SHC-0090) 命令並び替えの最適化を実施し かつ組込関数を使用した場合の注意事項 (SHC-0091) 構造体または共用体型の関数内 static 変数を持つ関数がインライン展開された場合の注意事項 (SHC-0092) 標準ライブラリ関数 strcpy() を使用した場合の注意事項 (SHC-0093) 注 : 各注意事項の後ろの番号は 注意事項の識別番号です 1. 同一ループ内の異なる配列要素に 同一の添え字を使用した場合の注意事項 (SHC-0090) 1.1 該当バージョン V.7.0B ~ V.9.04 Release 01 1.2 内容同一ループ内の複数の配列要素に 同一の添え字を使用してアクセスした場合 誤った配列要素が参照されることがあります 1.3 発生条件以下の条件をすべて満たす場合に発生することがあります (1) -optimize=0 および -optimize=debug_only オプションを使用していない (2) ループ制御変数を持つループが存在する (3) (2) のループ内に配列要素 ( 注 1) へのアクセスが存在する (4) (2) のループ内に (3) の配列とは異なる配列の配列要素 ( 注 1) へのアクセスが存在する (5) (3) および (4) のそれぞれの配列要素へのアクセスは同じポインタ変数を介して行われる

(6) (3) および (4) の配列要素へのアクセスの際の添え字式 ( 注 2) は以下 (6-1) または (6-2) のいずれかを満たす (6-1) 同じ値の定数 ( 注 3) である (6-2) 以下の全てを満たす - (2) のループ制御変数の1 次式である - ループ制御変数と同じ型である - 更新時の増分値が同じである 注 1: 間接参照形式 (*(ary + index)) も含む 注 2: 間接参照形式 *(ary + index) において ary が配列変数名の場合 index の部分が添え字式である 注 3: 添え字式の値が結果として定数になる場合も含む 例 : int index = 0; ary[index]; 1.4 発生例 long S=0; void func(short *xxx, short *yyy) { long i, t1, t2; short *pt; for( i = 0 ; i < 2 ; ++i) { // 発生条件 (2) pt = xxx; // 発生条件 (3) t1 = pt[i]; // 発生条件 (5) および (6-2) pt = yyy; // 発生条件 (4) t2 = pt[i]; // 発生条件 (5) および (6-2) S += (t1 + t2); yyy[i] を誤ってxxx[i] とみなし Sにxxx[i]+xxx[i] が加算される 1.5 回避策以下のいずれかの方法で回避してください (1) -optimize=0 または -optimize=debug_only オプションを使用する (2) 以下のいずれかを volatile 修飾する - 発生条件 (2) のループ制御変数 - 発生条件 (3) の配列 - 発生条件 (4) の配列 - 発生条件 (5) のポインタ変数 (3) 発生条件 (6-2) に該当する場合 添え字式の一方を異なる型を持つループ制御変数の1 次式に変更する (4) 発生条件 (4) の配列要素へ 発生条件 (3) の配列要素へのアクセスに用いるポインタ変数とは別のポインタ変数を介してアクセスする (5) 発生条件 (3) または発生条件 (4) のいずれかの配列要素へ ポインタ変数を介さずにアクセスする

1.6 回避例回避策 (3) の場合の回避例 : long i, t1, t2; short *pt; unsigned long k; // 回避策 (3) for( i = 0, k = 0 ; i < 2 ; ++i, ++k) { // 回避策 (3) pt = xxx; t1 = pt[k]; // 回避策 (3) pt = yyy; t2 = pt[i]; S += (t1 + t2); 回避策 (4) の場合の回避例 : short *xxx, *yyy, *pt, *pt2; // 回避策 (4) pt = xxx; t1=pt[i]; pt2 = yyy; t2=pt2[i]; // 回避策 (4) 回避策 (5) の場合の回避例 : short *xxx,yyy[10], *pt; pt = xxx; t1=pt[i]; t2=yyy[i]; // 回避策 (5) 2. 命令並び替えの最適化を実施し かつ組込関数を使用した場合の注意事項 (SHC-0091) 2.1 該当バージョン V.9.03 Release 00 ~ V.9.04 Release 01 2.2 内容 命令並び替えの最適化を実施し かつ組込関数を使用している場合 当該組み込み関数の後で 正しい命令が生成されないことがあります 2.3 発生条件以下の条件をすべて満たす場合に発生することがあります (1) -cpu=sh2a または -cpu=sh2afpu オプションを使用している (2) -optimize=0 および -optimize=debug_only オプションを使用していない (3) -schedule=0 オプションを使用していない (4) 以下のいずれかの組み込み関数を使用している - bset() - bclr()

- bcopy() - bnotcopy() 2.4 発生例 -cpu=sh2aを使用した場合の発生例: #include void func() { volatile char a[100]; volatile char a100,a101,a102; a[55] = 0; a100 = 0; a101 = 0; bset((unsigned char *)(0xfffe3886),0); // 発生条件 (4) a102 = 0; 上記発生例のコンパイル結果 : MOV #100,R2 MOV #0,R1 ADD R15,R2 MOV.B R1,@(55:12,R15) MOV.B R1,@R2 ; a100に0を格納 MOV R1,R0 MOV.B R0,@(4,R2) ; a101に0を格納 MOVI20 #-116602,R2 ; H'FFFE3886 BSET.B #0,@(0,R2) MOV.B R0,@(8,R3) ; 誤ってR3が参照されるため ; a102に0が格納されない RTS ADD #112,R15 2.5 回避策以下のいずれかの方法で回避してください (1) -optimize=0 または -optimize=debug_only オプションを使用する (2) -schedule=0 オプションを使用する (3) 発生条件 (4) の組み込み関数を使用しない記述に変更する 2.6 回避例回避策 (3) の場合の回避例 1: bset()

修正前のソースコード bset(&a,0) 修正後のソースコード a =0x01; 回避策 (3) の場合の回避例 2: bclr() 修正前のソースコード bclr(&a,3) 修正後のソースコード a&=~(0x01 << 3); 回避策 (3) の場合の回避例 3: bcopy() 修正前のソースコード bcopy(&a,1,&b,2); 修正後のソースコード if (a & (0x01 << 1)) { b = (0x01 << 2); else { b &= ~(0x01 << 2); 回避策 (3) の場合の回避例 4: bnotcopy() 修正前のソースコード bnotcopy(&a,1,&b,2);

修正後のソースコード if (!(a & (0x01 << 1))) { b = (0x01 << 2); else { b &= ~(0x01 << 2); 3. 構造体または共用体型の関数内 static 変数を持つ関数がインライン展開された場合の注意事項 (SHC-0092) 3.1 該当バージョン V.7.0B ~ V.9.04 Release 01 3.2 内容 構造体または共用体型の関数内 static 変数を持つ関数が インライン展開 された場合に 変数の正しい値を参照できない場合があります 3.3 発生条件以下の条件をすべて満たす場合に発生することがあります (1) -optimize=0 または -optimize=debug_only オプションを使用していない (2) 構造体または共用体型の関数内 static 変数が定義された関数が存在する (3) (2) の構造体または共用体はポインタ型のメンバを持つ (4) (3) のポインタ型メンバは初期値を持ち かつその初期値は変数のアドレスである (5) (2) の関数内で (4) で初期値としてそのアドレスが参照される変数に対し 以下の2 種類のアクセス方法が混在する (5-1) 直接アクセス (5-2) (3) のポインタ型メンバを経由した間接アクセス (6) 以下のいずれかに該当し かつ (2) の関数が呼出元の関数内にインライン展開されている ( 注 1) (6-1) -inlineオプションを使用している (6-2) -speedオプションを使用し かつ-noinlineオプションを使用していない (6-3) (2) の関数に #pragma inlineを指定している (7) (2) の関数の定義が削除されていない ( 注 2) 注 1: インライン展開が実施されたかどうかは コンパイル結果のアセンブラソースで確認できます 注 2: コンパイラの最適化の影響で 関数の定義が削除されることがあります 関数の定義が削除されたかどうかは コンパイル結果のアセンブラソースで確認できます 3.4 発生例

#pragma inline (func) // 発生条件 (6-3) int xxx = 0; struct ST { int * ppp; // 発生条件 (3) ; int func(void) { static struct ST sss = { // 発生条件 (2) &xxx // 発生条件 (4) ; *(sss.ppp) = 1; // 発生条件 (5-2) return (xxx); // 発生条件 (5-1) int main(void) { return (func()); // 発生条件 (6) 上記発生例のコンパイル結果 : _main: MOV.L L12,R5 ; sss のアドレスを取得 MOV #1,R2 ; H'00000001 を準備 MOV.L L12+4,R4 ; xxx のアドレスを取得 MOV.L @R5,R1 ; sss.ppp の値を取得 MOV.L @R4,R0 ; 戻り値用レジスタ (R0) にxxxの値を格納 MOV.L R2,@R1 ; *(sss.ppp) に 1 を格納 RTS *(sss.ppp) に1 を格納する前のxxxの値が 戻り値としてR0に格納される 本来は *(sss.ppp) に1を代入した後のxxxの値を R0に格納 3.5 回避策以下のいずれかの方法で回避してください (1) -optimize=0 または -optimize=debug_only オプションを使用する (2) 発生条件 (3) のポインタ型メンバの値は 初期値ではなく 代入文で設定する (3) 発生条件 (5) の 2 種類のアクセス方法を いずれか一方に統一する (4) 発生条件 (2) の関数内で宣言された構造体または共用体型のstatic 変数をファイル内 static 変数に変更する (5) 以下のいずれかを実施し インライン展開を抑止する (5-1) 発生条件 (6-1) に該当する場合 -inlineを使用しない (5-2) 発生条件 (6-2) に該当する場合 -noinlineオプションを使用する

(5-3) 発生条件 (6-3) に該当する場合 #pragma inline 指定を削除する 3.6 回避例回避策 (2) の場合の回避例 : static struct ST sss; sss.ppp = &xxx; 回避策 (3) の場合の回避例 1: 直接アクセスに統一する場合 xxx = 1; return (xxx); 回避策 (3) の場合の回避例 2: ポインタ型を経由した間接アクセスに統一する場合 *(sss.ppp) = 1; return (*(sss.ppp)); 4. 標準ライブラリ関数 strcpy() を使用した場合の注意事項 (SHC-0093) 4.1 該当バージョン V.7.0B ~ V.9.04 Release 01 4.2 内容標準ライブラリ関数 strcpy() の第 1 引数に指定されたコピー先のメモリ領域と strcpy() の前後で使用している変数のメモリ領域が重なっている場合 その変数の値が正しく更新されないことがあります 4.3 発生条件以下の条件をすべて満たす場合に発生することがあります (1) -optimize=debug_only オプションを使用していない (2) -blockcopy=inline オプションを使用している ( 注 ) (3) 標準関数 strcpy() を呼び出している関数が存在する (4) (3) の関数内で strcpy() の呼び出しより前に値の代入があり かつstrcpy() 呼出しより後に参照される変数 構造体メンバ または共用体メンバのいずれかが存在する (5) (4) の変数 構造体メンバおよび共用体メンバの型は signed long long 型およびunsigned long long 型以外のスカラ型である (6) (3) の strcpy() 呼び出しの第 1 引数に指定されたコピー先のメモリ領域と (4) の変数 構造体メンバまたは共用体メンバが格納されたメモリ領域が重なっている

注 : -nospeed または speed オプションを使用している場合 -blockcopy=inline オプションがデフォルトで使用されます 4.4 発生例 #include union { char a[4]; int b; // 発生条件 (5) u; int c; void func(void) // 発生条件 (3) { u.b = 1; // 発生条件 (4) strcpy(u.a, "T"); // 発生条件 (3) および (6) c = u.b; // 発生条件 (4) 本来 変数 cには "T" が格納されるが 誤って strcpy() によって更新される前のu.bの値である1が格納される 上記発生例のコンパイル結果 : _func: MOV #1,R5 MOV.L L12+2,R1 MOV.L R5,@R1 ; u.bに1を代入 MOV.L L12+6,R6 MOV.W @R6,R7 MOV.L L12+2,R4 ; u MOV.L L12+10,R2 ; c MOV.W R7,@R4 ; strcpy(u.a, "T") によって u を更新 RTS MOV.L R5,@R2 ; 変数 cに 1 ( 更新前の u.b の値 ) を代入 4.5 回避策以下のいずれかの方法で回避してください (1) -optimize=debug_only オプションを使用する (2) -blockcopy=inline オプションを使用しない ( 注 ) (3) 発生条件 (4) の変数 構造体メンバまたは共用体メンバを以下のいずれかの方法で修正する (3-1) volatile 修飾する

(3-2) 長さ 1 の配列型に変更する 注 : -speed または -nospeed を使用している場合は デフォルトで -blockcopy=inline が有効になりますので -blockcopy=runtime オプションを使用してください 4.6 回避例回避策 (3-2) の場合の回避例 : union { char a[4]; int b[1]; u; 5. 恒久対策 4 件の問題はすべてSuperH RISC engine ファミリ C/C++ コンパイラパッケージ V.9.04 Release 02 で改修しました V.9.04 Release 02の詳細は RENESAS TOOL NEWS 資料番号 140201/tn2 をご参照ください 以下のURLで参照できます (2 月 4 日から公開予定 ) https://www.renesas.com/search/keywordsearch.html#genre=document&q=140201tn2 [ 免責事項 ] 過去のニュース内容は発行当時の情報をもとにしており 現時点では変更された情報や無効な情報が含まれている場合があります ニュース本文中のURLを予告なしに変更または中止することがありますので あらかじめご承知ください 2010-2016 Renesas Electronics Corporation. All rights reserved.