]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix stabs decoder to allow :: in a method name provided it is inside
authorTom Hughes <tom@compton.nu>
Wed, 16 Nov 2005 00:04:58 +0000 (00:04 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 16 Nov 2005 00:04:58 +0000 (00:04 +0000)
a template argument list. Fixes bug #113126.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5138

coregrind/m_debuginfo/stabs.c

index 84ab763f2728291ef9ba499d8520cbef7926b6a3..4efd4c3ce4fb213857cc517919eb7d1c926862dd 100644 (file)
@@ -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) {