From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5285 invoked by alias); 4 May 2002 00:20:29 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 5277 invoked from network); 4 May 2002 00:20:27 -0000 Received: from unknown (HELO zwingli.cygnus.com) (208.245.165.35) by sources.redhat.com with SMTP; 4 May 2002 00:20:27 -0000 Received: by zwingli.cygnus.com (Postfix, from userid 442) id 6E6BA5EA11; Fri, 3 May 2002 19:20:26 -0500 (EST) From: Jim Blandy To: gdb-patches@sources.redhat.com Subject: PATCH: don't corrupt cv_type chain Message-Id: <20020504002026.6E6BA5EA11@zwingli.cygnus.com> Date: Fri, 03 May 2002 17:20:00 -0000 X-SW-Source: 2002-05/txt/msg00087.txt.bz2 This fixes the second failure in hang.exp. 2002-05-03 Jim Blandy * stabsread.c (cleanup_undefined_types): Use replace_type, not memcpy. (read_type): Doc fix. * gdbtypes.c (replace_type): Doc fix. Index: gdb/gdbtypes.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtypes.c,v retrieving revision 1.44 diff -c -r1.44 gdbtypes.c *** gdb/gdbtypes.c 26 Apr 2002 20:08:18 -0000 1.44 --- gdb/gdbtypes.c 4 May 2002 00:18:05 -0000 *************** *** 521,530 **** /* 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) { --- 521,530 ---- /* Replace the contents of ntype with the type *type. ! When building recursive types, it is necessary to update a type's ! definition after people already have references to it. The C ! language's concept of an `incomplete type' is an acknowledgement of ! this. */ void replace_type (struct type *ntype, struct type *type) { Index: gdb/stabsread.c =================================================================== RCS file: /cvs/src/src/gdb/stabsread.c,v retrieving revision 1.31 diff -c -r1.31 stabsread.c *** gdb/stabsread.c 4 May 2002 00:02:50 -0000 1.31 --- gdb/stabsread.c 4 May 2002 00:18:08 -0000 *************** *** 2537,2543 **** 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; --- 2537,2560 ---- 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. ! ! Well, it's not *absolutely* wrong. Constructing recursive ! types (trees, linked lists) necessarily entails modifying ! types after creating them. Constructing any loop structure ! entails side effects. The Dwarf 2 reader does handle this ! more gracefully (it never constructs more than once ! instance of a type object, so it doesn't have to copy type ! objects wholesale), but it still mutates type objects after ! other folks have references to them. ! ! Keep in mind that this circularity/mutation issue shows up ! at the source language level, too: C's "incomplete types", ! for example. So the proper cleanup, I think, would be to ! limit GDB's type smashing to match exactly those required ! by the source language. So GDB could have a ! "complete_this_type" function, but never create unnecessary ! copies of a type otherwise. */ replace_type (type, xtype); TYPE_NAME (type) = NULL; TYPE_TAG_NAME (type) = NULL; *************** *** 5122,5131 **** && (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE (*type)) && STREQ (SYMBOL_NAME (sym), typename)) ! { ! memcpy (*type, SYMBOL_TYPE (sym), ! sizeof (struct type)); ! } } } } --- 5139,5145 ---- && (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE (*type)) && STREQ (SYMBOL_NAME (sym), typename)) ! replace_type (*type, SYMBOL_TYPE (sym)); } } }