2003-07-22 Michael Snyder <msnyder@redhat.com>
authorMichael Snyder <msnyder@vmware.com>
Wed, 23 Jul 2003 01:25:55 +0000 (01:25 +0000)
committerMichael Snyder <msnyder@vmware.com>
Wed, 23 Jul 2003 01:25:55 +0000 (01:25 +0000)
        * h8300-tdep.c (h8300_extract_return_value): Teach it how to
        handle 8-bit returns (long long).
        (h8300h_extract_return_value): Ditto.
        (h8300_gdbarch_init): Long long is 8 bytes, char is unsigned.

gdb/ChangeLog
gdb/h8300-tdep.c

index df30a0b60a21ec35f1fee356de90d27a5b599e35..326dd973ca05486692435ea4f970ec8b532e2635 100644 (file)
@@ -1,3 +1,10 @@
+2003-07-22  Michael Snyder  <msnyder@redhat.com>
+
+       * h8300-tdep.c (h8300_extract_return_value): Teach it how to
+       handle 8-bit returns (long long).
+       (h8300h_extract_return_value): Ditto.
+       (h8300_gdbarch_init): Long long is 8 bytes, char is unsigned.
+
 2003-07-22  Andrew Cagney  <cagney@redhat.com>
 
        * gdbarch.c Include "gdb_obstack.h".
index 1253b4d6ca15f0da935c04fb82fb8840f5f29b29..c60c299f20d6118439cd458d2be7af4dbe3f5b1f 100644 (file)
@@ -771,7 +771,7 @@ h8300_extract_return_value (struct type *type, struct regcache *regcache,
                            void *valbuf)
 {
   int len = TYPE_LENGTH (type);
-  ULONGEST c;
+  ULONGEST c, addr;
 
   switch (len)
     {
@@ -786,9 +786,17 @@ h8300_extract_return_value (struct type *type, struct regcache *regcache,
        regcache_cooked_read_unsigned (regcache, E_RET1_REGNUM, &c);
        store_unsigned_integer ((void*)((char *)valbuf + 2), 2, c);
        break;
-      case 8:          /* long long, double and long double are all defined
-                          as 4 byte types so far so this shouldn't happen. */
-       error ("I don't know how a 8 byte value is returned.");
+      case 8:  /* long long is now 8 bytes.  */
+       if (TYPE_CODE (type) == TYPE_CODE_INT)
+         {
+           regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &addr);
+           c = read_memory_unsigned_integer ((CORE_ADDR) addr, len);
+           store_unsigned_integer (valbuf, len, c);
+         }
+       else
+         {
+           error ("I don't know how this 8 byte value is returned.");
+         }
        break;
     }
 }
@@ -798,7 +806,7 @@ h8300h_extract_return_value (struct type *type, struct regcache *regcache,
                            void *valbuf)
 {
   int len = TYPE_LENGTH (type);
-  ULONGEST c;
+  ULONGEST c, addr;
 
   switch (len)
     {
@@ -808,9 +816,17 @@ h8300h_extract_return_value (struct type *type, struct regcache *regcache,
        regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &c);
        store_unsigned_integer (valbuf, len, c);
        break;
-      case 8:          /* long long, double and long double are all defined
-                          as 4 byte types so far so this shouldn't happen. */
-       error ("I don't know how a 8 byte value is returned.");
+      case 8:  /* long long is now 8 bytes.  */
+       if (TYPE_CODE (type) == TYPE_CODE_INT)
+         {
+           regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &addr);
+           c = read_memory_unsigned_integer ((CORE_ADDR) addr, len);
+           store_unsigned_integer (valbuf, len, c);
+         }
+       else
+         {
+           error ("I don't know how this 8 byte value is returned.");
+         }
        break;
     }
 }
@@ -830,19 +846,19 @@ h8300_store_return_value (struct type *type, struct regcache *regcache,
   switch (len)
     {
       case 1:
-      case 2:
+    case 2:    /* short... */
        val = extract_unsigned_integer (valbuf, len);
        regcache_cooked_write_unsigned (regcache, E_RET0_REGNUM, val);
        break;
-      case 4:                  /* long, float */
+      case 4:  /* long, float */
        val = extract_unsigned_integer (valbuf, len);
        regcache_cooked_write_unsigned (regcache, E_RET0_REGNUM,
                                        (val >> 16) &0xffff);
        regcache_cooked_write_unsigned (regcache, E_RET1_REGNUM, val & 0xffff);
        break;
-      case 8:          /* long long, double and long double are all defined
-                            as 4 byte types so far so this shouldn't happen. */
-       error ("I don't know how to return a 8 byte value.");
+      case 8:  /* long long, double and long double are all defined
+                  as 4 byte types so far so this shouldn't happen.  */
+       error ("I don't know how to return an 8 byte value.");
        break;
     }
 }
@@ -858,13 +874,13 @@ h8300h_store_return_value (struct type *type, struct regcache *regcache,
     {
       case 1:
       case 2:
-      case 4:                  /* long, float */
+      case 4:  /* long, float */
        val = extract_unsigned_integer (valbuf, len);
        regcache_cooked_write_unsigned (regcache, E_RET0_REGNUM, val);
        break;
-      case 8:          /* long long, double and long double are all defined
-                            as 4 byte types so far so this shouldn't happen. */
-       error ("I don't know how to return a 8 byte value.");
+      case 8:  /* long long, double and long double are all defined
+                  as 4 byte types so far so this shouldn't happen.  */
+       error ("I don't know how to return an 8 byte value.");
        break;
     }
 }
@@ -1310,13 +1326,16 @@ h8300_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   set_gdbarch_int_bit (gdbarch, 2 * TARGET_CHAR_BIT);
   set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
-  set_gdbarch_long_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
+  set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
   set_gdbarch_double_bit (gdbarch, 4 * TARGET_CHAR_BIT);
   set_gdbarch_long_double_bit (gdbarch, 4 * TARGET_CHAR_BIT);
 
   /* set_gdbarch_stack_align (gdbarch, SOME_stack_align); */
   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
 
+  /* Char is unsigned.  */
+  set_gdbarch_char_signed (gdbarch, 0);
+
   return gdbarch;
 }