This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA] Fix problems with 2001-12-07 stabsread.c change


Apart from the STABS_CONTINUE problem mentioned in
http://sources.redhat.com/ml/gdb-patches/2002-02/msg00629.html
(and I suspect that we would need some more STABS_CONTINUE stuff during the
skipping), I found another problem with this patch, where e.g.
__deleting_dtor::(0,254):_ZNSdD0Ev;2A*1;(80,10);
is not skipped correctly.

You should be able to reproduce the problem by compiling

#include <iostream>
int main () { return 0; }

with gcc-3.0.4, stabs debugging and the following gdb commands on the
resulting a.out executable

set complaints 20
symbol-file -readnow a.out

and you will see a bunch of
couldn't parse type; debugger out of date?
messages, caused by the incorrect skipping.


Instead of duplicating all the logic in the skip code, I'd suggest that we
just suppress the addition of the duplicates to the member function vector,
which might be a little bit slower, but much easier to maintain.

Here is a patch:

2002-03-15  Peter Schauer  <pes@regent.e-technik.tu-muenchen.de>

	* stabsread.c (read_member_functions): Remove skip code for duplicate
	constructor/destructor methods.  Use standard parsing for these
	methods and just do not chain them to the list of methods after
	parsing.

--- ./stabsread.c.orig	Fri Mar  8 18:16:14 2002
+++ ./stabsread.c	Fri Mar  8 18:29:51 2002
@@ -3037,7 +3037,6 @@ read_member_functions (struct field_info
 {
   int nfn_fields = 0;
   int length = 0;
-  int skip_method;
   /* Total number of member functions defined in this class.  If the class
      defines two `f' functions, and one `g' function, then this will have
      the value 3.  */
@@ -3077,36 +3076,6 @@ read_member_functions (struct field_info
       look_ahead_type = NULL;
       length = 0;
 
-      skip_method = 0;
-      if (p - *pp == strlen ("__base_ctor")
-	  && strncmp (*pp, "__base_ctor", strlen ("__base_ctor")) == 0)
-	skip_method = 1;
-      else if (p - *pp == strlen ("__base_dtor")
-	       && strncmp (*pp, "__base_dtor", strlen ("__base_dtor")) == 0)
-	skip_method = 1;
-      else if (p - *pp == strlen ("__deleting_dtor")
-	       && strncmp (*pp, "__deleting_dtor",
-			   strlen ("__deleting_dtor")) == 0)
-	skip_method = 1;
-
-      if (skip_method)
-	{
-	  /* Skip past '::'.  */
-	  *pp = p + 2;
-	  /* Read the type.  */
-	  read_type (pp, objfile);
-	  /* Skip past the colon, mangled name, semicolon, flags, and final
-	     semicolon.  */
-	  while (**pp != ';')
-	    (*pp) ++;
-	  (*pp) ++;
-	  while (**pp != ';')
-	    (*pp) ++;
-	  (*pp) ++;
-
-	  continue;
-	}
-
       new_fnlist = (struct next_fnfieldlist *)
 	xmalloc (sizeof (struct next_fnfieldlist));
       make_cleanup (xfree, new_fnlist);
@@ -3332,23 +3301,34 @@ read_member_functions (struct field_info
       while (**pp != ';' && **pp != '\0');
 
       (*pp)++;
+      STABS_CONTINUE (pp, objfile);
 
-      new_fnlist->fn_fieldlist.fn_fields = (struct fn_field *)
-	obstack_alloc (&objfile->type_obstack,
-		       sizeof (struct fn_field) * length);
-      memset (new_fnlist->fn_fieldlist.fn_fields, 0,
-	      sizeof (struct fn_field) * length);
-      for (i = length; (i--, sublist); sublist = sublist->next)
+      /* Skip GCC 3.X member functions which are duplicates of the callable
+	 constructor/destructor.  */
+      if (strcmp (main_fn_name, "__base_ctor") == 0
+	  || strcmp (main_fn_name, "__base_dtor") == 0
+	  || strcmp (main_fn_name, "__deleting_dtor") == 0)
 	{
-	  new_fnlist->fn_fieldlist.fn_fields[i] = sublist->fn_field;
+	  xfree (main_fn_name);
 	}
+      else
+	{
+	  new_fnlist->fn_fieldlist.fn_fields = (struct fn_field *)
+	    obstack_alloc (&objfile->type_obstack,
+			   sizeof (struct fn_field) * length);
+	  memset (new_fnlist->fn_fieldlist.fn_fields, 0,
+		  sizeof (struct fn_field) * length);
+	  for (i = length; (i--, sublist); sublist = sublist->next)
+	    {
+	      new_fnlist->fn_fieldlist.fn_fields[i] = sublist->fn_field;
+	    }
 
-      new_fnlist->fn_fieldlist.length = length;
-      new_fnlist->next = fip->fnlist;
-      fip->fnlist = new_fnlist;
-      nfn_fields++;
-      total_length += length;
-      STABS_CONTINUE (pp, objfile);
+	  new_fnlist->fn_fieldlist.length = length;
+	  new_fnlist->next = fip->fnlist;
+	  fip->fnlist = new_fnlist;
+	  nfn_fields++;
+	  total_length += length;
+	}
     }
 
   if (nfn_fields)

-- 
Peter Schauer			pes@regent.e-technik.tu-muenchen.de


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]