* remote.c (remote_query_attached): Fix pasto in packet_ok result
[deliverable/binutils-gdb.git] / gprof / corefile.c
index f987c72855fe6063679d4d6aa9caff74bcb1b3a0..1f2575f361404ebb4573b04c41160a496de31b7d 100644 (file)
@@ -1,12 +1,13 @@
 /* corefile.c
 
-   Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
+   Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 \f
-#include "libiberty.h"
 #include "gprof.h"
+#include "libiberty.h"
 #include "search_list.h"
 #include "source.h"
 #include "symtab.h"
+#include "hist.h"
 #include "corefile.h"
+#include "safe-ctype.h"
 
 bfd *core_bfd;
-int core_num_syms;
-asymbol **core_syms;
+static int core_num_syms;
+static asymbol **core_syms;
 asection *core_text_sect;
 PTR core_text_space;
 
-int min_insn_size;
+static int min_insn_size;
 int offset_to_code;
 
 /* For mapping symbols to specific .o files during file ordering.  */
@@ -51,6 +54,13 @@ extern void tahoe_find_call (Sym *, bfd_vma, bfd_vma);
 extern void sparc_find_call (Sym *, bfd_vma, bfd_vma);
 extern void mips_find_call  (Sym *, bfd_vma, bfd_vma);
 
+static void
+parse_error (const char *filename)
+{
+  fprintf (stderr, _("%s: unable to parse mapping file %s.\n"), whoami, filename);
+  done (1);
+}
+
 static void
 read_function_mappings (const char *filename)
 {
@@ -73,21 +83,21 @@ read_function_mappings (const char *filename)
 
       matches = fscanf (file, "%[^\n:]", dummy);
       if (!matches)
-       {
-         fprintf (stderr, _("%s: unable to parse mapping file %s.\n"),
-                  whoami, filename);
-         done (1);
-       }
+       parse_error (filename);
 
       /* Just skip messages about files with no symbols.  */
       if (!strncmp (dummy, "No symbols in ", 14))
        {
-         fscanf (file, "\n");
+         matches = fscanf (file, "\n");
+         if (matches == EOF)
+           parse_error (filename);
          continue;
        }
 
       /* Don't care what else is on this line at this point.  */
-      fscanf (file, "%[^\n]\n", dummy);
+      matches = fscanf (file, "%[^\n]\n", dummy);
+      if (!matches)
+       parse_error (filename);
       count++;
     }
 
@@ -107,16 +117,14 @@ read_function_mappings (const char *filename)
 
       matches = fscanf (file, "%[^\n:]", dummy);
       if (!matches)
-       {
-         fprintf (stderr, _("%s: unable to parse mapping file %s.\n"),
-                  whoami, filename);
-         done (1);
-       }
+       parse_error (filename);
 
       /* Just skip messages about files with no symbols.  */
       if (!strncmp (dummy, "No symbols in ", 14))
        {
-         fscanf (file, "\n");
+         matches = fscanf (file, "\n");
+         if (matches == EOF)
+           parse_error (filename);
          continue;
        }
 
@@ -125,7 +133,9 @@ read_function_mappings (const char *filename)
       strcpy (symbol_map[count].file_name, dummy);
 
       /* Now we need the function name.  */
-      fscanf (file, "%[^\n]\n", dummy);
+      matches = fscanf (file, "%[^\n]\n", dummy);
+      if (!matches)
+       parse_error (filename);
       tmp = strrchr (dummy, ' ') + 1;
       symbol_map[count].function_name = xmalloc (strlen (tmp) + 1);
       strcpy (symbol_map[count].function_name, tmp);
@@ -141,6 +151,9 @@ void
 core_init (const char *aout_name)
 {
   int core_sym_bytes;
+  asymbol *synthsyms;
+  long synth_count;
+
   core_bfd = bfd_openr (aout_name, 0);
 
   if (!core_bfd)
@@ -151,7 +164,7 @@ core_init (const char *aout_name)
 
   if (!bfd_check_format (core_bfd, bfd_object))
     {
-      fprintf (stderr, _("%s: %s: not in a.out format\n"), whoami, aout_name);
+      fprintf (stderr, _("%s: %s: not in executable format\n"), whoami, aout_name);
       done (1);
     }
 
@@ -189,6 +202,23 @@ core_init (const char *aout_name)
       done (1);
     }
 
+  synth_count = bfd_get_synthetic_symtab (core_bfd, core_num_syms, core_syms,
+                                         0, NULL, &synthsyms);
+  if (synth_count > 0)
+    {
+      asymbol **symp;
+      long new_size;
+      long i;
+
+      new_size = (core_num_syms + synth_count + 1) * sizeof (*core_syms);
+      core_syms = xrealloc (core_syms, new_size);
+      symp = core_syms + core_num_syms;
+      core_num_syms += synth_count;
+      for (i = 0; i < synth_count; i++)
+       *symp++ = synthsyms + i;
+      *symp = 0;
+    }
+
   min_insn_size = 1;
   offset_to_code = 0;
 
@@ -216,17 +246,17 @@ core_init (const char *aout_name)
 void
 core_get_text_space (bfd *cbfd)
 {
-  core_text_space = (PTR) malloc ((unsigned int) core_text_sect->_raw_size);
+  core_text_space = malloc (bfd_get_section_size (core_text_sect));
 
   if (!core_text_space)
     {
       fprintf (stderr, _("%s: ran out room for %lu bytes of text space\n"),
-              whoami, (unsigned long) core_text_sect->_raw_size);
+              whoami, (unsigned long) bfd_get_section_size (core_text_sect));
       done (1);
     }
 
   if (!bfd_get_section_contents (cbfd, core_text_sect, core_text_space,
-                                (bfd_vma) 0, core_text_sect->_raw_size))
+                                0, bfd_get_section_size (core_text_sect)))
     {
       bfd_perror ("bfd_get_section_contents");
       free (core_text_space);
@@ -241,6 +271,11 @@ core_get_text_space (bfd *cbfd)
 void
 find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc)
 {
+  if (core_text_space == 0)
+    return;
+
+  hist_clip_symbol_address (&p_lowpc, &p_highpc);
+
   switch (bfd_get_arch (core_bfd))
     {
     case bfd_arch_i386:
@@ -331,8 +366,15 @@ core_sym_class (asymbol *sym)
 
   for (name = sym->name; *name; ++name)
     {
-      if (*name == '.' || *name == '$')
-       return 0;
+      if (*name == '$')
+        return 0;
+
+      /* Do not discard nested subprograms (those
+        which end with .NNN, where N are digits).  */
+      if (*name == '.')
+       for (name++; *name; name++)
+         if (! ISDIGIT (*name))
+           return 0;
     }
 
   /* On systems where the C compiler adds an underscore to all
@@ -385,7 +427,8 @@ get_src_info (bfd_vma addr, const char **filename, const char **name, int *line_
   else
     {
       DBG (AOUTDEBUG, printf ("[get_src_info] no info for 0x%lx (%s:%d,%s)\n",
-                             (long) addr, fname ? fname : "<unknown>", l,
+                             (unsigned long) addr,
+                             fname ? fname : "<unknown>", l,
                              func_name ? func_name : "<unknown>"));
       return FALSE;
     }
@@ -437,8 +480,7 @@ core_create_function_syms ()
       done (1);
     }
 
-  /* The "+ 2" is for the sentinels.  */
-  symtab.base = (Sym *) xmalloc ((symtab.len + 2) * sizeof (Sym));
+  symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym));
 
   /* Pass 2 - create symbols.  */
   symtab.limit = symtab.base;
@@ -530,7 +572,7 @@ core_create_function_syms ()
          }
       }
 
-      symtab.limit->is_func = TRUE;
+      symtab.limit->is_func = (core_syms[i]->flags & BSF_FUNCTION) != 0; 
       symtab.limit->is_bb_head = TRUE;
 
       if (class == 't')
@@ -547,12 +589,6 @@ core_create_function_syms ()
       else
        max_vma = MAX (symtab.limit->addr, max_vma);
 
-      /* If we see "main" without an initial '_', we assume names
-        are *not* prefixed by '_'.  */
-      if (symtab.limit->name[0] == 'm' && discard_underscores
-         && strcmp (symtab.limit->name, "main") == 0)
-       discard_underscores = 0;
-
       DBG (AOUTDEBUG, printf ("[core_create_function_syms] %ld %s 0x%lx\n",
                              (long) (symtab.limit - symtab.base),
                              symtab.limit->name,
@@ -560,19 +596,6 @@ core_create_function_syms ()
       ++symtab.limit;
     }
 
-  /* Create sentinels.  */
-  sym_init (symtab.limit);
-  symtab.limit->name = "<locore>";
-  symtab.limit->addr = 0;
-  symtab.limit->end_addr = min_vma - 1;
-  ++symtab.limit;
-
-  sym_init (symtab.limit);
-  symtab.limit->name = "<hicore>";
-  symtab.limit->addr = max_vma + 1;
-  symtab.limit->end_addr = ~(bfd_vma) 0;
-  ++symtab.limit;
-
   symtab.len = symtab.limit - symtab.base;
   symtab_finalize (&symtab);
 }
@@ -586,7 +609,7 @@ core_create_line_syms ()
   char *prev_name, *prev_filename;
   unsigned int prev_name_len, prev_filename_len;
   bfd_vma vma, min_vma = ~(bfd_vma) 0, max_vma = 0;
-  Sym *prev, dummy, *sentinel, *sym;
+  Sym *prev, dummy, *sym;
   const char *filename;
   int prev_line_num;
   Sym_Table ltab;
@@ -613,7 +636,7 @@ core_create_line_syms ()
   ltab.len = 0;
   prev_line_num = 0;
 
-  vma_high = core_text_sect->vma + core_text_sect->_raw_size;
+  vma_high = core_text_sect->vma + bfd_get_section_size (core_text_sect);
   for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size)
     {
       unsigned int len;
@@ -707,17 +730,12 @@ core_create_line_syms ()
       else
        {
          sym = sym_lookup(&symtab, ltab.limit->addr);
-         ltab.limit->is_static = sym->is_static;
+          if (sym)
+           ltab.limit->is_static = sym->is_static;
        }
 
       prev = ltab.limit;
 
-      /* If we see "main" without an initial '_', we assume names
-        are *not* prefixed by '_'.  */
-      if (ltab.limit->name[0] == 'm' && discard_underscores
-         && strcmp (ltab.limit->name, "main") == 0)
-       discard_underscores = 0;
-
       DBG (AOUTDEBUG, printf ("[core_create_line_syms] %lu %s 0x%lx\n",
                              (unsigned long) (ltab.limit - ltab.base),
                              ltab.limit->name,
@@ -725,21 +743,6 @@ core_create_line_syms ()
       ++ltab.limit;
     }
 
-  /* Update sentinels.  */
-  sentinel = sym_lookup (&symtab, (bfd_vma) 0);
-
-  if (sentinel
-      && strcmp (sentinel->name, "<locore>") == 0
-      && min_vma <= sentinel->end_addr)
-    sentinel->end_addr = min_vma - 1;
-
-  sentinel = sym_lookup (&symtab, ~(bfd_vma) 0);
-
-  if (sentinel
-      && strcmp (sentinel->name, "<hicore>") == 0
-      && max_vma >= sentinel->addr)
-    sentinel->addr = max_vma + 1;
-
   /* Copy in function symbols.  */
   memcpy (ltab.limit, symtab.base, symtab.len * sizeof (Sym));
   ltab.limit += symtab.len;
This page took 0.027829 seconds and 4 git commands to generate.