* findvar.c (value_from_register): If the type has no length, just

return an acceptable value --- don't report an internal error.
This commit is contained in:
Jim Blandy 2004-02-18 03:12:11 +00:00
parent 8cfe231d8f
commit 4589a601d6
2 changed files with 27 additions and 1 deletions

View file

@ -1,5 +1,8 @@
2004-02-17 Jim Blandy <jimb@redhat.com> 2004-02-17 Jim Blandy <jimb@redhat.com>
* findvar.c (value_from_register): If the type has no length, just
return an acceptable value --- don't report an internal error.
* stabsread.c (read_type): If we find any type numbers that are * stabsread.c (read_type): If we find any type numbers that are
forward references, complain if the references aren't resolved by forward references, complain if the references aren't resolved by
the time we're finished reading. the time we're finished reading.

View file

@ -618,7 +618,30 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame)
struct value *v = allocate_value (type); struct value *v = allocate_value (type);
CHECK_TYPEDEF (type); CHECK_TYPEDEF (type);
if (CONVERT_REGISTER_P (regnum, type)) if (TYPE_LENGTH (type) == 0)
{
/* It doesn't matter much what we return for this: since the
length is zero, it could be anything. But if allowed to see
a zero-length type, the register-finding loop below will set
neither mem_stor nor reg_stor, and then report an internal
error.
Zero-length types can legitimately arise from declarations
like 'struct {}'. GDB may also create them when it finds
bogus debugging information; for example, in GCC 2.94.4 and
binutils 2.11.93.0.2, the STABS BINCL->EXCL compression
process can create bad type numbers. GDB reads these as
TYPE_CODE_UNDEF types, with zero length. (That bug is
actually the only known way to get a zero-length value
allocated to a register --- which is what it takes to make it
here.)
We'll just attribute the value to the original register. */
VALUE_LVAL (v) = lval_register;
VALUE_ADDRESS (v) = regnum;
VALUE_REGNO (v) = regnum;
}
else if (CONVERT_REGISTER_P (regnum, type))
{ {
/* The ISA/ABI need to something weird when obtaining the /* The ISA/ABI need to something weird when obtaining the
specified value from this register. It might need to specified value from this register. It might need to