From: Kung Hsu Date: Fri, 12 Nov 1993 19:34:24 +0000 (+0000) Subject: Modified Files: X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=2fb58b984c8274f83b69c1d938f4f4e84b026027;p=deliverable%2Fbinutils-gdb.git Modified Files: ChangeLog stabsread.c * stabsread.c (patch_block_stabs, define_symbol, read_type): in g++ template instantiation, nested class can be part of the params, and '::' can gets into symbol or type names. This is to fix the problem. (fix pr3837) --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 46a58451c2..e3057735b3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ Fri Nov 12 11:18:02 1993 Kung Hsu (kung@cirdan.cygnus.com) + * stabsread.c (patch_block_stabs, define_symbol, read_type): in + g++ template instantiation, nested class can be part of the + params, and '::' can gets into symbol or type names. This is + to fix the problem. + * gdbtypes.c (lookup_struct_elt_type): Handle type ref or pointer to struct/union case. diff --git a/gdb/stabsread.c b/gdb/stabsread.c index 2ebaa6cc80..d038ca6545 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -367,6 +367,11 @@ patch_block_stabs (symbols, stabs, objfile) { name = stabs->stab[ii]; pp = (char*) strchr (name, ':'); + while (pp[1] == ':') + { + pp += 2; + pp = (char *)strchr(pp, ':'); + } sym = find_symbol_in_list (symbols, name, pp-name); if (!sym) { @@ -485,6 +490,12 @@ define_symbol (valu, string, desc, type, objfile) if (p == 0) return 0; + while (p[1] == ':') + { + p += 2; + p = strchr(p, ':'); + } + /* If a nameless stab entry, all we need is the type, not the symbol. e.g. ":t10=*2" or a nameless enum like " :T16=ered:0,green:1,blue:2,;" */ nameless = (p == string || ((string[0] == ' ') && (string[1] == ':'))); @@ -1295,7 +1306,7 @@ read_type (pp, objfile) char *type_name; { - char *from, *to; + char *from, *to, *p; /* Set the type code according to the following letter. */ switch ((*pp)[0]) @@ -1312,16 +1323,21 @@ read_type (pp, objfile) default: return error_type (pp); } - - to = type_name = (char *) - obstack_alloc (&objfile -> type_obstack, - (((char *) strchr (*pp, ':') - (*pp)) + 1)); + + p = strchr(*pp, ':'); + while (p[1] == ':') + { + p += 2; + p = strchr(p, ':'); + } + to = type_name = + (char *)obstack_alloc (&objfile->type_obstack, p - *pp + 1); /* Copy the name. */ from = *pp + 1; - while ((*to++ = *from++) != ':') - ; - *--to = '\0'; + while (from < p) + *to++ = *from++; + *to = '\0'; /* Set the pointer ahead of the name which we just read. */ *pp = from;