aboutsummaryrefslogtreecommitdiff
path: root/binutils/stabs.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1999-07-08 00:49:04 +0000
committerIan Lance Taylor <ian@airs.com>1999-07-08 00:49:04 +0000
commitc602a1658f73f9999cd59db8b5e26a03a87631af (patch)
tree89f466589e4eac1c5ef572d1bb76349955aaa115 /binutils/stabs.c
parentc2a1d49a279f00dd1545d4d4ab4842b973668298 (diff)
downloadgdb-c602a1658f73f9999cd59db8b5e26a03a87631af.zip
gdb-c602a1658f73f9999cd59db8b5e26a03a87631af.tar.gz
gdb-c602a1658f73f9999cd59db8b5e26a03a87631af.tar.bz2
* stabs.c (parse_stab_type): Fix handling of template names with
template parameters containing `::'. (stab_demangle_type): Handle a qualified name in a pointer to member.
Diffstat (limited to 'binutils/stabs.c')
-rw-r--r--binutils/stabs.c67
1 files changed, 44 insertions, 23 deletions
diff --git a/binutils/stabs.c b/binutils/stabs.c
index a47b3bd..945f876 100644
--- a/binutils/stabs.c
+++ b/binutils/stabs.c
@@ -1,5 +1,5 @@
/* stabs.c -- Parse stabs debugging information
- Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
Written by Ian Lance Taylor <ian@cygnus.com>.
This file is part of GNU Binutils.
@@ -1316,14 +1316,21 @@ parse_stab_type (dhandle, info, typename, pp, slotp)
bad_stab (orig);
return DEBUG_TYPE_NULL;
}
- while (q1 != NULL && p > q1 && p[1] == ':')
+ if (q1 != NULL && p > q1 && p[1] == ':')
{
- q2 = strchr (q1, '>');
- if (q2 == NULL || q2 < p)
- break;
- p += 2;
- p = strchr (p, ':');
- if (p == NULL)
+ int nest = 0;
+
+ for (q2 = q1; *q2 != '\0'; ++q2)
+ {
+ if (*q2 == '<')
+ ++nest;
+ else if (*q2 == '>')
+ --nest;
+ else if (*q2 == ':' && nest == 0)
+ break;
+ }
+ p = q2;
+ if (*p != ':')
{
bad_stab (orig);
return DEBUG_TYPE_NULL;
@@ -4785,6 +4792,7 @@ stab_demangle_type (minfo, pp, ptype)
case 'O':
{
boolean memberp, constp, volatilep;
+ debug_type class_type = DEBUG_TYPE_NULL;
debug_type *args;
boolean varargs;
unsigned int n;
@@ -4797,19 +4805,40 @@ stab_demangle_type (minfo, pp, ptype)
varargs = false;
++*pp;
- if (! isdigit ((unsigned char) **pp))
+ if (isdigit ((unsigned char) **pp))
{
- stab_bad_demangle (orig);
- return false;
+ n = stab_demangle_count (pp);
+ if (strlen (*pp) < n)
+ {
+ stab_bad_demangle (orig);
+ return false;
+ }
+ name = *pp;
+ *pp += n;
+
+ if (ptype != NULL)
+ {
+ class_type = stab_find_tagged_type (minfo->dhandle,
+ minfo->info,
+ name, (int) n,
+ DEBUG_KIND_CLASS);
+ if (class_type == DEBUG_TYPE_NULL)
+ return false;
+ }
}
- n = stab_demangle_count (pp);
- if (strlen (*pp) < n)
+ else if (**pp == 'Q')
+ {
+ if (! stab_demangle_qualified (minfo, pp,
+ (ptype == NULL
+ ? (debug_type *) NULL
+ : &class_type)))
+ return false;
+ }
+ else
{
stab_bad_demangle (orig);
return false;
}
- name = *pp;
- *pp += n;
if (memberp)
{
@@ -4851,14 +4880,6 @@ stab_demangle_type (minfo, pp, ptype)
if (ptype != NULL)
{
- debug_type class_type;
-
- class_type = stab_find_tagged_type (minfo->dhandle, minfo->info,
- name, (int) n,
- DEBUG_KIND_CLASS);
- if (class_type == DEBUG_TYPE_NULL)
- return false;
-
if (! memberp)
*ptype = debug_make_offset_type (minfo->dhandle, class_type,
*ptype);