* 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:
parent
8cfe231d8f
commit
4589a601d6
2 changed files with 27 additions and 1 deletions
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue