From d19b71becfea1edf90f911d59a91f50b13fcac2f Mon Sep 17 00:00:00 2001
From: Michael Snyder <msnyder@vmware.com>
Date: Tue, 2 Jan 2001 23:51:35 +0000
Subject: [PATCH] 2001-01-02  Michael Snyder  <msnyder@cleaver.cygnus.com>

        * 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  <msnyder@cleaver.cygnus.com>
 
+	* 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);
 }