]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* corefile.c (core_sym_class): Allow for multiple iterations of
authorNick Clifton <nickc@redhat.com>
Tue, 7 Jun 2011 13:33:20 +0000 (13:33 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 7 Jun 2011 13:33:20 +0000 (13:33 +0000)
clone clones and subprograms.

gprof/ChangeLog
gprof/corefile.c

index 6b907edbe9318623b3bc6f26fd30b4c4b7351904..3e9a76ed43f67f4fb212fc7a9cf1bbeb8f388e2a 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-07  David Warme  <dwarme@groupw.com>
+
+       * corefile.c (core_sym_class): Allow for multiple iterations of
+       clone clones and subprograms.
+
 2011-04-28  Jonathan Nieder  <jrnieder@gmail.com>
 
        * cg_print.c (print_header): Add no-c-format comment to prevent
index 2d772f980319be5f5b563a43db9dfd7d5a244827..e25d19bb06c8e0a61be2e951b9365b7e341b5a10 100644 (file)
@@ -387,19 +387,27 @@ core_sym_class (asymbol *sym)
       if (*name == '$')
         return 0;
 
-      if (*name == '.')
+      while (*name == '.')
        {
-         /* Allow GCC cloned functions.  */
-         if (strlen (name) > 7 && strncmp (name, ".clone.", 7) == 0)
-           name += 6;
+         /* Allow both nested subprograms (which end with ".NNN", where N is
+            a digit) and GCC cloned functions (which contain ".clone").
+            Allow for multiple iterations of both - apparently GCC can clone
+            clones and subprograms.  */
+         int digit_seen = 0;
+#define CLONE_NAME      ".clone."
+#define CLONE_NAME_LEN  strlen (CLONE_NAME)
+             
+         if (strlen (name) > CLONE_NAME_LEN
+             && strncmp (name, CLONE_NAME, CLONE_NAME_LEN) == 0)
+           name += CLONE_NAME_LEN - 1;
 
-         /* Do not discard nested subprograms (those
-            which end with .NNN, where N are digits).  */
          for (name++; *name; name++)
-           if (! ISDIGIT (*name))
+           if (digit_seen && *name == '.')
+             break;
+           else if (ISDIGIT (*name))
+             digit_seen = 1;
+           else
              return 0;
-
-         break;
        }
     }