SuperH RISC engine C/C++ Compiler Simulator Package

 平成12年7月11日
日立ソフトウェアエンジニアリング株式会社
〒231-0015 横浜市中区尾上町6丁目81番地
TEL (045)681-2111(大代表)
SuperH RISC engine
C/C++ Compiler Simulator Package
(SHCSPAKWIN95−05−01−/C)
ソフトウェア添付資料
はじめに
今回納入致しますSuperH RISC engine C/C++ Compiler Simulator Package
(SHCSPAKWIN95-05-01-/C)について説明致します。
目 次
1.記録媒体 ------------------------------------------
1
2.インストール方法 ---------------------------------- 1
3.使用上の注意事項 ----------------------------------
2
4.システム作成上の注意事項 --------------------------
3
5.ソフトウェアマニュアル一覧 -------------------------
3
6.メモリ所要量及びディスク占有量 --------------------
3
7.標準ライブラリスタック使用量一覧 ------------------
3
8.追加機能およびアップデート内容 --------------------- 4
9.一時的制限事項 -------------------------------------
5
10.マニュアル正誤表 -----------------------------------
5
11.テクニカルサポート ---------------------------------
6
付録1-1 Ver.5.1Aのアップデート内容
付録1-2 Ver.5.1Bのアップデート内容
付録1-3 Ver.5.1Cのアップデート内容
付録2-1 C++ ソースレベルデバッガについての注意
付録2-2 制限事項について
付録2-3 使用上の注意事項
付録2-4 SuperH RISC engine シミュレータ・デバッガ 制限事項
All Rights Reserved, Copyright (C) 1992,1999,
Hitachi, Ltd.,
Hitachi Software Engineering Co., Ltd.,
Hitachi ULSI Systems Co., Ltd.
1.記録媒体
本パッケージはCD-ROM 1枚で提供します。
本CD−ROMにより、日立統合開発環境と、関連マニュアルを参照するためのソフトウェア
(Acrobat® Reader)をインストールすることができます。
Acrobat® Reader copyright © 1987-1999 Adobe Systems Incorporated. All rights reserved.
AdobeおよびAcrobatはアドビシステムズ社の商標で特定の法域で登録されています。
2.インストール方法
2.1 インストール
以下の手順でインストールを実行します。インストールは、実行中のアプリケーションをあらかじ
め終了させてから実行してください。
2.1.1 統合開発環境のインストール
(1) 統合開発環境のCD-ROMをCD-ROMドライブに挿入します。(以下、仮にDドライブとします)
(2) Windows®スタートメニューの[ファイル名を指定して実行...]をクリックします。
(3) CD-ROMのルートディレクトリにあるSETUP.EXEを[ファイル名を指定して実行]ダイアログボッ
クスで指定し(例D:¥setup.exe)、[OK]をクリックします。
(4) 画面に表示されるインストールの指示に従います。
統合開発環境のインストールの注意事項:
(1) 統合開発環境は半角英数字と半角下線のみからなるディレクトリパスにインストールしてく
ださい。特に、全角文字や空白のないディレクトリパスを使用してください。
(2) HEWをHitachi Integration Managerと同じディレクトリにインストールしないでください。
(3) 複数部数のライセンスをご購入の場合でも、Hitachi Embedded Workshopは各PCのドライブに
インストールしてください。ツールチェイン、ライブラリアンインタフェース、
Hitachi Debugging Interface、オンラインマニュアルはネットワークドライブにインストール
可能です。他のPCでインストールしたツールチェイン、ライブラリアンインタフェースを自分
のPCに登録する方法はHitachi Embedded Workshopユーザーズマニュアル5章「ツール管理」を
参照してください。
(4) HEWをインストールした直後に[Hitachi Embedded Workshop]がWindows® スタートメニューの
[プログラム]の中に表示されない場合はWindows®を再起動してください。
(5) Windows® 98でインストール中にインストーラが異常終了した場合、コンピュータを再起動し
てから再度インストールしてください。
2.1.2 Acrobat® Readerのインストール
(1) 統合開発環境のCD-ROMをCD-ROMドライブに挿入します。(以下、仮にDドライブとします)
(2) Windows®スタートメニューの[ファイル名を指定して実行...]をクリックします。
(3) CD-ROMの[PDF_Read¥Japanese]ディレクトリにあるAr40jpn.exe (日本語版)または
[PDF_Read¥English] ディレクトリにあるAr40eng.exe (英語版)を[ファイル名を指定して実行]
ダイアログボックスで指定し(例D:¥PDF_Read¥Japanese¥Ar40jpn.exe)、[OK]をクリックします。
(4) 画面に表示されるインストールの指示に従います。
2.2 プログラムの削除
インストールしたプログラムは以下の手順で削除します。削除は、実行中のアプリケーションをあ
らかじめ終了させてから実行してください。
2.2.1 統合開発環境の削除
- 1 -
(1)Windows®スタートメニューの[設定]の中にある[コントロールパネル]をクリックします。
(2) [アプリケーションの追加と削除]アイコンをダブルクリックします。
(3) [セットアップと削除]タブから[Hitachi Embedded Workshop]をクリックし、[追加と削除]ボ
タンをクリックします。
(4) 画面に表示される指示に従います。
2.2.2 Acrobat® Readerの削除
(1)Windows®スタートメニューの[設定]の中にある[コントロールパネル]をクリックします。
(2) [アプリケーションの追加と削除]アイコンをダブルクリックします。
(3) [セットアップと削除]タブから[Adobe Acrobat 4.0]をクリックし、[追加と削除]ボタンをク
リックします。
(4) 画面に表示される指示に従います。
2.3 プログラムの起動または終了
2.3.1 統合開発環境の起動と終了
・起動:Windows®スタートメニューの[プログラム]の中にある[Hitachi Embedded Workshop]メニ
ュー内の[Hitachi Embedded Workshop]をクリックします。
・終了:HEWの[File]メニューの[Exit]をクリックします。
2.3.2 オンラインマニュアルおよび添付資料の参照
・オンラインマニュアルをインストールした場合
Windows®スタートメニューの[プログラム]の中にある[Hitachi Embedded Workshop]メニュー内
のPDFファイルOnline Manuals [SuperH] –English(xx xx)(英語版)または
Online Manuals [SuperH] –Japanese(xx xx)(日本語版)をクリックします。(xx xxは、年月
のキーワードを表示しています)
(例 Online Manuals [SuperH] -Japanese(99 06))
・オンラインマニュアルをインストールしていない場合
(1) 統合開発環境のCD-ROMをCD-ROMドライブに挿入します。(ここでは、仮にDドライブとしま
す)
(2) Windows®スタートメニューの[ファイル名を指定して実行...]をクリックします。
(3) CD-ROMの[Manuals]ディレクトリにある,jSH_xxxx.PDF(日本語版)またはeSH_xxxx.PDF(英
語版)(xxxxは、年月のキーワードを表示しています)を[ファイル名を指定して実行]ダイ
アログボックスで指定し(例D:¥Manuals¥jSH_9906.PDF)、[OK]をクリックします。
3.使用上の注意事項
必要な機器構成は以下の通りです。
・ホストコンピュータ:IBM PC互換機、PC-9800シリーズ機
(CPU:日本語Windows®95、Windows®98またはWindowsNT®4.0が動作するもの)
・OS:日本語Windows®95、Windows®98またはWindowsNT®4.0
・ディスプレイ:SVGA以上
・I/O装置:CD-ROMドライブ
・その他:マウス等のポインティングデバイス
IBM PCは、米国IBM社により管理されている計算機の名称です。
PC-9800シリーズは、日本電気(株)により管理されている計算機の名称です。
Windows®、Windows®95、Windows®98およびWindowsNT®は、米国マイクロソフト社により管理されているオペレーティング
システムの名称です。
- 2 -
4.システム作成上の注意事項
(1)EC++ライブラリ使用時の注意事項
EC++ライブラリをリンクし、かつ、以下のヘッダファイルを1つでもインクルードする場合、
Complex,iomanip,iostream,mystrbuf,ostream,String,ios,istream,streambuf
ユーザプログラムにて次の初期化が必要です。
int ios::Init::init_cnt = 0;
その他については、ユーザーズマニュアルを参照ください。
5.ソフトウェアマニュアル一覧
以下にCD-ROMに添付しているマニュアルの一覧を示します。
表1 ソフトウェアマニュアル一覧
項番
資 料 名
型 名
1
Hitachi Embedded Workshop ユーザーズマニュアル
HS6400EWIW1SJ
2
SuperH RISC engine C/C++コンパイラ ユーザーズマニュアル
HS0700CLCS5SJ
3
SuperH RISC engine EC++クラスライブラリユーザーズマニュアル
HS0700CLCS5SJ
4
SuperH RISC engine アセンブラ ユーザーズマニュアル
HS0700ASCS4SJ
5
Hシリーズ リンケージエディタ、ライブラリアン、
HS6400LECU6SJ
オブジェクトコンバータ ユーザーズマニュアル
6
日立デバッギングインタフェース ユーザーズマニュアル
HS6400DIIW4SJ
7
SuperH RISC engine シミュレータ・デバッガ ユーザーズマニュアル
HS0700SDIW6SJ
8
Hitachi Embedded Workshop リリースノート、
HS6400EWIW1SJ-RN990930
チュートリアル、
HS6400EWIW1SJ-TU990601
Project Generatorマニュアル
HS6400EWIW1SJ-PG991008
9
SuperH RISC engine C/C++コンパイラ添付資料
HS0700CLCS5SJ000204
10
SuperH RISC engine シミュレータ・デバッガ注意事項
P0700WSD7-N1J
11
SuperH RISC engine シミュレータ・デバッガ ユーザーズマニュアル添付資料
P0700WSD7-S1J
12
SuperH RISC engine シミュレータ・デバッガ 協調検証対応説明書
P0700WSD7-C1J
上記の他に以下の資料を同梱しております。(本資料)
SuperH RISC engine C/C++ Compiler Simulator Package(SHCSPAKWIN95-05-01-/C) ソフトウェア添付資料
6.メモリ所要量及びディスク占有量
・メモリ容量:64MB以上を推奨
・ディスク容量:統合開発環境:空き容量100MB以上(フルインストールに必要な容量)
Acrobat® Reader:空き容量10MB以上
7.標準ライブラリスタック使用量一覧
「SuperH RISC engine C/C++コンパイラ 添付資料」を参照ください。
- 3 -
8.追加機能およびアップデート内容
8.1 Ver.5.1の追加機能
(1)SH3-DSPライブラリのサポート
従来のSH-DSP用に加えてSH3-DSPにも適用可能なライブラリをサポートしました。
(2) Embedded C++言語のサポート
組み込みシステムに適したC++仕様であるEmbedded C++の言語仕様とライブラリをサポートしま
した。
・bool型サポート
・多重継承の警告
・Embedded C++クラスライブラリのサポート
(3) モジュール間最適化機能のサポート
以下の最適化を実施してサイズ/スピードに優れたオブジェクトを生成します。
この最適化により約10%のサイズ削減、7∼8%の実行スピード向上を実現しました。
・無駄なレジスタ退避回復コードの削減
・参照しない変数/関数の削除
・共通コードをルーチン化
・関数呼び出しコードの最適化
(4) コンパイルスピードの向上
最適化処理の改善によるコンパイラスピードの高速化を実現しました。
最大2倍、平均130%のスピードアップを達成しました。
(5) 制限値の拡張
・コマンドライン長の制限を256から4096へ拡張しました。
・ファイル名長の制限を128から251へ拡張しました。
・文字列リテラル長の制限を512から32767へ拡張しました。
(6) 最適化強化
オブジェクト性能を向上させる各種最適化を強化しました。
(7) C++コメントのサポート
C言語でも「//」コメントの使用が可能になりました。
(8) 統合環境の変更(PC版)
従来のPCの統合環境HIM(Hitachi Integration Manager)に代わる新たな統合環境
HEW(Hitachi Embedded Workshop)を提供致します。
HIMと比較し以下機能を追加致しました。
・プロジェクトジェネレータ
各CPU毎に周辺I/O等を定義したヘッダファイルを自動生成します。
・バージョン管理ツールとの連動
市販のバージョン管理ツールとの連動インタフェースをサポートしました。
・階層プロジェクトのサポート
プロジェクト内に複数のサブプロジェクトを定義し、階層的に管理することが可能と
なりました。
・ネットワーク対応
- 4 -
WindowsNTのCSS環境下での開発が可能になりました。
なお、HIMプロジェクトからHEWプロジェクトへのコンバートツールを添付します。
8.2 Ver.5.1Aのアップデート内容
「付録1-1 Ver.5.1Aのアップデート内容」を参照ください。
8.3 Ver.5.1Bのアップデート内容
「付録1-2 Ver.5.1Bのアップデート内容」を参照ください。
8.4 Ver.5.1Cのアップデート内容
「付録1-3 Ver.5.1Cのアップデート内容」を参照ください。
9.一時的制限事項
以下の付録を参照ください。
「付録2-1 C++ ソースレベルデバッガについての注意」
「付録2-2 制限事項について」
「付録2-3 使用上の注意事項」
「付録2-4 SuperH RISC engine シミュレータ・デバッガ 制限事項」(PC版)
10.マニュアル正誤表
「SuperH RISC engine C/C++コンパイラ 添付資料」を参照ください。
- 5 -
11.テクニカルサポート
弊社テクニカルサポートのご利用方法について説明いたします。
弊社テクニカルサポートはFAXおよびフリーダイヤルにてご利用いただくことができます。FAX
は次のページ以降に添付してあるサポート依頼書をコピーしてご利用ください。送付いただいた依頼事
項について、後ほど弊社担当より回答をさしあげます。
【受付時間】
受付日 : 月曜日 ∼ 金曜日 (ただし祝日を除く)
受付時間: 10:00 ∼ 17:00
【問合せ先】
第2応用システム部 第1グループ
SHCコンパイラ テクニカルサポート係
FAX 045−681−2401
フリーダイヤル 0120−78−7750
もしくは
第3品質保証部 第2品質保証課
SHCコンパイラ テクニカルサポート係
FAX 045−451−5158
なお、E−mailによるお問い合わせの受け付け、ホームページによる情報の提供も行っておりま
す。ご利用ください。
【E−mailによるお問い合わせ】
FAXの場合と同様に必要事項を明記の上、下記アドレスへお問い合わせください。
[email protected]
【SHCコンパイラホームページ】
下記アドレスにてSHCコンパイラに関する情報提供を行っております。
http://www.hitachi-sk.co.jp/Products/SH-C/HomePage.html
- 6 -
サポート依頼書
製品型名
P−
バージョン
SHCSPAK (リリース媒体のラベルに表示されている:P-xxxx-xxxxxx)
(リリース媒体のラベルに表示されている:SHCSPAKxxxxx-xx-xx)
シリアルNo
(リリース媒体のラベルに表示されている:Serial Number)
使用機種名
使用OS
バージョン
(フ リ ガ ナ)
御登録社
(者)名
所属部名
FAX番号
電話番号
(内線 弊社記入欄(記入しないでください。)
受付番号
分 類
担 当 者
- 7 -
)
現 象
(入力ソース、指定オプション、コンパイル結果、実行結果を詳細に記述)
−以上−
- 8 -
付録1-1
Ver.5.1Aのアップデート内容
各ツールのバージョンは、下表の通りです。
は変更ツールを示しています。
表 1 ツールバージョン一覧
Windows版
SPARC版/HP版
C/C++コンパイラ
5.1A
5.1A
アセンブラ
4.2B
4.2A
モジュール間最適化ツール
1.1A
1.1A
リンケージエディタ
6.0E
6.0D
ライブラリアン
2.0C
2.0A
オブジェクトコンバータ
2.0A
2.0
HDI
4.05
シミュレータ
7.00
HEW
1.0A
- 1 -
3.0
<C/C++コンパイラ (Ver. 5.1 -> Ver. 5.1A)>
以下の不具合を修正しました。
1.Cソース記述時の不正現象
1.1 switch文不正
(1) 内容
switch 文の case ラベルへの分岐で不当なアドレス(対象となる case ラベルではなく他の文)へ
分岐する。
またはコンパイル時に "4925 (F) Internal error" を出力する。
【例】
switch (条件式){
/* ここから switch 文本体 */
case 1:
:
default:
:
}
/* switch 文本体終わり */
/* switch 文の本体部分のコードサイズが 32k byte 程度以上ある */
(2) 発生条件
(a) CPU に SH1 以外を指定。
(b) switch 文がテーブル方式でオブジェクト展開される。
(c) その switch 文の本体が大きく、オブジェクトコードのサイズが32K byte程度以上ある。
1.2 代入演算式不正
(1) 内容
以下のソースで式が削除されオブジェクト不正になる。
【例】
int f(int x)
{
x│= (x<<=2);
return x; }
(2) 発生条件
(a) 同一式内で同一変数が複数ある。
(b) 同一式内で同一変数に対して代入が複数ある。
(c) -op=1(最適化あり)でコンパイルする。
(d) 演算子が -=, /=, %=, │=, &=, ^=のいずれかである。
以上を全て満たす場合発生する可能性がある。
1.3 ループ文不正
(1) 内容
以下のソースで式が削除されオブジェクト不正になる。
【例】
extern long array[];
- 2 -
static void sfunc(void)
{
long i, p;
for (i=0; i<1; i++){
p=array[i];
if (p<0){ continue;
gfunc(p);
}
}
}
(2) 発生条件
(a) ループ内にcontinue文がある。
(b) ループ内に帰納変数削除最適化対象の配列(arrayの添字はループカウンタiを使用しており、
最適化の対象)がある。
(c) ループカウンタ(i)が最適化により削除される。
(d) ループ文がdo-while形式に最適化される(必ず1回ループ本体を実行する)。
(e) -speed, -loopオプションを指定しない。
以上を全て満たす場合発生する可能性がある。
1.4 memcpyライブラリ不正
(1) 内容
ライブラリ関数memcpyの動作が不正になる。
【例】
#include <string.h>
short a[32769], b[32769];
main()
{ memcpy(a,b, 65538);}
(2) 発生条件
(a) memcpyのコピー元およびコピー先の先頭アドレス, コピーサイズが全て偶数である。
ただし、全てが4の倍数の場合は除く。
(b) コピーサイズが 65536以上。
以上を全て満たす場合発生する。
1.5 数学関数ライブラリ不正
(1) 内容
SH4/SH3Eにおいて、下記の数学関数の値が不正になる。
(a) tan(3π/4)の値が -0.0になる。正しくは-1.0。
(b) atanの入力が大きな値(>1.0e+7f)のとき結果が不正になる。
(c) atan2(y,x)のy/x>1.0e+7fのとき結果が不正になる。
(d) sin/cosの入力が大きな値(>1.0e+7f)のとき結果が-1∼1の範囲外の値になる。
- 3 -
2.C++ソース記述時の不正現象
2.1 コンストラクタの不正コール
(1) 内容
2段以上の基底クラスをもつ仮想基底クラス(下記例のC3)が存在するとき、
2段目以降の基底クラス(下記例のC1)のコンストラクタを不正に2回コールする場合がある。
【例】
int c1, c2, c3, c4;
struct C1 { C1()
{ c1++;} };
struct C2 : C1 { C2()
{ c2++;} };
struct C3 : C2 { C3()
{ c3++;} };
struct C4 : virtual C3 { C4()
C4 c;
{ c4++;} };
// c1 が2となる。 [誤り]← // c1は1が正しい。
(2) 発生条件
(a) 仮想基底クラスが存在する。
(b) 仮想基底クラスは2段以上の基底クラスをもち,かつ,それらは仮想基底ではない。
以上を全て満たす場合発生する。
2.2 コピーコンストラクタコール不正
(1) 内容
ユーザ定義のコピーコンストラクタが不正にコールされない場合がある。
【例】
int x;
struct C {
C(int i);
C(const C& cr) { x++; }
};
int f(C cc) {
return 1; }
main()
{
f(1);
}
// ユーザ定義のコピーコンストラクタを
// コールしていない (x==0のまま)[誤り]
(2) 発生条件
(a) ユーザ定義のコピーコンストラクタを持つクラスがある。
(b) 関数引数で,暗黙の型変換により(a)のクラスに変換する。
以上を全て満たす場合発生する。
2.3 デストラクタの不正コール
(1) 内容
case文に一時オブジェクトを生成する関数コールが存在するとき、当該case文を実行しないにも関
わらず、不正にデストラクタをコールする場合がある。
- 4 -
【例】
struct A {
A(const char*);
A();
};
void set_A(const A&);
void test()
{
switch (x) {
case 1:
set_A("ABC");
break;
default:
break;
// ここでA:: A()をコール[誤り]
}
}
(2) 発生条件
(a) case文の処理に一時オブジェクトを生成する関数コールが存在し、一時オブジェクトはデスト
ラクタを持つ。
(b) (a)の処理はブロックで囲まれていない。
(c) (a)でないcase文の処理を実行する。
以上を全て満たす場合発生する。
2.4 仮想関数テーブル設定不正 (1) 内容
仮想関数を持つクラスオブジェクトを{}で初期化すると、仮想関数テーブルの設定が正しく行なわ
れない場合がある。
【例】
struct C0 { virtual void f(); };
struct C1 :
C0 {
void f();
C1(int) {}
};
C1 c1A[] = { 0 };
void test()
{
C1* cp = &c1A[0];
cp->f();
// 仮想関数表の設定がなく実行時エラー [誤り]
}
- 5 -
(2) 発生条件
(a) 仮想関数を持つクラスを定義する。
(b) (a)のクラスを{ }で初期化する。
以上を全て満たす場合発生する。
2.5 EC++クラス
(1) 内容
stringクラスのEC++クラスライブラリをリンクすると、
"string::_ec2p_getmem(const char*, unsigned long, char, bool)"
がないというエラーが出力される。
(2) 発生条件
(a) bool型を持つEC++クラスライブラリをコールする。
- 6 -
<リンケージエディタ (Ver. 6.0D -> Ver. 6.0E)>
<モジュール間最適化ツール (Ver. 1.1 -> Ver. 1.1A)>
以下の不具合を修正しました。
1.不正エラー302
(1) 内容
Windows版で不正にエラー302(CANNOT OPEN FILE:ファイル名)が出力される場合がある。
(2) 発生条件
本不具合はWindows版で発生する場合がある。UNIX版では発生しません。
2.不正エラー306
(1) 内容
306(ILLEGAL FILE FORMAT)を出力または、OSへエラーリターンを返して終了する。
(2) 発生条件
ELF/DWARF出力指定で optlnkshを起動する場合、発生する場合がある。
- 7 -
<Hitachi Embedded Workshop (Ver. 1.0 -> Ver. 1.0A)>
1.オプション一貫性のチェックからDEBUGオプションのチェック削除
HEWは[Build->Build]または[Build->Build All]を選択したとき、
フェーズ間のオプション一貫性
をチェックします。コンパイラのフェーズでDEBUGオプションが選択されているが、アセンブラのフ
ェーズで選択されていない場合、HEW Ver.1.0では、次のウォーニングメッセージをOutputウィンド
ウのBuildタブに表示します。
Options inconsistent between phases SH C/C++ Compiler and SH Assembler
しかし、HEW Ver. 1.0AからDEBUGオプションのフェーズ間の一貫性のチェックを廃止しました。フ
ェーズのオプションの代表として任意の一つのファイルのオプションをサンプリングしますがファ
イルによってDEBUGオプション有り無しが異なることがあります。そのため必ずしもフェーズを代表
するオプションをサンプリングできるとは限らないからです。
2.C/C++ソースファイル拡張子の解釈変更
HEW Ver. 1.0ではcp、ccの拡張子をC source fileファイルグループに追加してもコンパイラは
C++言語ソースファイルとしてコンパイルしました。これは、コンパイラがcpp、cp、ccの拡張子を
C++言語ソースファイルの拡張子と解釈するためです。
また、cpp、cp、ccではない拡張子をC++ source fileファイルグループに追加してもHEW Ver. 1.
0ではコンパイラはC言語ソースファイルとしてコンパイルしました。これは、コンパイラがcpp、cp、
ccではない拡張子をC言語ソースファイルの拡張子と解釈するためです。
しかし、HEW 1.0AではC++ source fileファイルグループに属する拡張子を持つファイルをコンパ
イルするときにはLANG=CPPオプション、C source fileファイルグループに属する拡張子を持つファ
イルをコンパイルするときにはLANG=Cオプションを付加するため、
HEWのファイルグループとコンパ
イラの解釈が一致します。
3.SH C/C++ CompilerオプションダイアログボックスSH-DSP, SH-3DSP追加
SH C/C++ CompilerのオプションダイアログのCPUタブにあるCPU種別のドロップダウンリストに
SH-DSPとSH-3DSPを追加しました。C/C++ソースファイル中にDSP命令のアセンブリコードをインライ
ン記述した場合はCPUタブのCPUドロップダウンリストから SH-DSPまたはSH-3DSPを選択してくださ
い。
4.プロジェクトジェネレータのC++対応、および、空プロジェクトの生成
HEW Ver. 1.0Aでmain関数のファイルなどをC++ソースファイルとして生成できるようにしました。
また、HEW Ver. 1.0Aでプロジェクトタイプとして、"Empty Application"を追加しました。
"Empty Application"を選択すると、ソースファイルの無いプロジェクトを作成します。
既存のソースファイルがあるのでスタートアップコードが不要な場合、"Empty Application"でプロ
ジェクトを作成してから既存のソースファイルを追加してください。
その他、HEW 1.0 Release 9で発生した不具合を修正しています。
- 8 -
<Hitachi Debugging Interface (Ver. 4.00 -> Ver. 4.05)>
<SuperH RISC engineシミュレータ・デバッガ (Ver. 6.01 -> Ver. 7.00)>
以下の機能を追加及び不具合を修正しました。
1.SH7065対応
サポートCPUにSH7065を追加しました。
2.SH-4シミュレーション速度高速化
シミュレーション機能を一部制限することでシミュレーション速度を向上させたSH-4シミュレー
タ・デバッガをサポートしました。また、従来と同じ高機能版SH-4シミュレータ・デバッガもサポー
トしています。
3.協調検証のサポート
SH7065、SH-3DSP、SH-4ではSynopsys社のEagleと接続し、協調検証をサポートします。
4.Disassemblyウィンドウ
Disassemblyウィンドウのスクロールバーを動かすと表示が不正になる場合があるという不具合を
修正しました。
5.Watch、Local、Stack Traceウィンドウ
同一ユニット内で複数のセクションを作成し、それぞのアドレスを不連続にした場合、Watch、
Local、Stack Traceウィンドウの表示が不正になるという不具合を修正しました。
6.ビットフィールド表示
リトルエンディアン時にビットフィールド表示が不正になるという不具合を修正しました。
- 9 -
<SuperH
RISC engineシミュレータ・デバッガ
(Ver. 2.0 -> Ver. 3.0)>
以下の機能を追加及び不具合を修正しました。
1.SH-3DSP、SH-DSPwithCache対応
サポートCPUにSH-3DSP、SH-DSPwithCacheを追加しました。
2.トレースバッファ容量の拡張
トレースバッファー容量を最大32768レコードに拡張しました。
トレースバッファサイズは1024、4096、16384、32768サイクルから選択できます。
3.キャッシュ容量の拡張(SH-3およびSH-3Eのみ)
SH-3およびSH-3Eはキャッシュ容量を2KB、4KB、8KBから選択できます。
4.STATUSコマンド
STATUSコマンドでキャッシュヒット回数とミスヒット回数を表示します。
5.SH3Eシミュレータの制限解除
BSR命令の前命令が下記命令の場合にレジスタに不正な値が設定される不具合を修正しました。
LDS Rm,FPUL
LDS Rm,FPSCR
LDS.L @Rm+,FPUL
LDS.L @Rm+,FPSCR
FMOV @Rm,FRn
FMOV @Rm+,FRn
FMOV @(R0,Rm),FRn
【例】
FMOV @R0,FR9
BSR label
FR9に不正な値が設定されます。
6.SH4シミュレータの制限解除
BSR命令の前命令が下記命令の場合にシミュレーションが無限ループになってしまう不具合を修正
しました。
MOV.B R0,@(disp,GBR)
MOV.W R0,@(disp,GBR)
MOV.L R0,@(disp,GBR)
MOV.B @(disp,GBR),R0
MOV.W @(disp,GBR),R0
MOV.L @(disp,GBR),R0
- 10 -
【例】
MOV.L @(H'0004,GBR),R0
BSR label
Labelへ分岐後無限ループになってしまいます。
- 11 -
付録1-2
Ver.5.1Bのアップデート内容
各ツールのバージョンは、下表の通りです。
は変更ツールを示しています。
表 1 ツールバージョン一覧
Windows版
SPARC版/HP版
C/C++コンパイラ
5.1B
5.1B
アセンブラ
4.2B
4.2A
モジュール間最適化ツール
1.1B
1.1B
リンケージエディタ
6.0E
6.0D
ライブラリアン
2.0C
2.0A
オブジェクトコンバータ
2.0A
2.0
HDI
4.05
シミュレータ
7.01
HEW
1.1
- 1 -
3.10
<C/C++コンパイラ (Ver. 5.1A -> Ver. 5.1B)>
以下の不具合を修正しました。
1.Cソース記述時の不正現象
1.1 -speedオプションで右シフト演算のコード効率が悪いケースがある
(1) 内容
-speedオプション指定時、右シフト演算の展開コードに効率悪いケースがある。
【例】
unsigned short a,b;
void test(void)
{
a=b>>8;
}
(2) 発生条件
(a) Cソースで右シフト演算を使用。
(b) -speed オプションを指定かつCPU にSH1,SH2またはSH2Eを指定。
(c) 右シフト演算子のオペランドがunsigned char型あるいはunsigned short型
でシフト幅が8から28。または、右シフト演算子のオペランドがsigned型で
シフト幅が16から28。
1.2 -case=tableオプションの指定が無効になるケースがある
(1) 内容
-case=tableオプションで switch文のcaseラベルのコード出力方式をcase
ジャンプテーブル展開するよう指定したにもかかわらずif文展開する場合がある。
【例】
int f(int x)
{
switch(x){
case 0: return x;
}
}
(2) 発生条件
(a) -case=tableオプションを指定。
(b) switch文のcaseラベルが、
最大caseラベル値 − 最小caseラベル値 + 1 < caseラベル数 × 3
の関係にある。
1.3 ループ内後置++式不正
(1) 内容
以下のソースでループ内で最適化によって作成された後置++式がオブジェクト
不正になる。
- 2 -
【例】
#define WIN_MAX 6
static int win_pos[WIN_MAX][2];
#pragma global_register(a=R8,b=R9,c=R10,d=R11,e=R12,f=R13,g=R14)
int a,b,c,d,e,f,g;
void func()
{
int i,wn,wdn=0,x,y;
int win_disp[WIN_MAX];
for (i=0 ; i<WIN_MAX ; i++) {
if (win_pos[i][0] == x && win_pos[i][1] == y ) {
win_disp[i] = 1 ;
wdn++ ;
}
else
win_disp[i] = 0 ;
}
}
(2) 発生条件
(a) ループ内に最適化によって後置++式が作成される。
(上記例では、win_pos[i]が後置++式に変換される)
(b) (a)の式が一つの式内で参照される。
(上記例では、(win_pos[i][0] == x && win_pos[i][1] == y) )
以上を全て満たす場合発生する可能性がある。
1.4 ライブラリヘッダのHUGE_VALの名前不一致
(1) 内容
ヘッダファイルmath.hとstdlib.hで宣言されているHUGE_VALの名前が
一致しない。
stdlib.h 内で宣言している名前を下記の通り変更しました。
誤: extern const double HUGE_VAL;
正: extern const double _HUGE_VAL;
1.5 数学関数cos(x)の収束値の変更
(1) 内容
数学関数cos, cosfに十分に大きな値(>1.0e+7f)が入力されたときの結果の値を
0から1に変更しました
- 3 -
2.C++ソース記述時の不正現象
2.1 return文のあるデストラクタコール不具合
(1) 内容
デストラクタを持ったクラスメンバを持つクラスがあり、そのクラスのデスト
ラクタで明示的にreturn文を記述するとデストラクタがコールされない場合が
ある。
【例】
extern "C" int printf(const char*, ...);
struct CTestMember{
CTestMember() {printf("CTestMember:: CTestMember¥n"); }
};
struct CTest{
CTestMember ctm;
CTest() { if (1) return; }
};
main()
{
CTest test;
}
(2) 発生条件
(a) デストラクタを持つクラスがある。
(b) (a)のクラスをメンバに持つクラスがデストラクタを持つ。
(C) (b)のクラスのデストラクタが明示的にreturn文を持つ。
以上を全て満たす場合発生する場合がある。
2.2 不当なエラーを表示する不具合
(1) 内容
メンバへのポインタをstaticデータメンバとして宣言し、その初期値として
同じクラスのprivateメンバを指定すると不当にエラーを表示する。
【例】
class A{
public:
typedef int(A::*MF)(void);
private:
static MF na;
int func(void);
};
A::MF A::na = &A::func;
// エラー6292を不正に出力
(2) 発生条件
(a) メンバへのポインタ型をstaticデータメンバとして宣言する。
- 4 -
(b) (a)のデータメンバをそのクラスのprivateメンバで初期化する。
以上を全て満たす場合エラーを出力する。
2.3 メンバ関数の初期化でインターナルエラー
(1) 内容
メンバ関数内で構造体の集合体形式{}による初期化またはstatic変数の
初期化を行う場合で、初期値にメンバ関数の属するクラスのメンバを指定
するとインターナルエラーが出力される。
【例】
struct A {
void* p;
};
struct B{
void f();
char a[5];
};
void B::f()
{
A xx = {a};
// インターナルエラー
}
(2) 発生条件
(a) メンバ関数で構造体の集合体形式{}で初期化を行う。または、
static変数の初期化を行う。
(b) (a)の初期値にメンバ関数の属するクラスのメンバを指定する。
以上を全て満たす場合発生する。
- 5 -
<モジュール間最適化ツール (Ver. 1.1A -> Ver. 1.1B)>
以下の不具合を修正しました。
1.HDIシミュレータロード時のオブジェクトフォーマットエラー
(1) 内容
デバッグ情報付きでコンパイルおよび、最適化リンカ(optlnksh)で生成した
ロードモジュールをHDIシミュレータにロードするとオブジェクトフォー
マットエラーになる場合がある。
(2) 発生条件
(a) デバッグ情報付きでコンパイルおよびデバッグ情報付きでoptlnkshを
起動する。
(b) 同一ファイル内にアドレス順に連続した関数が2つ以上削除される。
以上を全て満たす場合発生する可能性があります。
2.最適化リンク時間が極端に長い
(1) 内容
optlnkshのリンク時間が極端に長くなる不具合に対して、一部処理を見直し
対策を実施しました。
- 6 -
<Hitachi Embedded Workshop (Ver. 1.0A -> Ver. 1.1)>
1.メイクファイルの生成と実行
HEW Ver.1.1では、[Build - Generate Makefile]メニューにより、DOSプロンプト
上でビルド実行可能なメイクファイルを生成します。詳しくは、Hitachi Embedded
Workshop ユーザーズマニュアル「4章 ビルドの応用」ならびに、「付録D. HMAKE
ユーザガイド」を参照してください。
2.プロジェクトのロードとアンロード
HEW Ver.1.1では、ワークスペース内で複数のプロジェクトを利用している場合、
ワークスペースオープン時はカレントプロジェクトのみロードされ参照可能に
なります。他のプロジェクトを参照する場合は、ワークスペースウィンドウ上
で該当するプロジェクトを選択し、マウス右ボタンでポップアップメニューの
[Load Project]を指定することで参照可能になります。
また、参照不要となったプロジェクトは、同様の操作でポップアップメニュー
[Unload Project]を指定することで、HEW上の管理から一時的に開放されます。
(メモリの節約になります)
3.ワークスペース名、プロジェクト名の変更
HEW Ver.1.1では、ワークスペースウィンドウ上で、ワークスペースまたは、
プロジェクトを選択してマウス右ボタンでポップアップメニューの[Properties]
を指定すると、プロパティダイアログボックスが表示します。このダイアログ
ボックス上で、ワークスペースまたは、プロジェクト(カレントの場合のみ)の
名称変更が可能です。
4.ツールバーボタンの追加
HEW Ver.1.1では、新たに次の3種類のツールバーが追加されました。
(1) Searchツールバー
文字列検索で使うボタンを追加しました。
(2) Templateツールバー
テンプレートの定義や挿入で使うボタンを追加しました。
(3) Bookmarkツールバー
ブックマーク指定・解除や、他のブックマークへの移動で使うボタンを
追加しました。
5.複数プロジェクトビルド時のコンフィグレーション選択
HEW Ver.1.1では、カレントプロジェクトが依存プロジェクトを持っている場合、
ビルド実行時、依存プロジェクトはカレントプロジェクトと同名のコンフィグ
レーションでビルドします。依存プロジェクトに同名のコンフィグレーション
がない場合は、依存プロジェクトで最後に使ったコンフィグレーションでの
ビルドになります。
- 7 -
6.カスタムビルドフェーズでのシステム環境変数使用
HEW Ver.1.1では、カスタムビルドフェーズ実行時、環境変数としてシステム
で定義された環境変数を引継ぎます。カスタムビルドフェーズとシステムで
同名の環境変数が定義されている場合は、カスタムビルドフェーズの定義が
優先されます。
7.SH-DSPまたはSH-3DSPプロジェクト生成時のDSPライブラリ指定誤り
HEW 1.0xでは、SH-DSPまたはSH-3DSPプロジェクトを生成時、設定した
オプションに関係なく、DSPライブラリとして"shdsplib.lib"を指定して
いました。この場合、プログラム実行時に設定したオプションと異なる動作
をする可能性がありました。
HEW Ver.1.1では、オプション設定に合わせたDSPライブラリが指定されます。
8.SH7052Fプロジェクトデータの追加他
HEW Ver.1.1では、新たに SH7052F用のプロジェクト生成を追加しました。
また、SH7729用のベクタテーブルの改善(割込み要因H'70、H'D0の対応)
等を実施しました。
9.インクルードファイル検索エラー抑止オプション
HEW Ver.1.1では、ファイルの依存関係チェック時、インクルードファイル
の検索エラーを抑止するオプションを追加しました。
[Options - SH C/C++ Compiler]メニューおよび、[Options - SH Assembler]
メニューの Otherタブで "Skip dependency scan of nonexistent file" を
チェックすると依存関係チェック時の検索エラーを抑止します。
条件付きのコンパイルやアセンブルを実行する上で、未使用のインクルード
ファイルの記述がある場合に有効です。
- 8 -
<SuperH
RISC engineシミュレータ・デバッガ
(Ver. 7.00 -> Ver. 7.01)>
以下の不具合を修正しました。
1.レジスタ競合不具合の修正(SH3DSPシミュレータ)
下記命令が連続した場合、STS命令により書き換わる前のR5の値をMOVS命令
で使用してしまう不具合を修正しました。
STS A0,R5
MOVS @R5,A0
本不具合はMOVS命令以外にMOVX、MOVY命令でも発生しました。
2.リピート中の命令フェッチ不具合の修正(SH3DSPシミュレータ)
下記条件のリピートループ最終命令実行時のアドレスが不正になる不具合を
修正しました。
(1)4命令以上のリピートループ
(2)リピートループの最終命令の3命令前がPMULS、PLDS命令を含む
3.ソースプログラムにC/C++が混在しているプログラムのLocalsウィンドウ表示
Localsウィンドウ表示が、Cで記述された関数からC++で記述された関数
(またはその逆)に切り替わる時にアプリケーションエラーが発生する
不具合を修正しました。
- 9 -
<SuperH
RISC engineシミュレータ・デバッガ
(Ver. 3.00 -> Ver. 3.10)>
以下の不具合を修正しました。
1.レジスタ競合不具合の修正(SH3DSPシミュレータ)
下記命令が連続した場合、STS命令により書き換わる前のR5の値をMOVS命令
で使用してしまう不具合を修正しました。
STS A0,R5
MOVS @R5,A0
本不具合はMOVS命令以外にMOVX、MOVY命令でも発生しました。
2.リピート中の命令フェッチ不具合の修正(SH3DSPシミュレータ)
下記条件のリピートループ最終命令実行時のアドレスが不正になる不具合を
修正しました。
(1)4命令以上のリピートループ
(2)リピートループの最終命令の3命令前がPMULS、PLDS命令を含む
- 10 -
付録1-3
Ver.5.1Cのアップデート内容
各ツールのバージョンは、下表の通りです。
は変更ツールを示しています。
表 1 ツールバージョン一覧
Windows版
SPARC版/HP版
C/C++コンパイラ
5.1C
5.1C
アセンブラ
4.2B
4.2A
モジュール間最適化ツール
1.1B
1.1B
リンケージエディタ
6.0E
6.0D
ライブラリアン
2.0C
2.0A
オブジェクトコンバータ
2.0A
2.0
HDI
4.05
シミュレータ
7.01
HEW
1.1A
- 1 -
3.10
<C/C++コンパイラ (Ver. 5.1B -> Ver. 5.1C)>
以下の不具合を修正しました。
1.Cソース記述時の不正現象
1.1 スタックアクセス不具合対策
(1) 内容
-optimize=1オプションでスタックへのアクセスが不正になる場合があるという不具合を
対策しました。
(2) 発生条件
(a) 関数呼び出しの実引数に構造体/共用体を使用している。
(b) (a)の関数呼び出しを含む式の基本ブロック(分岐のない連続した式の最小単位)が大きい。
(c) (b)の範囲内で関数呼び出しの実引数設定コード(SPレジスタのプッシュコード)以降に
共通式があり、共通コードの統合最適化が適用される。
(d) (c)の共通コードのなかで、ローカル変数(スタックにアクセス)を参照している。
上記の条件を全て満たす場合、発生する可能性があります。
【例】
struct A {
int a;
int b;
int c;
};
struct A
Ax, Ay;
int f(struct A, struct A);
void g()
{
int x, y, *px, *py;
...
...
// 式1
if ( f(Ax, Ay) == 1){
// 式2
*px = (x<< EXP1) + EXP2;
// 式3
*py = (y<< EXP1) + EXP2;
// 式4
return 0;
}
...
}
式2 が条件(a)に対応します。
式1,式2が条件(b)に対応します。
式3,式4が条件(c)に対応します。
式3,式4のx,yが条件(d)に対応します。
- 2 -
<Hitachi Embedded Workshop (Ver. 1.1 -> Ver. 1.1A)>
以下の不具合を修正しました。
1.HIMプロジェクトのオプション変換不正の対応
HEW Ver.1.1では、HIMプロジェクトをHIMTOHEW.EXEで変換後オープンすると、
最適化リンカ等のオプションデータが欠落してしまいましたが、
HEW Ver1.1Aで対応しました。
2.ファイル依存関係チェック不正の対応
HEW Ver1.1では、ネストしたインクルードファイルが複数存在する場合、
正しい依存関係を検索できませんでしたが、HEW Ver1.1Aで対策しました。
3.バージョン管理システム設定ワークスペースのオープン処理不正の対応
HEW Ver1.1では、複数プロジェクトを持つワークスペースで、バージョン管理
システムを設定していると、オープンできなくなりましたが、HEW Ver1.1Aで対応しました。
4.プロジェクトジェネレータ生成データの修正
SH7707、SH7709、SH7709Aの割込み要因レジスタのアドレスを修正しました。
- 3 -
付録2-1
C++ ソースレベルデバッガについての注意
同梱のシミュレータデバッガにつきましては、 C++ 言語のソースレベルデバッグ可能
です。
別売のエミュレータにつきましては、C++ 言語のソースレベルデバッグは、デバイス、
エミュレータの組み合わせによってサポートされていない場合があります。日立製エミュ
レータについて、平成 11 年 10 月現在の対応状況の可否を下記に示します。
また、3rdParty 製エミュレータに関する C++ 言語サポートの可否は、各エミュレータ
メーカにお問い合わせください。
表1 C++ ソースレベルデバッグ可否状況
型 番
対応エミュレータ
SH7020,21,32,34
E7000
SH7604
E7000
SH7011,14,16,17
E7000
SH7040,41,42,43,44,45 E7000
SH7050,51
E7000
SH-DSP SH7410,7612
E8000/E10A
SH7065
E8000
SH-2E
SH7055
E8000
SH-3
SH7702,08
E7000
SH7707,08R,08S
E7000ROM-EML
SH7709
E7000ROM-EML
SH7709A
E8000*2
SH3-DSP SH7729
E8000/E10A*2
SH-3E
SH7718R
E7000
SH-4
SH7750
E10A
CPU コア
SH-1
SH-2
PC EWS
×
○
×
○
×*3
○
*3
×
○
×*3
○
○
×*1
○
×
○
×
×
○
×
○
×
×
○
×
○
×
×
○
○
×
*1:SH7410,SH7612 用 E8000 は、EWS で C++ サポートしております。
*2:SH7709A 用 エミュレータは、SH7729 用と同じになります。
*3:PC 上の C++サポートは E6000 で予定しており、現在開発中です。
*4:デバイスによっては、開発中のエミュレータもありますのでご了承ください。
表2 エミュレータの C++ ソースレベルデバッグ可否状況
E7000
E8000
E6000
E10A
ホスト
*1
EWS
○
△
×
−
*2
PC
×
○
○
○
*1:SH7410 及び SH7612 のみ EWS 対応しております。
*2:PC 版 E7000 で C++ のサポート予定はありません。
―以上―
‐ 1 ‐
付録2-2
制限事項について
この度は、弊社製品をお買い上げいただきありがとうございます。
同封しておりますスクロソフトウェアは、使用する CPU により一部機能に制限事項が、
ございます。下記をご参照の上、ご使用下さい。
記
1. ソフトウェアのバージョン
C コンパイラ
アセンブラ
Ver.5.1C
Ver.4.2B(Windows®版)
Ver.4.2A(UNIX 版)
Ver.7.01(Windows®版)
シミュレータ・デバッガ
Ver.3.10(UNIX 版)
2. 制限事項
CPU コア
SH-1
SH-2
SH-DSP
SH-2E
SH-3
SH-3DSP
SH-3E
SH-4
製 品
SH7020,21
SH7032,34
SH7604
SH7011
SH7014,16,17
SH7040,41,42,43,44,45
SH7050,51
SH7410
SH7612
SH7065
SH7055
SH7702
SH7707,08,09
SH7709A
SH7729
SH7718
SH7750
DSP ライブラリサポート
CPU シミュレーション
−
−
−
−
−
−
−
○
○
○
−
−
−
−
○
−
−
○
○
○
○
○
○
○
○
○ *1
○
○ *1
○
○
○
○ *1
○
○ *1
○:対応、×:非対応
*1:UNIX 版は非対応
-1-
キャッシュシミュレーシ
ョン
−
−
×
−
×
×
−
−
○ *1
ー
×
×
○
○
○
○
○ *1
付録2-3
使用上の注意事項
SuperH RISC engine C/C++コンパイラ V5.1C では以下の制限事項があります。
注意してご使用ください。
1. float 型積和演算のオブジェクト不正
【現象】
以下 C ソースを-cpu=sh4,-op=0 でコンパイルすると不正なオブジェクトが生成される。
【例】 (オプション -cpu=sh4,-op=0)
void ShcNG(float* op,float dp,float tbl) {
float sum;
sum = dp * tbl;
sum += dp * tbl;
*op = sum;
}
【出力コード】 (アセンブリソースイメージ)
4: sum = dp * tbl;
MOV
#4,R0
FMOV.S
@(R0,R15),FR3
MOV
#8,R0
FMOV.S
@(R0,R15),FR2
FMUL
FR3,FR2
FMOV.S
FR2,@R15
<-- 変数 sum と FR2 が同一値関係となる。
5: sum += dp * tbl;
FMOV.S
FR3,FR0
MOV
#8,R0
FMOV.S
@(R0,R15),FR1
FMOV.S
@R15,FR3
FMAC
FR0,FR1,FR3
<-- 積和演算の結果が FR3 に載る。
FMOV.S
FR3,@R15
<-- 変数 sum の値が書き変わる。
6: *op = sum;
MOV.L
@(12,R15),R3
FMOV.S
FR2,@R3
<-- 変数 sum の参照を行う時、FR2 をそのまま使用している。
5 行目の積和演算で sum の値は書き変わっているので、
4 行目で割付いたレジスタ FR2 はそのまま使用できない。
- 1 -
【発生条件】
以下条件を全て満たす時、発生します。
1. -cpu=sh4/sh3e 指定時
2. float 型積和演算あり。その式の形式は、a+=b*c(複合代入)である。
3. 2.の積和演算の前に、変数 a への設定式がある。
4. 2.の積和演算の後に、変数 a の参照式がある。
【回避方法】
以下のいずれかの方法で回避してください。
1. -cpu=sh3 以下のオプションを指定する。
2. float 型積和演算式(a+=b*c)を乗算の部分と和算の部分に分割して行う。
【影響システム】
SHC コンパイラ V4.0 以降
2. -cpu=sh4 指定時のコード不正
【現象】
以下 C ソースを、-cpu=sh4,-fpu=single でコンパイルすると、オブジェクト不正となる。
【例】
typedef struct {
float f1;
float f2;
} tagSample;
static tagSample Sample;
float Foo1(void *pv, int offset) {
return 0.0f;
}
float Foo2(void *pv) {
float f;
f = -Foo1(pv, 0) + (Sample.f1 * 60) * (Sample.f2 - 0.5f);
return f;
}
- 2 -
【オブジェクト】
00000004
_Foo2:
;function: Foo2
;frame size=4
00000004 4F22
STS.L
PR,@-R15
00000006 BFFB
BSR
_Foo1
00000008 E500
MOV
#0,R5
0000000A D308
MOV.L
L244+6,R3
0000000C C706
MOVA
L244+2,R0
0000000E F308
FMOV.S
@R0,FR3
00000010 C708
MOVA
L244+14,R0
00000012 F238
FMOV.S
@R3,FR2
00000014 D206
MOV.L
L244+10,R2 ;L232
00000016 F230
FADD
FR3,FR2
00000018 F04D
FNEG
FR0
0000001A F128
FMOV.S
@R2,FR1
0000001C 4F26
LDS.L
@R15+,PR
0000001E F008
FMOV.S
@R0,FR0
00000020 F122
FMUL
FR2,FR1
00000022 000B
RTS
00000024 F01E
FMAC
00000026
;H'00000004+L232
;-Fool(pw,0)を FR0 に設定
;FR0 の値を破壊
FR0,FR1,FR0
L244:
00000026 00000002
RES.W 1
00000028 BF000000
.DATA.L
H'BF000000
0000002C <00000004>
.DATA.L
H'00000004+L232
00000030 <00000000>
.DATA.L
L232
00000034 42700000
.DATA.L
H'42700000
【発生条件】
以下条件を全て満たす時、発生します。
1. -cpu=sh4 指定時、かつ、FMAC 展開対象となる式がある。
2. FMAC 対象式の各オペランド評価時、FR0 が固定で割り付けられるオペランド以外で FR0 が割り
付けられた時。
3. 上記 1.2.を満たし、かつ、FR0 のデスティネーション先の候補として、FR1∼FR3 が不可で FR0
のみ OK の状態になっている時。
【回避方法】
FMAC 対象式を以下のように分割して記述してください。
【変更前】
f = -Foo1(pv, 0) + (Sample.f1 * 60) * (Sample.f2 - 0.5f);
- 3 -
【変更後】
f = -Foo1(pv, 0);
f += (Sample.f1 * 60) * (Sample.f2 - 0.5f);
【影響システム】
SHC/C++コンパイラ V5.1 以降
3. ライブラリ関数 div,ldiv 関数の MAC レジスタ破壊
【現象】
標準ライブラリ関数 div および ldiv において、MAC レジスタを退避せずに使用しているため、値を破
壊している。
【発生条件】
以下条件を全て満たす時、発生します。
1. 標準ライブラリ関数 div または ldiv を使用している。
2. SH1 以外を使用している。
3. -mac=0 オプションは使用していない(デフォルトは-mac=1)
。
4. 1.の関数呼び出しより上位側のルーチンにアセンブリソースでルーチンを記述している。
5. 4.の関数で、1.へ至る関数呼び出しをまたいで MAC レジスタを使用している。
6. 4.から 1.に至る関数呼び出し上に、MAC レジスタを退避/回復する関数が1つもない。
(各関数内で MUL または MAC 命令を使っていない)
【回避方法】
ライブラリ関数 div および ldiv は SH1 用のものを使用してください。
【影響システム】
SHC/C++コンパイラ V5.1 以降
4. sinf(2π×7/4)で結果不正
【現象】
sinf(2π×7/4)の結果が-1 となるべきところ 0 となる。
【発生条件】
以下条件のいずれかを満たす時、発生します。
1. -cpu=sh4 で、sin(),cos()のパラメタが>π/4 の倍数に近いとき。
2. -cpu={sh2e│sh3e│sh4}で、sinf(),cosf()のパラメタがπ/4 の倍数に近いとき。
- 4 -
【回避方法】
こちら(*)からライブラリアップデートプログラムをダウンロードして、lib ディレクトリに置き実行
してください。*:http://www.hitachi-sk.co.jp/Products/SH-C/Documents/shcv51/shcv5lib.exe
UNIX 版をご使用なさっている場合は、PC 上にライブラリ一式を転送し、読み取り専用の属性をはずし
て本プログラムを実行してください。
【影響システム】
SHC/C++コンパイラ V5.1A 以降
5. ビットフィールドメンバに対する複合剰余演算子のオブジェクト不正
【現象】
以下 C ソースで、最適化無しでコンパイルすると、ビットフィールドメンバに対する複合剰余演算がオ
ブジェクト不正になる。
【例】
#include <stdio.h>
#define CH(a,b)(a==b) ? printf("ok (%d,%d)¥n",a,b) : printf("ng (%d,%d)¥n",a,b);
void main()
{
struct tag {
unsigned int b1:7;
unsigned int b2:7;
signed int b3:7;
signed int b4:7;
} s = {3,4,5,6};
int x = 3;
s.b3 %= 2;
CH(s.b4,0);
}
【オブジェクト】
;File bug.c ,Line 11
;expression statement
MOV
R15,R2
ADD
#4,R2
MOV.W
L286,R1
;H'0E07
MOV.L
L286+8,R3
;__bfxls
- 5 -
JSR
@R3
NOP
MOV.L
@R2,R0
;不要な転送命令が出ているため s.b3 の値を破壊している
CMP/PZ R0
BF
L282
AND
#1,R0
BRA
L283
NOP
L282:
NOT
R0,R0
ADD
#1,R0
AND
#1,R0
NOT
R0,R0
ADD
#1,R0
MOV.W
L286,R1
;H'0E07
MOV.L
L286+12,R3
;__bfsls
JSR
@R3
L283:
NOP
【発生条件】
以下条件を全て満たす時、発生します。
1. 最適化無し(-op=0)でコンパイルする。
2. 複合剰余演算子があり、左辺は signed のビットフィールドメンバ、右辺は 2n(< 127)の定数で
ある。
【回避方法】
複合剰余演算を、OP1 %= OP2 -> OP1 = OP1 % OP2 に変更してください。
【影響システム】
SHC/C++コンパイラ V5.1 以降
6. ループ判定式のオブジェクト不正
【現象】
以下 C ソースをコンパイルするとループ判定式の置き換えを行い、オブジェクト不正になる。
【例】
unsigned int x;
- 6 -
int func()
{
int i;
for (i = 15; i >= 0; --i) {
x = (((i * 16) + 15) << 24);
}
return (x);
}
↓
unsigned int x;
int func()
{
int i;
for (T1 = 0xff000000; T1 >= 0x0f000000; ) {
x = T1;
T1 = T1 + 0xf0000000;
/* 初期値は signed 型なのでオーバフローする */
}
return (x);
}
【発生条件】
以下条件を全て満たす時、発生します。
1. 帰納変数削除対象のループがある。
2. 1.の帰納変数がポストインクリメント/デクリメント化しない。
3. 帰納変数の初期値がオーバーフローしている。
4. 基本帰納変数が signed 型である。
【回避方法】
以下のいずれかの方法で回避してください。
1. 非最適化オプションでコンパイルする。
2. 定数を unsigned 型に cast する。
【影響システム】
SHC コンパイラ V3.0∼V3.0G および V5.1 以降
- 7 -
7. static メンバをもつクラス内メンバの境界調整数不正
【現象】
以下の例で、A::a の境界調整が不正に 1 になる。
【例】
class A {
static char c;
// 非 static メンバ l より前に記述
static A a[1];
long l;
};
char A::c;
A A::a[1];
// 境界調整が 1 になる(正しくは 4)
【発生条件】
以下条件を全て満たす時、発生します。
1. char 型の static クラスメンバが 1 番目に存在する。
2. 1.の次に自分自身と同じクラス型を持つ static クラスメンバを宣言する。
3. 2.の次に 1.とは境界調整が増える方向で異なるクラスメンバを宣言する。
【回避方法】
char 型の static クラスメンバを先頭に記述しないでください。
【影響システム】
SHC/C++コンパイラ V5.1 以降
8. 仮想関数呼び出し時の this ポインタ不正
【現象】
以下の例で、仮想関数の呼び出し時の this ポインタのオフセットが不正になる。
【例】
#include <stdio.h>
class A {
public:
virtual void f() = 0;
};
- 8 -
class B : public A {
public:
int b;
void f() {printf("b = %d¥n", b);}
B(int ii = 0) : b(ii) { }
};
class C1 : public B {
public:
C1(int ii = 0) : B(ii) { }
};
class C2 : public B {
public:
C2(int ii = 0) : B(ii) { }
};
class D : public C1, public C2 {
public:
D() : C1(1), C2(2) { }
};
D dd;
main()
{
C2* cp = &dd;
cp->f();
}
// b = 1 となってしまう
// this ポインタが C2 でなく C1 を指している
【発生条件】
以下条件を全て満たす時、発生します。
1. 3 段の単一継承をもつクラス(A - B - C1, A - B - C2)を多重継承で持つ(クラス D)。
2. 最基底クラス A の仮想関数 f を宣言、次派生クラス B に同仮想関数 f を持つ。
3. クラス B の仮想関数 f でクラス B のメンバにアクセスする。
4. D から 2 番目の多重継承クラス C2 のポインタを抽出して仮想関数 f をコールする。
*C2 の this ポインタが正しく得られない。
- 9 -
【回避方法】
コールしている仮想関数を持つクラスの派生クラスに同一名の仮想関数を用意して、そこから規定の仮
想関数をコールする処理を追加してください。上記の例に対する回避方法例を示します。
【例】
class C2 : public B {
public:
C2(int ii = 0) : B(ii) { }
virtual void f() {B::f();}
// 追加。中で目的のクラスメンバをコールする。
};
【影響システム】
SHC/C++コンパイラ V5.1 以降
9. ││の右辺の一時オブジェクトに対するデストラクタコール不正
【現象】
論理和演算の右辺に一時オブジェクトを利用する式を記述した場合、右辺側の評価の有無に関わらず、
右辺の一時オブジェクトに対するデストラクタをコールしてしまう。
【例】
#include <stdio.h>
class A {
public:
A(){printf("A::A()¥n");}
A(){printf("A:: A()¥n");}
int size(){return 1;}
};
extern A k();
void f(int n, int ch)
{
if(1 ││ k.size() > 0) {
// 論理和の左辺が真なので右辺は実行されない
}
// ここで A の一時オブジェクトのデストラクタをコールしてしまう
}
- 10 -
【発生条件】
論理和演算の右辺に一時オブジェクトを利用する式を記述したときに発生します。
【回避方法】
一時オブジェクトを生成する式を論理演算式の右辺には記述しないでください。必ず評価される左辺ま
たは論理式の前に記述してください。
【影響システム】
SHC/C++コンパイラ V5.1 以降
10. 基底クラスの関数メンバへのポインタ初期設定時の内部エラー(4099)
【現象】
以下をコンパイルすると、内部エラー(4099)となる。
【例】
class parent {
public:
void parent_func();
};
typedef void (parent::*class_func_ptr)();
class child : public parent {
void child_func();
};
class_func_ptr func_ptr = (class_func_ptr)&child::child_func;
【発生条件】
以下条件を全て満たす時、発生します。
1. 派生クラスの関数メンバへのポインタ定数を、基底クラスの関数メンバへのポインタに初期設定
する。
2. 初期値には派生型から基底型へ変換するキャストを入れる。
【回避方法】
型の合うメンバへのポインタ変数に一時代入して、変数を初期値として利用してください。
【例】
void (child::*temp)() = &child::child_func;
- 11 -
class_func_ptr func_ptr = (class_func_ptr)temp;
【影響システム】
SHC/C++コンパイラ V5.1 以降
11. リンク時の 3110 エラー(内部エラー 849 または 909)
【現象】
optlnksh 使用時、内部エラー 849(最適化有り時)または(最適化無し時)が発生する。
【発生条件】
rom オプションで指定されたセクションの rom 側セクションと ram 側セクションの align が異なるとき
に発生する。
【例】
セクション名
A
B
ファイル名
file1
file2
file3
file1
align
16
16
16
4
セクション B はセクション制御命令だけ宣言(サイズは 0)
.SECTION B, CODE, ALIGN=4
【回避方法】
rom オプションで指定した rom 側セクションと、ram 側セクションの align を同一にしてください。
【例】
file1 ファイル内の B セクションに対し、align=16 とする。
.SECTION B, CODE, ALIGN=16
【影響システム】
SHC/C++コンパイラ V5.1 以降
- 12 -
付録2-4
P0700WSD7-E4J
SuperHTM RISC engine シミュレータ・デバッガ 制限事項
この度お買い上げ戴いた SuperHTM RISC engine シミュレータ・デバッガには、以下に示す制限事項
がありますのでご注意ください。
1.
SH4のストアキュー使用上の注意
パイプラインリセットが発生した場合、QACR0 および QACR1 の値が0にクリアされます。
このため、QACR0 および QACR1 の値を再設定してから、ストアキューの外部メモリ転送を行なって
ください。
パイプラインリセットは、下記操作後のユーザプログラム実行時に発生します。
パイプラインリセットが発生した場合、ユーザプログラムで QACR0 および QACR1 を設定するか、
ユーザプログラムを停止して Memory ウィンドウ、Control Register ウィンドウまたはコマンドライ
ンで QACR0 および QACR1 を設定してください。
パイプラインリセットが発生する条件:
・ ユーザプログラムの実行停止後、再実行までに PC を変更した場合
・ ユーザプログラムの実行停止後、再実行までに現在フェッチおよびデコードされているメモリの
内容を書き換えた場合
・ Run コマンドで実行開始アドレスを指定した場合
・ プログラムのロードを行なった場合
弊社の C/C++コンパイラでは、ストアキューを使用するコードを自動生成することはありません。
2.
協調検証での注意
本シミュレータ・デバッガにはシノプシス社の Eagle V3.3 用の viss.dll および vsp_access.dll が
含まれています。
Eagle V4 を使用する場合は、本シミュレータ・デバッガをインストールしたディレクトリから
viss.dll および vsp_access.dll を削除してください。
上記 DLL を削除した場合、本シミュレータ・デバッガは環境変数 PATH に設定されている
ディレクトリから上記 DLL を探します。
Eagle V4 には viss.dll および vsp_access.dll が添付されていますので、環境変数 PATH にこれら
の DLL をインストールしたディレクトリが設定されていれば、協調検証を行なうことができます。
(Eagle V4 のインストーラでは自動的に環境変数 PATH を設定します)
viss.dll および vsp_access.dll を削除しても協調検証を行なうことができない場合、
環境変数 PATH
の設定を行なうか、本シミュレータ・デバッガをインストールしたディレクトリに Eagle V4 の
viss.dll および vsp_access.dll をコピーしてください。
以上
1/1