This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] Fix problems with 2001-12-07 stabsread.c change
- From: "Peter.Schauer" <Peter dot Schauer at regent dot e-technik dot tu-muenchen dot de>
- To: gdb-patches at sources dot redhat dot com
- Date: Fri, 15 Mar 2002 11:43:19 MET
- Subject: [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