こんばんは
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>