2002-02-01 Daniel Jacobowitz <drow@mvista.com>
authorDaniel Jacobowitz <drow@false.org>
Sun, 3 Feb 2002 22:57:56 +0000 (22:57 +0000)
committerDaniel Jacobowitz <drow@false.org>
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 29dbf495ba5dec8dde95ef75e9e6505fe4a25923..3b1edb3e606b5c213d7b53e2399e85b7fbd73e58 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 b6de34c26ef504936569755bf3aae50352ac6af9..435718f5d621992b25011321573980cc9acbc5aa 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 85dbb7bad5af5d739c5993a6cf0a8a735e354c6c..74b521abb6786054b3864212cc504f3746a74ef5 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 62b8bfecb27bb89457be103ffb21807af27f24ef..ec931c0639bfd2a75d4343e604179e095afdb047 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;
          }