From: Tom Hughes Date: Wed, 16 Nov 2005 00:04:58 +0000 (+0000) Subject: Fix stabs decoder to allow :: in a method name provided it is inside X-Git-Tag: svn/VALGRIND_3_1_0~94 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=87c289f91da9f62561b8384865d16b7076f39843;p=thirdparty%2Fvalgrind.git Fix stabs decoder to allow :: in a method name provided it is inside a template argument list. Fixes bug #113126. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5138 --- diff --git a/coregrind/m_debuginfo/stabs.c b/coregrind/m_debuginfo/stabs.c index 84ab763f27..4efd4c3ce4 100644 --- a/coregrind/m_debuginfo/stabs.c +++ b/coregrind/m_debuginfo/stabs.c @@ -852,29 +852,39 @@ static SymType *stabtype_parser(SegInfo *si, SymType *def, Char **pp) } while(*p != ';') { - Char *end; + Char *start = p; Char *name; UInt off, sz; SymType *fieldty; - end = SKIPPAST(p, ':', "method name") - 1; - - if (end[1] == ':') { + if (VG_(strncmp)(p, "operator<::", 11) == 0 || + VG_(strncmp)(p, "operator>::", 11) == 0 || + VG_(strncmp)(p, "operator<=::", 12) == 0 || + VG_(strncmp)(p, "operator>=::", 12) == 0 || + VG_(strncmp)(p, "operator<<::", 12) == 0 || + VG_(strncmp)(p, "operator>>::", 12) == 0 || + VG_(strncmp)(p, "operator->::", 12) == 0) { + p = SKIPPAST(p, ':', "member name"); + } else { + p = templ_name(p); + EXPECT(':', "member name"); + } + + if (p[0] == ':') { /* c++ method names end in :: */ method = True; - if (VG_(strncmp)(p, "op$", 3) == 0) { + if (VG_(strncmp)(start, "op$", 3) == 0) { /* According to stabs.info, operators are named ( "op$::" OP '.' ), where OP is +=, etc. Current gcc doesn't seem to use this; operators just appear as "operator==::" */ - end = SKIPPAST(end, '.', "op$ name"); + p = SKIPPAST(p, '.', "op$ name"); } - name = ML_(addStr)(si, p, end-p); - p = end+2; + name = ML_(addStr)(si, start, p-start-1); + p = p+1; } else { - name = ML_(addStr)(si, p, end-p); - p = end+1; + name = ML_(addStr)(si, start, p-start-1); } if (method) {