* valops.c (value_assign): Change bitfield code to use a buffer of
the correct size, rather than an int.
This commit is contained in:
parent
2487f88fdc
commit
4d52ec8623
|
@ -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)
|
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
|
* config/i386/{i386m3.mt,i386m3.mh},
|
||||||
and XM_FILE. Replace host file i386mach3-xdep.o with native file
|
config/mips/{mipsm3.mt,mipsm3.mh},
|
||||||
i386m3-nat.o.
|
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-udi.c: Remove LOG_FILE stuff; superceded by "set remotedebug".
|
||||||
* remote-mon.c: Remove commented out "set remotedebug" command.
|
* remote-mon.c: Remove commented out "set remotedebug" command.
|
||||||
|
|
42
gdb/valops.c
42
gdb/valops.c
|
@ -329,13 +329,24 @@ value_assign (toval, fromval)
|
||||||
case lval_memory:
|
case lval_memory:
|
||||||
if (VALUE_BITSIZE (toval))
|
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),
|
read_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
||||||
(char *) &v, sizeof v);
|
buffer, len);
|
||||||
modify_field ((char *) &v, value_as_long (fromval),
|
modify_field (buffer, value_as_long (fromval),
|
||||||
VALUE_BITPOS (toval), VALUE_BITSIZE (toval));
|
VALUE_BITPOS (toval), VALUE_BITSIZE (toval));
|
||||||
write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
||||||
(char *)&v, sizeof v);
|
buffer, len);
|
||||||
}
|
}
|
||||||
else if (use_buffer)
|
else if (use_buffer)
|
||||||
write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
||||||
|
@ -348,14 +359,14 @@ value_assign (toval, fromval)
|
||||||
case lval_register:
|
case lval_register:
|
||||||
if (VALUE_BITSIZE (toval))
|
if (VALUE_BITSIZE (toval))
|
||||||
{
|
{
|
||||||
int v;
|
char buffer[MAX_REGISTER_RAW_SIZE];
|
||||||
|
int len = REGISTER_RAW_SIZE (VALUE_REGNO (toval));
|
||||||
read_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
read_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
||||||
(char *) &v, sizeof v);
|
buffer, len);
|
||||||
modify_field ((char *) &v, value_as_long (fromval),
|
modify_field (buffer, value_as_long (fromval),
|
||||||
VALUE_BITPOS (toval), VALUE_BITSIZE (toval));
|
VALUE_BITPOS (toval), VALUE_BITSIZE (toval));
|
||||||
write_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
write_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
||||||
(char *) &v, sizeof v);
|
buffer, len);
|
||||||
}
|
}
|
||||||
else if (use_buffer)
|
else if (use_buffer)
|
||||||
write_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval),
|
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 byte_offset = VALUE_OFFSET (toval) % reg_size;
|
||||||
int reg_offset = VALUE_OFFSET (toval) / reg_size;
|
int reg_offset = VALUE_OFFSET (toval) / reg_size;
|
||||||
int amount_copied;
|
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;
|
int regno;
|
||||||
FRAME frame;
|
FRAME frame;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue