From d19b71becfea1edf90f911d59a91f50b13fcac2f Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Tue, 2 Jan 2001 23:51:35 +0000 Subject: [PATCH] 2001-01-02 Michael Snyder * sh-tdep.c (sh_extract_return_value): Allow for small return type. (sh_sh4_extract_return_value): Call sh_extract_return_value for --- gdb/ChangeLog | 3 +++ gdb/sh-tdep.c | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 517e743a82d..6d6ab823126 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,8 @@ 2001-01-02 Michael Snyder + * sh-tdep.c (sh_extract_return_value): Allow for small return type. + (sh_sh4_extract_return_value): Call sh_extract_return_value for + non-float types. * sparc-tdep.c (sparc_frame_chain): Fix typo in comment. Update copyright notice. diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c index b3a8f9ffc2e..74783bf2a60 100644 --- a/gdb/sh-tdep.c +++ b/gdb/sh-tdep.c @@ -1060,8 +1060,20 @@ sh_extract_return_value (struct type *type, char *regbuf, char *valbuf) static void sh_default_store_return_value (struct type *type, char *valbuf) { - write_register_bytes (REGISTER_BYTE (0), - valbuf, TYPE_LENGTH (type)); + char buf[32]; /* more than enough... */ + + if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (R0_REGNUM)) + { + /* Add leading zeros to the value. */ + memset (buf, 0, REGISTER_RAW_SIZE (R0_REGNUM)); + memcpy (buf + REGISTER_RAW_SIZE (R0_REGNUM) - TYPE_LENGTH (type), + valbuf, TYPE_LENGTH (type)); + write_register_bytes (REGISTER_BYTE (R0_REGNUM), buf, + REGISTER_RAW_SIZE (R0_REGNUM)); + } + else + write_register_bytes (REGISTER_BYTE (R0_REGNUM), valbuf, + TYPE_LENGTH (type)); } static void @@ -1071,8 +1083,7 @@ sh3e_sh4_store_return_value (struct type *type, char *valbuf) write_register_bytes (REGISTER_BYTE (FP0_REGNUM), valbuf, TYPE_LENGTH (type)); else - write_register_bytes (REGISTER_BYTE (0), - valbuf, TYPE_LENGTH (type)); + sh_default_store_return_value (type, valbuf); } -- 2.30.2