]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
This fixes bug 75614. It seems that a symbol can be named
authorJeremy Fitzhardinge <jeremy@valgrind.org>
Tue, 24 Feb 2004 23:46:06 +0000 (23:46 +0000)
committerJeremy Fitzhardinge <jeremy@valgrind.org>
Tue, 24 Feb 2004 23:46:06 +0000 (23:46 +0000)
"foo<bar::blat>"; normally stabs names are terminated by ':', but we
also need to keep track of <> pairs so we can ignore nested colons.

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

coregrind/vg_stabs.c

index b321bb1ffc8827fb4f0ee61037464d3f0ae3d707..a8456c7cc5dcdd82c099a1f10b7424e7c9d3fcea 100644 (file)
@@ -775,9 +775,26 @@ static SymType *stabtype_parser(SegInfo *si, SymType *def, Char **pp)
         Char *name;
         UInt off, sz;
         SymType *fieldty;
+        Int templ=0;
+
+        /* Skip past field name, which ends with ':' or '::' - but
+           '::' can appear within a template-mangled name, so keep
+           track of '<' and '>'. */
+        end = p;
+        while(*end) {
+            Char ch = *end++;
+
+            if (ch == '<')
+                templ++;
+            else if (ch == '>')
+                templ--;
+            else if (templ == 0 && ch == ':') {
+                end--;
+                break;
+            }
+        }
+        /* XXX check for *end != ':' */
 
-        end = SKIPPAST(p, ':', "struct/union field NAME");
-        end--;                 /* want to point to (first) ':' */
         if (end[1] == ':') {
            /* c++ method names end in :: */
            method = True;