* stabsread.c (cleanup_undefined_types_1): Add instance flags check
authorJoel Brobecker <brobecker@gnat.com>
Sat, 19 Apr 2008 01:33:26 +0000 (01:33 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Sat, 19 Apr 2008 01:33:26 +0000 (01:33 +0000)
        in the search for the matching symbol.

gdb/ChangeLog
gdb/stabsread.c

index 2b6bfd2..7207d20 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-18  Joel Brobecker  <brobecker@adacore.com>
+
+       * stabsread.c (cleanup_undefined_types_1): Add instance flags check
+       in the search for the matching symbol.
+
 2008-04-17  Marc Khouzam  <marc.khouzam@ericsson.com>
 
        * breakpoint.c (update_watchpoint): Always reparse
index 3b747b4..6d6b094 100644 (file)
@@ -4294,6 +4294,25 @@ cleanup_undefined_types_1 (void)
 {
   struct type **type;
 
+  /* Iterate over every undefined type, and look for a symbol whose type
+     matches our undefined type.  The symbol matches if:
+       1. It is a typedef in the STRUCT domain;
+       2. It has the same name, and same type code;
+       3. The instance flags are identical.
+     
+     It is important to check the instance flags, because we have seen
+     examples where the debug info contained definitions such as:
+
+         "foo_t:t30=B31=xefoo_t:"
+
+     In this case, we have created an undefined type named "foo_t" whose
+     instance flags is null (when processing "xefoo_t"), and then created
+     another type with the same name, but with different instance flags
+     ('B' means volatile).  I think that the definition above is wrong,
+     since the same type cannot be volatile and non-volatile at the same
+     time, but we need to be able to cope with it when it happens.  The
+     approach taken here is to treat these two types as different.  */
+
   for (type = undef_types; type < undef_types + undef_types_length; type++)
     {
       switch (TYPE_CODE (*type))
@@ -4329,7 +4348,10 @@ cleanup_undefined_types_1 (void)
                            && SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN
                            && (TYPE_CODE (SYMBOL_TYPE (sym)) ==
                                TYPE_CODE (*type))
-                           && strcmp (DEPRECATED_SYMBOL_NAME (sym), typename) == 0)
+                           && (TYPE_INSTANCE_FLAGS (*type) ==
+                               TYPE_INSTANCE_FLAGS (SYMBOL_TYPE (sym)))
+                           && strcmp (DEPRECATED_SYMBOL_NAME (sym),
+                                      typename) == 0)
                           replace_type (*type, SYMBOL_TYPE (sym));
                      }
                  }