* findvar.c (value_from_register): If the type has no length, just
authorJim Blandy <jimb@codesourcery.com>
Wed, 18 Feb 2004 03:12:11 +0000 (03:12 +0000)
committerJim Blandy <jimb@codesourcery.com>
Wed, 18 Feb 2004 03:12:11 +0000 (03:12 +0000)
return an acceptable value --- don't report an internal error.

gdb/ChangeLog
gdb/findvar.c

index 55733fb..0171e98 100644 (file)
@@ -1,5 +1,8 @@
 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
        forward references, complain if the references aren't resolved by
        the time we're finished reading.
index e737bc3..157a2db 100644 (file)
@@ -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