OSDN Git Service

2002-02-01 Daniel Jacobowitz <drow@mvista.com>
authordrow <drow>
Sun, 3 Feb 2002 22:57:56 +0000 (22:57 +0000)
committerdrow <drow>
Sun, 3 Feb 2002 22:57:56 +0000 (22:57 +0000)
        PR gdb/280
        * gdbtypes.c (replace_type): New function.
        * gdbtypes.h (replace_type): Add prototype.
        * stabsread.c (read_type): Use replace_type.

gdb/ChangeLog
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/stabsread.c

index 29dbf49..3b1edb3 100644 (file)
@@ -1,3 +1,10 @@
+2002-02-03  Daniel Jacobowitz  <drow@mvista.com>
+
+       PR gdb/280
+       * gdbtypes.c (replace_type): New function.
+       * gdbtypes.h (replace_type): Add prototype.
+       * stabsread.c (read_type): Use replace_type.
+
 2002-02-03  Richard Earnshaw  <rearnsha@arm.com>
 
        * Makefile.in (memattr.o): Add missing dependencies rule.
index b6de34c..435718f 100644 (file)
@@ -519,6 +519,32 @@ finish_cv_type (struct type *type)
     }
 }
 
+/* Replace the contents of ntype with the type *type.
+
+   This function should not be necessary, but is due to quirks in the stabs
+   reader.  This should go away.  It does not handle the replacement type
+   being cv-qualified; it could be easily fixed to, but it should go away,
+   remember?  */
+void
+replace_type (struct type *ntype, struct type *type)
+{
+  struct type *cv_chain, *as_chain, *ptr, *ref;
+
+  cv_chain = TYPE_CV_TYPE (ntype);
+  as_chain = TYPE_AS_TYPE (ntype);
+  ptr = TYPE_POINTER_TYPE (ntype);
+  ref = TYPE_REFERENCE_TYPE (ntype);
+
+  *ntype = *type;
+
+  TYPE_POINTER_TYPE (ntype) = ptr;
+  TYPE_REFERENCE_TYPE (ntype) = ref;
+  TYPE_CV_TYPE (ntype) = cv_chain;
+  TYPE_AS_TYPE (ntype) = as_chain;
+
+  finish_cv_type (ntype);
+}
+
 /* Implement direct support for MEMBER_TYPE in GNU C++.
    May need to construct such a type if this is the first use.
    The TYPE is the type of the member.  The DOMAIN is the type
index 85dbb7b..74b521a 100644 (file)
@@ -1062,6 +1062,8 @@ extern struct type *make_cv_type (int, int, struct type *, struct type **);
 
 extern void finish_cv_type (struct type *);
 
+extern void replace_type (struct type *, struct type *);
+
 extern int address_space_name_to_int (char *);
 
 extern char *address_space_int_to_name (int);
index 62b8bfe..ec931c0 100644 (file)
@@ -2531,7 +2531,13 @@ again:
          }
        else if (type_size >= 0 || is_string)
          {
-           *type = *xtype;
+           /* This is the absolute wrong way to construct types.  Every
+              other debug format has found a way around this problem and
+              the related problems with unnecessarily stubbed types;
+              someone motivated should attempt to clean up the issue
+              here as well.  Once a type pointed to has been created it
+              should not be modified.  */
+           replace_type (type, xtype);
            TYPE_NAME (type) = NULL;
            TYPE_TAG_NAME (type) = NULL;
          }