[H8-ML(1474)] Re: H8/3664 jsr問題
From: Yoshinori Sato <qzb04471@xxxxxxxxxxx>
Date: 2001年12月08日(土)23時44分06秒
こんばんは

At Sat, 08 Dec 2001 01:09:37 +0900,
Masahiro Ochiai <user@xxxxxxxxxxxxx> wrote:
> 
> 
> こんばんは 落合です。
> 
> H8/3664でプログラム作ってます。過去のログに無いようでしたので送信しました。
> 
> −gcc-2.95.2上での話です。−
> 
> H8tinyシリーズはH8/300Hの他のCPUと違って、実効アドレスが16ビットとコンパクトになっています。
> 
> 割り込みベクタも全て16ビット幅です。マニュアルに具体的な記載が見あたらないのですが、jsr命令で
> 
> も同様に2バイトの戻りアドレスがスタックに詰まれると思います。そうすると、jsr先の関数で引数を参照
> 
> した際に、コンパイラは戻りアドレスを4バイトと想定して、スタックフレームのオフセットを計算してしまう
> 
> ので、正しく引数を取得できないようです。

暇だったので、調べてみました。(2.95.3です)
-mh / -ms を指定した場合は、戻りアドレスは必ず4バイトで計算しています。
Normal Modeの事は考慮されていないようです。
不便といえば不便なので、パッチを作ってみました。
(2.95.3用。2.95.2でも多分大丈夫でしょう)

-- ここから --
diff -ru gcc-2.95.3/gcc/config/h8300/h8300.h gcc-2.95.3.new/gcc/config/h8300/h8300.h
--- gcc-2.95.3/gcc/config/h8300/h8300.h	Mon Mar 22 09:08:28 1999
+++ gcc-2.95.3.new/gcc/config/h8300/h8300.h	Sat Dec  8 21:23:45 2001
@@ -91,6 +91,8 @@
    alignment.  */
 #define TARGET_ALIGN_300 (target_flags & 8192)
 
+#define TARGET_MODE (target_flags & 16384)
+
 /* Macro to define tables used to set the flags.
    This is a list in braces of pairs in braces,
    each pair being { "NAME", VALUE }
@@ -110,6 +112,7 @@
     {"h",		4096,  "Generate H8/300H code"},		\
     {"no-h",		-4096, "Do not generate H8/300H code"},		\
     {"align-300",	8192,  "Use H8/300 alignment rules"},		\
+    {"n",		16384, "NormalMode Stackframe"},		\
     { "", TARGET_DEFAULT, NULL}}
 
 /* Do things that must be done once at start up.  */
@@ -188,7 +191,8 @@
 #define MAX_FIXED_MODE_SIZE 	32
 
 /* Allocation boundary (in *bits*) for storing arguments in argument list.  */
-#define PARM_BOUNDARY (TARGET_H8300H || TARGET_H8300S ? 32 : 16)
+#define PARM_BOUNDARY \
+        ((TARGET_H8300H || TARGET_H8300S) && !TARGET_MODE ? 32 : 16)
 
 /* Allocation boundary (in *bits*) for the code of a function.  */
 #define FUNCTION_BOUNDARY 16
diff -ru gcc-2.95.3/gcc/config/h8300/t-h8300 gcc-2.95.3.new/gcc/config/h8300/t-h8300
--- gcc-2.95.3/gcc/config/h8300/t-h8300	Thu Dec 17 06:02:56 1998
+++ gcc-2.95.3.new/gcc/config/h8300/t-h8300	Sat Dec  8 21:55:20 2001
@@ -18,8 +18,8 @@
 	echo '#endif' >> fp-bit.c
 	cat $(srcdir)/config/fp-bit.c >> fp-bit.c
 
-MULTILIB_OPTIONS = mh/ms mint32
-MULTILIB_DIRNAMES = h8300h h8300s int32
+MULTILIB_OPTIONS = mh/ms mn mint32
+MULTILIB_DIRNAMES = h8300h h8300s normal int32
 MULTILIB_EXCEPTIONS = mint32
 
 LIBGCC = stmp-multilib
-- ここまで --

パッチを当ててGCCを作りなおすと、-mn というオプションが使えるようにな
ります。
指定してコンパイルすると、戻りアドレスを2バイトで計算するようになりま
す。
試してみてください。

--
佐藤 嘉則
<qzb04471@xxxxxxxxxxx>
スレッド概略
[1414(R)](起点)
 └[1470(U)]
   └[表示中]
     └[1475(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]