2012-03-06 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gprof / corefile.c
index fd4644bfbd83f2b21f2467c5ceba4c5d3ab6b4bc..9f93ceeab3d67097ba4d6898f25db339d36edb1f 100644 (file)
@@ -22,6 +22,7 @@
 \f
 #include "gprof.h"
 #include "libiberty.h"
+#include "filenames.h"
 #include "search_list.h"
 #include "source.h"
 #include "symtab.h"
@@ -157,7 +158,8 @@ read_function_mappings (const char *filename)
   symbol_map_count = count;
 
   for (i = 0; i < symbol_map_count; ++i)
-    if (i == 0 || strcmp (symbol_map[i].file_name, symbol_map[i - 1].file_name))
+    if (i == 0
+        || filename_cmp (symbol_map[i].file_name, symbol_map[i - 1].file_name))
       symbol_map[i].is_first = 1;
 
   qsort (symbol_map, symbol_map_count, sizeof (struct function_map), cmp_symbol_map);
@@ -385,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;
        }
     }
 
@@ -572,7 +582,7 @@ core_create_function_syms (void)
   bfd_vma max_vma = 0;
   int cxxclass;
   long i;
-  struct function_map * found;
+  struct function_map * found = NULL;
   int core_has_func_syms = 0;
 
   switch (core_bfd->xvec->flavour)
@@ -599,10 +609,14 @@ core_create_function_syms (void)
       /* Don't create a symtab entry for a function that has
         a mapping to a file, unless it's the first function
         in the file.  */
-      found = (struct function_map *) bsearch (core_syms[i]->name, symbol_map,
-                                               symbol_map_count,
-                                               sizeof (struct function_map),
-                                               search_mapped_symbol);
+      if (symbol_map_count != 0)
+       {
+         /* Note: some systems (SunOS 5.8) crash if bsearch base argument
+            is NULL.  */
+         found = (struct function_map *) bsearch
+           (core_syms[i]->name, symbol_map, symbol_map_count,
+            sizeof (struct function_map), search_mapped_symbol);
+       }
       if (found == NULL || found->is_first)
        ++symtab.len;
     }
@@ -633,9 +647,14 @@ core_create_function_syms (void)
          continue;
        }
 
-      found = (struct function_map *) bsearch (core_syms[i]->name, symbol_map,
-                                               symbol_map_count,
-                      sizeof (struct function_map), search_mapped_symbol);
+      if (symbol_map_count != 0)
+       {
+         /* Note: some systems (SunOS 5.8) crash if bsearch base argument
+            is NULL.  */
+         found = (struct function_map *) bsearch
+           (core_syms[i]->name, symbol_map, symbol_map_count,
+            sizeof (struct function_map), search_mapped_symbol);
+       }
       if (found && ! found->is_first)
        continue;
 
@@ -766,7 +785,7 @@ core_create_line_syms (void)
          || (prev_line_num == dummy.line_num
              && prev_name != NULL
              && strcmp (prev_name, dummy.name) == 0
-             && strcmp (prev_filename, filename) == 0))
+             && filename_cmp (prev_filename, filename) == 0))
        continue;
 
       ++ltab.len;
@@ -831,7 +850,7 @@ core_create_line_syms (void)
       if (!get_src_info (vma, &filename, &ltab.limit->name, &ltab.limit->line_num)
          || (prev && prev->line_num == ltab.limit->line_num
              && strcmp (prev->name, ltab.limit->name) == 0
-             && strcmp (prev->file->name, filename) == 0))
+             && filename_cmp (prev->file->name, filename) == 0))
        continue;
 
       /* Make name pointer a malloc'ed string.  */
This page took 0.026144 seconds and 4 git commands to generate.