* d10v-tdep.c (d10v_extract_return_value): Wierd. GCC wants to return
authorAndrew Cagney <cagney@redhat.com>
Wed, 1 Apr 1998 04:52:37 +0000 (04:52 +0000)
committerAndrew Cagney <cagney@redhat.com>
Wed, 1 Apr 1998 04:52:37 +0000 (04:52 +0000)
odd sized register quantities with only half of the first register used!
* config/d10v/tm-d10v.h (USE_STRUCT_CONVENTION): Use stack when size > 8.

gdb/ChangeLog
gdb/config/d10v/tm-d10v.h
gdb/d10v-tdep.c

index 3f91ef439a6f945f6e010f35d1e301b39076235e..d8e2a194fd03b12ab358c78cc39b7fc8393c8b7a 100644 (file)
@@ -1,3 +1,12 @@
+Mon Feb 16 14:05:54 1998  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * d10v-tdep.c (d10v_extract_return_value): Wierd.  GCC wants to
+       return odd sized register quantities with only half of the first
+       register used!
+
+       * config/d10v/tm-d10v.h (USE_STRUCT_CONVENTION): Use stack when
+       size > 8.
+
 Mon Mar 30 16:42:12 1998  Jason Molenda  (crash@bugshack.cygnus.com)
 
        * rdi-share/Makefile.am, rdi-share/aclocal.m4,
index 93c634c1621bbda9984019dbd9c4992b6c072d85..0a4c3b4da3cde59c985dca15c9a2de55e71fa5a4 100644 (file)
@@ -187,7 +187,7 @@ extern CORE_ADDR d10v_skip_prologue ();
    registers. */
 
 #define USE_STRUCT_CONVENTION(gcc_p, type) \
-   (TYPE_LENGTH (type) > 1)
+   (TYPE_LENGTH (type) > 8)
 
 \f
 
index 6e5789172d8991bbae8f62923c12212cb1ecb800..10d249be2d2a7582409c48842848e8de266acf19 100644 (file)
@@ -654,8 +654,17 @@ d10v_extract_return_value (type, regbuf, valbuf)
          unsigned short c = extract_unsigned_integer (regbuf + REGISTER_BYTE (RET1_REGNUM), REGISTER_RAW_SIZE (RET1_REGNUM));
          store_unsigned_integer (valbuf, 1, c);
        }
-      else
+      else if ((len & 1) == 0)
        memcpy (valbuf, regbuf + REGISTER_BYTE (RET1_REGNUM), len);
+      else
+       {
+         /* For return values of odd size, the first byte is in the
+             least significant part of the first register.  The
+             remaining bytes in remaining registers. Interestingly,
+             when such values are passed in, the last byte is in the
+             most significant byte of that same register - wierd. */
+         memcpy (valbuf, regbuf + REGISTER_BYTE (RET1_REGNUM) + 1, len);
+       }
     }
 }