* rs6000-tdep.c (extract_return_value): Fix returning of values
authorPeter Schauer <Peter.Schauer@mytum.de>
Sat, 12 Aug 1995 10:21:12 +0000 (10:21 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Sat, 12 Aug 1995 10:21:12 +0000 (10:21 +0000)
whose length is less than the register size for big endian targets.

gdb/ChangeLog
gdb/rs6000-tdep.c

index a0addb16a9e94fb0dd53e127bf816de79187c860..fd4e6803632bd72e1c8bf86545739745af2e1cee 100644 (file)
@@ -1,3 +1,8 @@
+Sat Aug 12 03:18:04 1995  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
+
+       * rs6000-tdep.c (extract_return_value):  Fix returning of values
+       whose length is less than the register size for big endian targets.
+
 Fri Aug 11 13:04:32 1995  Kung Hsu  <kung@mexican.cygnus.com>
 
        * symtab.c (list_symbols): if break command set breakpoint on matched
index bbfe9060a6231dc1613f0bcf2a4ca2a99747f0b0..a6456450d97b5d2980ea296d297e6bc5cfc79c04 100644 (file)
@@ -826,6 +826,7 @@ extract_return_value (valtype, regbuf, valbuf)
   char regbuf[REGISTER_BYTES];
   char *valbuf;
 {
+  int offset = 0;
 
   if (TYPE_CODE (valtype) == TYPE_CODE_FLT) {
 
@@ -843,9 +844,15 @@ extract_return_value (valtype, regbuf, valbuf)
       memcpy (valbuf, &ff, sizeof(float));
     }
   }
-  else
+  else {
     /* return value is copied starting from r3. */
-    memcpy (valbuf, &regbuf[REGISTER_BYTE (3)], TYPE_LENGTH (valtype));
+    if (TARGET_BYTE_ORDER == BIG_ENDIAN
+       && TYPE_LENGTH (valtype) < REGISTER_RAW_SIZE (3))
+      offset = REGISTER_RAW_SIZE (3) - TYPE_LENGTH (valtype);
+
+    memcpy (valbuf, regbuf + REGISTER_BYTE (3) + offset,
+           TYPE_LENGTH (valtype));
+  }
 }