From: Jim Blandy Date: Wed, 18 Feb 2004 03:12:11 +0000 (+0000) Subject: * findvar.c (value_from_register): If the type has no length, just X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4589a601d6c5e3b3e9b3575e73f95f2cfe410aeb;p=binutils-gdb.git * findvar.c (value_from_register): If the type has no length, just return an acceptable value --- don't report an internal error. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 55733fb58e6..0171e988cec 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,8 @@ 2004-02-17 Jim Blandy + * 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 forward references, complain if the references aren't resolved by the time we're finished reading. diff --git a/gdb/findvar.c b/gdb/findvar.c index e737bc30d12..157a2db8420 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -618,7 +618,30 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame) struct value *v = allocate_value (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 specified value from this register. It might need to