* valops.c (value_assign): Change bitfield code to use a buffer of
authorJim Kingdon <jkingdon@engr.sgi.com>
Thu, 28 Oct 1993 14:27:39 +0000 (14:27 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Thu, 28 Oct 1993 14:27:39 +0000 (14:27 +0000)
the correct size, rather than an int.

gdb/ChangeLog
gdb/valops.c

index 993cb9861164e92690e484837749147a268f7791..d21c611d0d988918db0fa32a5842d78e67880796 100644 (file)
@@ -1,8 +1,16 @@
+Thu Oct 28 09:14:42 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
+
+       * valops.c (value_assign): Change bitfield code to use a buffer of
+       the correct size, rather than an int.
+
 Wed Oct 27 13:43:07 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
-       * config/i386/{i386m3.mt,i386m3.mh}: Use correct names for TM_FILE
-       and XM_FILE.  Replace host file i386mach3-xdep.o with native file
-       i386m3-nat.o.
+       * config/i386/{i386m3.mt,i386m3.mh},
+       config/mips/{mipsm3.mt,mipsm3.mh},
+       config/ns32k/{ns32km3.mt,ns32km3.mh}: Use correct names for TM_FILE
+       and XM_FILE.  Replace host files *mach3-xdep.o with native
+       files *m3-nat.o.  Replace host file os-mach3.o with native
+       file m3-nat.o.
 
        * remote-udi.c: Remove LOG_FILE stuff; superceded by "set remotedebug".
        * remote-mon.c: Remove commented out "set remotedebug" command.
index fd2441b54b0ea48b6105e7a6ebfecad87294e756..7697266107b59e194ee5d9e6deeed7806a07c761 100644 (file)
@@ -329,13 +329,24 @@ value_assign (toval, fromval)
     case lval_memory:
       if (VALUE_BITSIZE (toval))
        {
-         int v;                /* FIXME, this won't work for large bitfields */
+         char buffer[sizeof (LONGEST)];
+         /* We assume that the argument to read_memory is in units of
+            host chars.  FIXME:  Is that correct?  */
+         int len = (VALUE_BITPOS (toval)
+                    + VALUE_BITSIZE (toval)
+                    + HOST_CHAR_BIT - 1)
+                   / HOST_CHAR_BIT;
+         /* If bigger than a LONGEST, we don't handle it correctly,
+            but at least avoid corrupting memory.  */
+         if (len > sizeof (LONGEST))
+           len = sizeof (LONGEST);
+
          read_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
-                      (char *) &v, sizeof v);
-         modify_field ((char *) &v, value_as_long (fromval),
+                      buffer, len);
+         modify_field (buffer, value_as_long (fromval),
                        VALUE_BITPOS (toval), VALUE_BITSIZE (toval));
          write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
-                       (char *)&v, sizeof v);
+                       buffer, len);
        }
       else if (use_buffer)
        write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
@@ -348,14 +359,14 @@ value_assign (toval, fromval)
     case lval_register:
       if (VALUE_BITSIZE (toval))
        {
-         int v;
-
-         read_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
-                              (char *) &v, sizeof v);
-         modify_field ((char *) &v, value_as_long (fromval),
-                       VALUE_BITPOS (toval), VALUE_BITSIZE (toval));
-         write_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
-                               (char *) &v, sizeof v);
+         char buffer[MAX_REGISTER_RAW_SIZE];
+          int len = REGISTER_RAW_SIZE (VALUE_REGNO (toval));
+          read_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
+                               buffer, len);
+          modify_field (buffer, value_as_long (fromval),
+                        VALUE_BITPOS (toval), VALUE_BITSIZE (toval));
+          write_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
+                                buffer, len);
        }
       else if (use_buffer)
        write_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
@@ -392,7 +403,12 @@ value_assign (toval, fromval)
        int byte_offset = VALUE_OFFSET (toval) % reg_size;
        int reg_offset = VALUE_OFFSET (toval) / reg_size;
        int amount_copied;
-       char *buffer = (char *) alloca (amount_to_copy);
+
+       /* Make the buffer large enough in all cases.  */
+       char *buffer = (char *) alloca (amount_to_copy
+                                       + sizeof (LONGEST)
+                                       + MAX_REGISTER_RAW_SIZE);
+
        int regno;
        FRAME frame;