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

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

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

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

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

Microsoft Word - no02.doc

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

数値計算

プログラミング実習I

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

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

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

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

プログラミング基礎

e-learning: C言語入門

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

ex05_2012.pptx

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

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

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

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

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

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

ex04_2012.ppt

プログラミング実習I

PowerPoint プレゼンテーション

Prog1_10th

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

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

情報処理Ⅰ演習

gengo1-11

スライド 1

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

gengo1-2

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

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

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

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

Microsoft PowerPoint - prog03.ppt

memo

sinfI2005_VBA.doc

PowerPoint プレゼンテーション

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

memo

プログラミング基礎

講習No.12

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

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

CプログラミングI

概要 プログラミング論 構造体 構造体 複数の変数を組合わせて, ひとまとめにしたもの 簡単 重要 自己参照型, リスト 重要, 難しい S-1 S-2 新しい構造体の宣言 struct 構造体名 { データ型メ

Slide 1

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

Microsoft PowerPoint pptx

Microsoft PowerPoint - 第1回目復習_pdf用.ppt [互換モード]

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

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

memo

Microsoft PowerPoint - 09.pptx

単体テスト設計のコツ

PowerPoint Presentation

C言語復習

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

スライド 1

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


Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

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

物質工学科 田中晋

Taro-ポインタ変数Ⅰ(公開版).j

Microsoft PowerPoint - prog03.ppt

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

プログラミングI第10回

演習1

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

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

演算増幅器

第2回講義:まとめ

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

JavaプログラミングⅠ

Microsoft PowerPoint ppt

program7app.ppt

P. 2 P. 4 P. 5 P. 6 P. 7 P. 9 P.10 P.12 P.13 P.14 P.14 P.15 P.17 P.18 P.20 P P P P P.25 P.27 P.28 Copyright 2016 JAPAN POST BA

P. 2 P. 4 P. 5 P. 6 P. 7 P. 9 P P.11 P.14 P.15 P.16 P.16 P.17 P.19 P.20 P.22 P P P P P P P P P

演算増幅器

PowerPoint プレゼンテーション

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

JavaプログラミングⅠ

Microsoft Word - no12.doc

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

Microsoft PowerPoint - ruby_instruction.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - C_Programming(3).pptx

ファイル入出力

講習No.8

2006年10月5日(木)実施

Java知識テスト問題

Microsoft PowerPoint - kougi7.ppt

PowerPoint プレゼンテーション

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

< F2D837C E95CF CF68A4A94C5816A2E6A>

Transcription:

201406-2 CubeSuite+ 版 RX ファミリ用 C/C++ コンパイラパッケージ V1 および High-performance Embedded Workshop 版 RX ファミリ用 C/C++ コンパイラパッケージ ご使用上のお願い CubeSuite+ 版 RX ファミリ用 C/C++ コンパイラパッケージ V1 および High-performance Embedded Workshop 版 RX ファミリ用 C/C++ コンパイラパッケージの使用上の注意事項をお知らせします volatile または evenaccess 修飾された構造体のメンバに関する注意事項 (RXC#026) リアルタイム OS のシステムコールの発行に関する注意事項 (RXC#027) 呼び出し後の処理が同一である関数呼び出しに関する注意事項 (RXC#028) & 演算子の使用に関する注意事項 (RXC#030) 注 : 各注意事項の後ろの番号は 注意事項の識別番号です 1. 該当製品およびバージョン - CubeSuite+ 版 RX ファミリ用 C/C++ コンパイラパッケージ V1 ( 型名 :PRX00CSP1-MWR) CC-RX コンパイラ V1.02.00 ~ V1.02.01 - High-performance Embedded Workshop 版 RX ファミリ用 C/C++ コンパイラ ( 型名 :PRX00CAS1-MWR) パッケージ V.1.00 Release 00 ~ V.1.02 Release 01 2. volatile または evenaccess 修飾された構造体のメンバに関する注意事項 (RXC#026) 2.1 内容関数の戻り値が volatile または evenaccess 修飾された構造体のメンバのポインタ または参照渡しの場合に volatile または evenaccess 修飾が無効になる場合があります 2.2 発生条件以下の条件をすべて満たす場合に発生します (1) 関数戻り値が 構造体ポインタ ( 注 1) または構造体の参照渡し ( 注 2) である (2) (1) の構造体に次のいずれかの修飾子が付加されている (a) volatile (b) evenaccess (3) (1) の関数呼出しに対して "." 演算子または "->" 演算子を使用し 構造体のメンバを参照している (4) (1) の関数呼び出しにインライン展開の最適化が適用される 注 1: C および C++ の場合に該当します 注 2: C++ の場合に該当します 問題が発生すると 発生条件 (3) の構造体のメンバ参照時に 発生条件 (2) の

修飾子の効果が無効になります その結果 無効になった修飾子を無視した 最適化により誤ったコードが生成されることがあります 発生例 : --------------- struct ST unsigned char PRT; ; volatile struct ST *st2f() /* 発生条件 (1) および (2) */ return (volatile struct ST*)0x2000; unsigned char func_st2(void) st2f()->prt = 0x10; /* 発生条件 (3) および (4) */ st2f()->prt = 0x11; /* 発生条件 (3) および (4) */ st2f()->prt = 0x22; /* 発生条件 (3) および (4) */ /* (NG-1) */ return st2f()->prt; /* 発生条件 (3) および (4) */ /* (NG-2) */ --------------- 発生例に対する出力コード : inline=100 有効時 --------------- MOV.L #00002000H,R5 MOV.B #10H,[R5] MOV.B #11H,[R5] MOV.B #33H,[R5] ; (NG-1) 読出しがない MOV.L #00000033H,R1 ; (NG-2) 読出しがない --------------- 2.3 回避策以下のいずれかの方法で回避してください (1) 関数の戻り値が構造体のアドレスの場合は 構造体へのポインタを経由してメンバを参照する (2) 構造体定義の際 メンバに volatile を修飾する (3) 次のいずれかの方法で 当該関数がインライン展開されないようにする (a) 当該関数に #pragma noinline を指定する なお 当該関数に #pragma inline 指定している場合は 同時にこの #pragma inline の指定をはずす (b) コンパイル時に -inline=0 を指定する 3. リアルタイム OS のシステムコールの発行に関する注意事項 (RXC#027) 3.1 内容関数の最後でリアルタイム OS ( 注 ) のシステムコールを発行すると システムコール復帰後にシステムコールを発行した関数の最後に RTS 命令が生成されていない場合があります 注 : 該当製品は以下の通りです - RI600V4 V1.03.00 以前

- RI600PX V1.02.00 以前 - RI600/4 V.1.01 Release 01 以前 - RI600/PX V1.00 Release 01 以前 3.2 発生条件以下の条件をすべて満たす場合に発生します (1) optimize=2 または optimize=max オプションを使用している (2) 関数の出口が以下のいずれかの制御文によって複数存在する ( 注 ) - if 文 - switch 文 - for 文 - while 文 (3) 関数の全ての出口の直前に関数呼び出しがある (4) (3) の関数呼び出しの少なくとも 1 つが #pragma oscall を指定した関数呼び出しである (5) (2) の関数に以下の #pragma を指定していない - #pragma interrupt - #pragma task - #pragma taskexception - #pragma almhandler - #pragma cychandler (6) (2) の関数の引数および自動変数に volatile 修飾子を付加したものがない (7) (2) の関数の引数および自動変数のアドレスを参照していない (8) (2) の関数内に setjmp() の呼び出しがない 注 : 制御文が 関数の出口の直前に 次のような形式で記述された場合 関数の出口へのたどり着き方が 2 つに分かれるため コンパイラでは 関数の出口は 2 つと判断します 条件 (2) で出口が複数とみなされる例 : ------------------------------------ void func(void)............ /* 関数の出口 */ if ( 条件式 )............ /* 関数の出口 */ return; ------------------------------------ 発生例 1: 誤ったコードになるケース #pragma oscall /s=0 5 tsk()

void tsk(void); void sub(void); void func() int b[1] = 0; if (a) sub(); /* 発生条件 (2) および (3) */ else tsk(); /* 発生条件 (2),(3) および (4) */ void dummy(void)a=10; 発生例 1 のコンパイル結果 : -optimize=2, -size および -output=src 指定時の例 _func: SUB #04H,R0 L10: MOV.L #L14,R5 MOV.L #_a,r4 MOV.L [R5],[R0] MOV.L [R4],R5 CMP #00H,R5 BEQ L12 L11: ADD #04H,R0 BRA _sub L12:.ASSERT 'tsk' >>..file@.mrc INT #05H ; RTS 命令が抜けている _dummy: MOV.L #_a,r4 MOV.L #0000000AH,[R4] RTS 発生例 2: アセンブル時にエラーになるケース #pragma oscall /s=0 5 tsk() void tsk(void); void sub(void); void func() int b[1] = 0; if (a) tsk(); /* 発生条件 (2) および (3) */ else sub(); /* 発生条件 (2),(3) および (4) */

発生例 2 に該当する場合 アセンブル時または -output=obj の オブジェクトファイルを生成するコンパイルを行うと 以下のアセンブルエラーが発生します A2111 (E) Symbol is undefined 発生例 2 のコンパイル結果 : -optimize=2, -size および -output=src 指定時の例 func:.assert 'tsk' >>..file@.mrc INT #05H BRA L13 ; 存在しないラベル (L13) を指定 L12: ADD #04H,R0 BRA _sub 3.3 回避策 以下のいずれかの方法で回避してください (1) optimzie=0 または optimize=1 を使用する (2) 該当する関数のいずれかの出口の直前に ダミーの命令となるコードを 挿入する 例 : 組込み関数 nop() 発生例 1 に対する回避策 (2) の適用例 : -------- #include /* 追加 : 組込み関数 nop() を有効にする */ #pragma oscall /s=0 5 tsk() void tsk(void); void sub(void); void func() int b[1] = 0; if (a) sub(); /* ここに nop() の呼び出しを追加しても回避可能 */ else tsk(); /* ここに nop() の呼び出しを追加しても回避可能 */ nop(); /* 追加 : nop() の呼び出し */ void dummy(void)a=10; -------- 発生例 2 に対する回避策 (2) の適用例 : -------- #include /* 追加 : 組込み関数 nop() を有効にする */ #pragma oscall /s=0 5 tsk()

void tsk(void); void sub(void); void func() int b[1] = 0; if (a) tsk(); /* ここに nop() の呼び出しを追加しても回避可能 */ else sub(); /* ここに nop() の呼び出しを追加しても回避可能 */ nop(); /* 追加 : nop() の呼び出し */ -------- 4. 呼び出し後の処理が同一である関数呼び出しに関する注意事項 (RXC#028) 4.1 内容呼び出し後の処理が同一である関数呼び出しが複数ある場合 リンク時最適化における関数の呼び出し先が正しくならずに 誤ったコードを生成する場合があります 4.2 発生条件以下の条件をすべて満たす場合に発生することがあります (1) コンパイル時のオプション指定が 以下のすべてを満たしている (a) -goptimize オプションを使用している (b) -optimize=2 (-optimize 指定がない場合を含む ) または -optimize=max を指定している (c) -speed オプションを使用している (d) -branch=32 を指定している (2) リンク時のオプション指定が 次のいずれかに該当する (a) -optimize=symbol_delete 以外の -optimize オプションの指定がある (b) -optimize または -nooptimize のどちらの指定もない (3) 関数内に同一関数の呼び出し ( 注 ) が複数ある (4) (3) のそれぞれの関数呼び出し直後から関数出口までの全経路で処理内容が同じである 注 : 実行時ルーチンの呼び出しも含みます 次の演算が それぞれのオプション指定でコンパイルされた場合に 実行時ルーチンの呼び出しに置き換わります 1. -nofpu または RX200 選択時の単精度浮動小数点型の演算 2. 倍精度浮動小数点型の演算 3. 64 ビット整数型の 加減算以外の演算 4. -nouse_div_inst 選択時の 32 ビット整数型および単精度浮動小数点型の除算および剰余算 問題が発生すると リンク時の最適化で用いる情報が異常となります

その結果 最適化処理により発生条件 (3) に該当する関数呼び出しの分岐先 アドレスで正しくないコードが生成されます 発生例 : コンパイル時オプションに -goptimize, -optimize=2, -speed および -branch=32 が指定されていて かつ リンク時オプションの -nooptimize または -optimize のどちらの指定もない場合 -------- void func(int b) if (b) a = sub(1); // 発生条件 (3) および (4) else a = sub(2); // 発生条件 (3) および (4) -------- 上記例の場合 リンク後に一つ目の sub(1) への呼び出しのアドレスが 自分自身に分岐して永久ループになる誤ったコードが生成されます 4.3 回避策以下のいずれかの方法で回避してください (1) コンパイル時に -goptimize オプションを指定しない (2) コンパイル時に次のいずれかのオプション指定をする (a) -optimize=0 または -opttimize=1 (b) -size (c) -branch=24 または -branch=16 (3) リンク時に次のオプションを指定する -nooptimize (4) 発生条件 (4) の経路のうちの一つに ダミーの命令を追加する 回避策 (4) の回避例 1: ダミーのグローバル変数の値を更新するコードを挿入する例 -------- int dummy; // ダミーのグローバル変数 void func(int b) if (b) a = sub(1); dummy = 0; // ダミーのグローバル変数に値を代入 else a = sub(2); -------- 回避策 (4) の回避例 2: 組込み関数 nop() を挿入する例

-------- #include // nop() を使用するために必要 void func(int b) if (b) a = sub(1); nop(); // 組み込み関数 nop() をダミーとして挿入 else a = sub(2); -------- 5. & 演算子の使用に関する注意事項 (RXC#030) 5.1 内容変数と定数値との & 演算子を用いたビット論理積演算 (& 演算 ) で誤った結果となる場合があります 5.2 発生条件以下の条件をすべて満たす場合に発生することがあります (1) コンパイル時に-optimize=2 (-optimize 指定がない場合を含む ) または -optimize=max を指定している (2) 1 または 2 バイト型変数への代入を行っている (3) (2) で代入する値は & 演算の結果である (4) (3) の & 演算の両オペランドは どちらも 8 バイト型ではない (5) (3) の & 演算の両オペランドのうち 一方は定数値である (6) (5) の定数値のうち (2) の代入先の変数内で有効になるビット列の中に 0 であるものが 1 ビットだけある ( 発生例の注 1 で該当する例を記載しています ) (7) (2) の代入後に 代入先変数をよりサイズの大きい型に拡張している (8) (3) の & 演算の定数値でないオペランドは (2) の代入先の型の範囲外の値となる可能性がある ( 発生例の注 2 で該当しない例を記載しています ) 発生例 : ---------------- unsigned long yyy; void func(unsigned long xxx) // 発生条件 (8)( 注 2) unsigned char aaa = xxx & 0x000000fe; // 発生条件 (2),(3),(4), // (5) および (6)( 注 1) yyy = aaa; // 発生条件 (7) ---------------- 上記の例では & 演算子による上位の 24 ビット分のマスクが行われないコードが生成されます このため 当該コードの実行時に xxx の値が 0x00000100 から 0xffffffff の範囲にある場合 本来生成されるべきコードと異なる結果となります

注 1: 発生条件 (6) に該当する例は次の通りです 代入先変数が 1 バイトの場合 : ------------ unsigned char a1 = xxx & 0x012345fe; // 下位 1 バイトは 1 ビットだけ 0 unsigned char a2 = xxx & 0x000000fb; // 下位 1 バイトは 1 ビットだけ 0 ------------ 代入先変数が 2 バイトの場合 : ------------ unsigned short a3 = xxx & 0x0123fffe; // 下位 2 バイトは 1 ビットだけ 0 ------------ 注 2: 発生条件 (8) に該当しない例を挙げます 下記例は 条件を満たす func 関数に対する実行コードには問題がありますが foo 関数から呼び出した場合に限り 誤った実行結果になることはありません ------------ unsigned long yyy; void func(unsigned long xxx) // 発生条件 (8) unsigned char aaa = xxx & 0x000000fe; // 発生条件 (2),(3),(4), // (5) および (6) yyy = aaa; // 発生条件 (7).................... unsigned char zzz; void foo(void) func(zzz); // zzz の値が代入先 aaa の範囲を超えることはないため // この呼び出しに限り 誤った結果にならない ------------ 5.3 回避策以下のいずれかの方法で回避してください (1) 発生条件 (2) の代入先変数を 4 バイト型に変更する (2) 発生条件 (2) の代入先変数を volatile 修飾する (3) コンパイル時に-optimize=0 または-optimize=1 オプションを指定する 回避策 (1) の回避例 : ---------------- unsigned long yyy; void func(unsigned long xxx) unsigned long aaa = xxx & 0x000000fe; // 4 バイト型に変更 yyy = aaa; ----------------

6. 恒久対策 CubeSuite+ 版 RX ファミリ用 C/C++ コンパイラパッケージ V1 および High-performance Embedded Workshop 版 RX ファミリ用 C/C++ コンパイラパッケージでの改修予定はありません 回避策を適用してください ご不明点は 以下の Web ページからお問い合わせください https://www8.hitachi.co.jp/inquiry/hitachi-ul/products/jp/form.jsp なお これら 4 件の注意事項は CubeSuite+ 版 RX ファミリ用 C/C++ コンパイラパッケージ V2 では改修済みです CubeSuite+ 版 RX ファミリ用 C/C++ コンパイラパッケージ V1 を使用されているお客様は V2 へのバージョンアップ ( 注 ) もご検討ください High-performance Embedded Workshop 版 RX ファミリ用 C/C++ コンパイラパッケージは V1 のみで V2 はありません High-performance Embedded Workshop 版を使用されているお客様は CubeSuite+ 版へ移行し コンパイラのバージョンを V1 から V2 へバージョンアップ ( 注 ) することもご検討ください 注 : 有償でのバージョンアップになります (c) Hitachi ULSI Systems Co., Ltd. 1995,2014. All rights reserved.