2004-01-25 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / gdb / symfile.c
index 9615987cf853742e42b6a525ffa19b789253d816..076fc456d184cde1a3d51c26fe9f87672e488832 100644 (file)
@@ -1,7 +1,7 @@
 /* Generic symbol file reading for the GNU debugger, GDB.
 
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
@@ -199,20 +199,6 @@ int auto_solib_add = 1;
 int auto_solib_limit;
 \f
 
-/* Since this function is called from within qsort, in an ANSI environment
-   it must conform to the prototype for qsort, which specifies that the
-   comparison function takes two "void *" pointers. */
-
-static int
-compare_symbols (const void *s1p, const void *s2p)
-{
-  register struct symbol **s1, **s2;
-
-  s1 = (struct symbol **) s1p;
-  s2 = (struct symbol **) s2p;
-  return (strcmp (SYMBOL_PRINT_NAME (*s1), SYMBOL_PRINT_NAME (*s2)));
-}
-
 /* This compares two partial symbols by names, using strcmp_iw_ordered
    for the comparison.  */
 
@@ -222,8 +208,8 @@ compare_psymbols (const void *s1p, const void *s2p)
   struct partial_symbol *const *s1 = s1p;
   struct partial_symbol *const *s2 = s2p;
 
-  return strcmp_iw_ordered (SYMBOL_PRINT_NAME (*s1),
-                           SYMBOL_PRINT_NAME (*s2));
+  return strcmp_iw_ordered (SYMBOL_NATURAL_NAME (*s1),
+                           SYMBOL_NATURAL_NAME (*s2));
 }
 
 void
@@ -236,38 +222,6 @@ sort_pst_symbols (struct partial_symtab *pst)
         compare_psymbols);
 }
 
-/* Call sort_block_syms to sort alphabetically the symbols of one block.  */
-
-void
-sort_block_syms (register struct block *b)
-{
-  qsort (&BLOCK_SYM (b, 0), BLOCK_NSYMS (b),
-        sizeof (struct symbol *), compare_symbols);
-}
-
-/* Call sort_symtab_syms to sort alphabetically
-   the symbols of each block of one symtab.  */
-
-void
-sort_symtab_syms (register struct symtab *s)
-{
-  register struct blockvector *bv;
-  int nbl;
-  int i;
-  register struct block *b;
-
-  if (s == 0)
-    return;
-  bv = BLOCKVECTOR (s);
-  nbl = BLOCKVECTOR_NBLOCKS (bv);
-  for (i = 0; i < nbl; i++)
-    {
-      b = BLOCKVECTOR_BLOCK (bv, i);
-      if (BLOCK_SHOULD_SORT (b))
-       sort_block_syms (b);
-    }
-}
-
 /* Make a null terminated copy of the string at PTR with SIZE characters in
    the obstack pointed to by OBSTACKP .  Returns the address of the copy.
    Note that the string at PTR does not have to be null terminated, I.E. it
@@ -276,13 +230,13 @@ sort_symtab_syms (register struct symtab *s)
 char *
 obsavestring (const char *ptr, int size, struct obstack *obstackp)
 {
-  register char *p = (char *) obstack_alloc (obstackp, size + 1);
+  char *p = (char *) obstack_alloc (obstackp, size + 1);
   /* Open-coded memcpy--saves function call time.  These strings are usually
      short.  FIXME: Is this really still true with a compiler that can
      inline memcpy? */
   {
-    register const char *p1 = ptr;
-    register char *p2 = p;
+    const char *p1 = ptr;
+    char *p2 = p;
     const char *end = ptr + size;
     while (p1 != end)
       *p2++ = *p1++;
@@ -298,8 +252,8 @@ char *
 obconcat (struct obstack *obstackp, const char *s1, const char *s2,
          const char *s3)
 {
-  register int len = strlen (s1) + strlen (s2) + strlen (s3) + 1;
-  register char *val = (char *) obstack_alloc (obstackp, len);
+  int len = strlen (s1) + strlen (s2) + strlen (s3) + 1;
+  char *val = (char *) obstack_alloc (obstackp, len);
   strcpy (val, s1);
   strcat (val, s2);
   strcat (val, s3);
@@ -322,7 +276,7 @@ decrement_reading_symtab (void *dummy)
    case inline.  */
 
 struct symtab *
-psymtab_to_symtab (register struct partial_symtab *pst)
+psymtab_to_symtab (struct partial_symtab *pst)
 {
   /* If it's been looked up before, return it. */
   if (pst->symtab)
@@ -359,8 +313,8 @@ init_entry_point_info (struct objfile *objfile)
       /* Examination of non-executable.o files.  Short-circuit this stuff.  */
       objfile->ei.entry_point = INVALID_ENTRY_POINT;
     }
-  objfile->ei.entry_file_lowpc = INVALID_ENTRY_LOWPC;
-  objfile->ei.entry_file_highpc = INVALID_ENTRY_HIGHPC;
+  objfile->ei.deprecated_entry_file_lowpc = INVALID_ENTRY_LOWPC;
+  objfile->ei.deprecated_entry_file_highpc = INVALID_ENTRY_HIGHPC;
   objfile->ei.entry_func_lowpc = INVALID_ENTRY_LOWPC;
   objfile->ei.entry_func_highpc = INVALID_ENTRY_HIGHPC;
   objfile->ei.main_func_lowpc = INVALID_ENTRY_LOWPC;
@@ -401,6 +355,22 @@ find_lowest_section (bfd *abfd, asection *sect, void *obj)
     *lowest = sect;
 }
 
+/* Create a new section_addr_info, with room for NUM_SECTIONS.  */
+
+struct section_addr_info *
+alloc_section_addr_info (size_t num_sections)
+{
+  struct section_addr_info *sap;
+  size_t size;
+
+  size = (sizeof (struct section_addr_info)
+         +  sizeof (struct other_sections) * (num_sections - 1));
+  sap = (struct section_addr_info *) xmalloc (size);
+  memset (sap, 0, size);
+  sap->num_sections = num_sections;
+
+  return sap;
+}
 
 /* Build (allocate and populate) a section_addr_info struct from
    an existing section table. */
@@ -413,14 +383,13 @@ build_section_addr_info_from_section_table (const struct section_table *start,
   const struct section_table *stp;
   int oidx;
 
-  sap = xmalloc (sizeof (struct section_addr_info));
-  memset (sap, 0, sizeof (struct section_addr_info));
+  sap = alloc_section_addr_info (end - start);
 
   for (stp = start, oidx = 0; stp != end; stp++)
     {
       if (bfd_get_section_flags (stp->bfd, 
                                 stp->the_bfd_section) & (SEC_ALLOC | SEC_LOAD)
-         && oidx < MAX_SECTIONS)
+         && oidx < end - start)
        {
          sap->other[oidx].addr = stp->addr;
          sap->other[oidx].name 
@@ -441,7 +410,7 @@ free_section_addr_info (struct section_addr_info *sap)
 {
   int idx;
 
-  for (idx = 0; idx < MAX_SECTIONS; idx++)
+  for (idx = 0; idx < sap->num_sections; idx++)
     if (sap->other[idx].name)
       xfree (sap->other[idx].name);
   xfree (sap);
@@ -514,14 +483,16 @@ default_symfile_offsets (struct objfile *objfile,
 {
   int i;
 
-  objfile->num_sections = SECT_OFF_MAX;
+  objfile->num_sections = bfd_count_sections (objfile->obfd);
   objfile->section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
-  memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS);
+    obstack_alloc (&objfile->psymbol_obstack, 
+                  SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
+  memset (objfile->section_offsets, 0, 
+         SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
 
   /* Now calculate offsets for section that were specified by the
      caller. */
-  for (i = 0; i < MAX_SECTIONS && addrs->other[i].name; i++)
+  for (i = 0; i < addrs->num_sections && addrs->other[i].name; i++)
     {
       struct other_sections *osp ;
 
@@ -581,26 +552,11 @@ syms_from_objfile (struct objfile *objfile,
                   int mainline,
                    int verbo)
 {
-  asection *lower_sect;
-  asection *sect;
-  CORE_ADDR lower_offset;
-  struct section_addr_info local_addr;
+  struct section_addr_info *local_addr = NULL;
   struct cleanup *old_chain;
-  int i;
 
   gdb_assert (! (addrs && offsets));
 
-  /* If ADDRS and OFFSETS are both NULL, put together a dummy address
-     list.  We now establish the convention that an addr of zero means
-     no load address was specified. */
-  if (! addrs && ! offsets)
-    {
-      memset (&local_addr, 0, sizeof (local_addr));
-      addrs = &local_addr;
-    }
-
-  /* Now either addrs or offsets is non-zero.  */
-
   init_entry_point_info (objfile);
   find_sym_fns (objfile);
 
@@ -611,6 +567,19 @@ syms_from_objfile (struct objfile *objfile,
      if an error occurs during symbol reading.  */
   old_chain = make_cleanup_free_objfile (objfile);
 
+  /* If ADDRS and OFFSETS are both NULL, put together a dummy address
+     list.  We now establish the convention that an addr of zero means
+     no load address was specified. */
+  if (! addrs && ! offsets)
+    {
+      local_addr 
+       = alloc_section_addr_info (bfd_count_sections (objfile->obfd));
+      make_cleanup (xfree, local_addr);
+      addrs = local_addr;
+    }
+
+  /* Now either addrs or offsets is non-zero.  */
+
   if (mainline)
     {
       /* We will modify the main symbol table, make sure that all its users
@@ -639,8 +608,13 @@ syms_from_objfile (struct objfile *objfile,
 
      We no longer warn if the lowest section is not a text segment (as
      happens for the PA64 port.  */
-  if (!mainline)
+  if (!mainline && addrs && addrs->other[0].name)
     {
+      asection *lower_sect;
+      asection *sect;
+      CORE_ADDR lower_offset;
+      int i;
+
       /* Find lowest loadable section to be used as starting point for 
          continguous sections. FIXME!! won't work without call to find
         .text first, but this assumes text is lowest section. */
@@ -672,9 +646,7 @@ syms_from_objfile (struct objfile *objfile,
         (the loadable section directly below it in memory).
         this_offset = lower_offset = lower_addr - lower_orig_addr */
 
-      /* Calculate offsets for sections. */
-      if (addrs)
-        for (i=0 ; i < MAX_SECTIONS && addrs->other[i].name; i++)
+        for (i = 0; i < addrs->num_sections && addrs->other[i].name; i++)
           {
             if (addrs->other[i].addr != 0)
               {
@@ -724,7 +696,7 @@ syms_from_objfile (struct objfile *objfile,
       init_objfile_sect_indices (objfile);
     }
 
-#ifndef IBM6000_TARGET
+#ifndef DEPRECATED_IBM6000_TARGET
   /* This is a SVR4/SunOS specific hack, I think.  In any event, it
      screws RS/6000.  sym_offsets should be doing this sort of thing,
      because it knows the mapping between bfd sections and
@@ -758,7 +730,7 @@ syms_from_objfile (struct objfile *objfile,
          int i;
 
            for (i = 0; 
-                !s_addr && i < MAX_SECTIONS && addrs->other[i].name;
+                !s_addr && i < addrs->num_sections && addrs->other[i].name;
                 i++)
              if (strcmp (bfd_section_name (s->objfile->obfd, 
                                            s->the_bfd_section), 
@@ -772,7 +744,7 @@ syms_from_objfile (struct objfile *objfile,
          s->offset += s_addr;
        }
     }
-#endif /* not IBM6000_TARGET */
+#endif /* not DEPRECATED_IBM6000_TARGET */
 
   (*objfile->sf->sym_read) (objfile, mainline);
 
@@ -792,13 +764,6 @@ syms_from_objfile (struct objfile *objfile,
   /* Discard cleanups as symbol reading was successful.  */
 
   discard_cleanups (old_chain);
-
-  /* Call this after reading in a new symbol table to give target
-     dependent code a crack at the new symbols.  For instance, this
-     could be used to update the values of target-specific symbols GDB
-     needs to keep track of (such as _sigtramp, or whatever).  */
-
-  TARGET_SYMFILE_POSTREAD (objfile);
 }
 
 /* Perform required actions after either reading in the initial
@@ -856,10 +821,8 @@ symbol_file_add_with_addrs_or_offsets (char *name, int from_tty,
   struct partial_symtab *psymtab;
   char *debugfile;
   bfd *abfd;
-  struct section_addr_info orig_addrs;
-  
-  if (addrs)
-    orig_addrs = *addrs;
+  struct section_addr_info *orig_addrs;
+  struct cleanup *my_cleanups;
 
   /* Open a bfd for the file, and give user a chance to burp if we'd be
      interactively wiping out any existing symbols.  */
@@ -874,43 +837,32 @@ symbol_file_add_with_addrs_or_offsets (char *name, int from_tty,
 
   objfile = allocate_objfile (abfd, flags);
 
-  /* If the objfile uses a mapped symbol file, and we have a psymtab for
-     it, then skip reading any symbols at this time. */
+  orig_addrs = alloc_section_addr_info (bfd_count_sections (abfd));
+  my_cleanups = make_cleanup (xfree, orig_addrs);
+  if (addrs)
+    {
+      int i;
+      orig_addrs->num_sections = addrs->num_sections;
+      for (i = 0; i < addrs->num_sections; i++)
+       orig_addrs->other[i] = addrs->other[i];
+    }
 
-  if ((objfile->flags & OBJF_MAPPED) && (objfile->flags & OBJF_SYMS))
+  /* We either created a new mapped symbol table, mapped an existing
+     symbol table file which has not had initial symbol reading
+     performed, or need to read an unmapped symbol table. */
+  if (from_tty || info_verbose)
     {
-      /* We mapped in an existing symbol table file that already has had
-         initial symbol reading performed, so we can skip that part.  Notify
-         the user that instead of reading the symbols, they have been mapped.
-       */
-      if (from_tty || info_verbose)
+      if (pre_add_symbol_hook)
+       pre_add_symbol_hook (name);
+      else
        {
-         printf_filtered ("Mapped symbols for %s...", name);
+         printf_unfiltered ("Reading symbols from %s...", name);
          wrap_here ("");
          gdb_flush (gdb_stdout);
        }
-      init_entry_point_info (objfile);
-      find_sym_fns (objfile);
-    }
-  else
-    {
-      /* We either created a new mapped symbol table, mapped an existing
-         symbol table file which has not had initial symbol reading
-         performed, or need to read an unmapped symbol table. */
-      if (from_tty || info_verbose)
-       {
-         if (pre_add_symbol_hook)
-           pre_add_symbol_hook (name);
-         else
-           {
-             printf_filtered ("Reading symbols from %s...", name);
-             wrap_here ("");
-             gdb_flush (gdb_stdout);
-           }
-       }
-      syms_from_objfile (objfile, addrs, offsets, num_offsets,
-                         mainline, from_tty);
     }
+  syms_from_objfile (objfile, addrs, offsets, num_offsets,
+                    mainline, from_tty);
 
   /* We now have at least a partial symbol table.  Check to see if the
      user requested that all symbols be read on initial access via either
@@ -921,7 +873,7 @@ symbol_file_add_with_addrs_or_offsets (char *name, int from_tty,
     {
       if (from_tty || info_verbose)
        {
-         printf_filtered ("expanding to full symbols...");
+         printf_unfiltered ("expanding to full symbols...");
          wrap_here ("");
          gdb_flush (gdb_stdout);
        }
@@ -940,7 +892,7 @@ symbol_file_add_with_addrs_or_offsets (char *name, int from_tty,
       if (addrs != NULL)
        {
          objfile->separate_debug_objfile
-            = symbol_file_add (debugfile, from_tty, &orig_addrs, 0, flags);
+            = symbol_file_add (debugfile, from_tty, orig_addrs, 0, flags);
        }
       else
        {
@@ -960,7 +912,7 @@ symbol_file_add_with_addrs_or_offsets (char *name, int from_tty,
   if (!have_partial_symbols () && !have_full_symbols ())
     {
       wrap_here ("");
-      printf_filtered ("(no debugging symbols found)...");
+      printf_unfiltered ("(no debugging symbols found)...");
       wrap_here ("");
     }
 
@@ -970,7 +922,7 @@ symbol_file_add_with_addrs_or_offsets (char *name, int from_tty,
        post_add_symbol_hook ();
       else
        {
-         printf_filtered ("done.\n");
+         printf_unfiltered ("done.\n");
        }
     }
 
@@ -979,6 +931,8 @@ symbol_file_add_with_addrs_or_offsets (char *name, int from_tty,
      time.  */
   gdb_flush (gdb_stdout);
 
+  do_cleanups (my_cleanups);
+
   if (objfile->sf == NULL)
     return objfile;    /* No symbols. */
 
@@ -1234,20 +1188,16 @@ symbol_file_command (char *args, int from_tty)
       cleanups = make_cleanup_freeargv (argv);
       while (*argv != NULL)
        {
-         if (STREQ (*argv, "-mapped"))
-           flags |= OBJF_MAPPED;
-         else 
-           if (STREQ (*argv, "-readnow"))
-             flags |= OBJF_READNOW;
-           else 
-             if (**argv == '-')
-               error ("unknown option `%s'", *argv);
-             else
-               {
-                  name = *argv;
-
-                 symbol_file_add_main_1 (name, from_tty, flags);
-               }
+         if (strcmp (*argv, "-readnow") == 0)
+           flags |= OBJF_READNOW;
+         else if (**argv == '-')
+           error ("unknown option `%s'", *argv);
+         else
+           {
+             name = *argv;
+             
+             symbol_file_add_main_1 (name, from_tty, flags);
+           }
          argv++;
        }
 
@@ -1393,10 +1343,6 @@ find_sym_fns (struct objfile *objfile)
       || our_flavour == bfd_target_tekhex_flavour)
     return;    /* No symbols. */
 
-  /* Special kludge for apollo.  See dstread.c.  */
-  if (STREQN (our_target, "apollo", 6))
-    our_flavour = (enum bfd_flavour) -2;
-
   for (sf = symtab_fns; sf != NULL; sf = sf->next)
     {
       if (our_flavour == sf->sym_flavour)
@@ -1681,7 +1627,6 @@ print_transfer_performance (struct ui_file *stream,
    instead a call to target_link() (in target.c) would supply the
    value to use. We are now discontinuing this type of ad hoc syntax. */
 
-/* ARGSUSED */
 static void
 add_symbol_file_command (char *args, int from_tty)
 {
@@ -1696,15 +1641,21 @@ add_symbol_file_command (char *args, int from_tty)
   int expecting_sec_name = 0;
   int expecting_sec_addr = 0;
 
-  struct
+  struct sect_opt
   {
     char *name;
     char *value;
-  } sect_opts[SECT_OFF_MAX];
+  };
 
-  struct section_addr_info section_addrs;
+  struct section_addr_info *section_addrs;
+  struct sect_opt *sect_opts = NULL;
+  size_t num_sect_opts = 0;
   struct cleanup *my_cleanups = make_cleanup (null_cleanup, NULL);
 
+  num_sect_opts = 16;
+  sect_opts = (struct sect_opt *) xmalloc (num_sect_opts 
+                                          * sizeof (struct sect_opt));
+
   dont_repeat ();
 
   if (args == NULL)
@@ -1713,9 +1664,6 @@ add_symbol_file_command (char *args, int from_tty)
   /* Make a copy of the string that we can safely write into. */
   args = xstrdup (args);
 
-  /* Ensure section_addrs is initialized */
-  memset (&section_addrs, 0, sizeof (section_addrs));
-
   while (*args != '\000')
     {
       /* Any leading spaces? */
@@ -1748,7 +1696,14 @@ add_symbol_file_command (char *args, int from_tty)
                to load the program. */
            sect_opts[section_index].name = ".text";
            sect_opts[section_index].value = arg;
-           section_index++;              
+           if (++section_index > num_sect_opts) 
+             {
+               num_sect_opts *= 2;
+               sect_opts = ((struct sect_opt *) 
+                            xrealloc (sect_opts,
+                                      num_sect_opts 
+                                      * sizeof (struct sect_opt)));
+             }
          }
        else
          {
@@ -1757,19 +1712,13 @@ add_symbol_file_command (char *args, int from_tty)
 
            if (*arg == '-')
              {
-               if (strcmp (arg, "-mapped") == 0)
-                 flags |= OBJF_MAPPED;
-               else 
-                 if (strcmp (arg, "-readnow") == 0)
-                   flags |= OBJF_READNOW;
-                 else 
-                   if (strcmp (arg, "-s") == 0)
-                     {
-                       if (section_index >= SECT_OFF_MAX)
-                         error ("Too many sections specified.");
-                       expecting_sec_name = 1;
-                       expecting_sec_addr = 1;
-                     }
+               if (strcmp (arg, "-readnow") == 0)
+                 flags |= OBJF_READNOW;
+               else if (strcmp (arg, "-s") == 0)
+                 {
+                   expecting_sec_name = 1;
+                   expecting_sec_addr = 1;
+                 }
              }
            else
              {
@@ -1783,7 +1732,14 @@ add_symbol_file_command (char *args, int from_tty)
                    {
                      sect_opts[section_index].value = arg;
                      expecting_sec_addr = 0;
-                     section_index++;            
+                     if (++section_index > num_sect_opts) 
+                       {
+                         num_sect_opts *= 2;
+                         sect_opts = ((struct sect_opt *) 
+                                      xrealloc (sect_opts,
+                                                num_sect_opts 
+                                                * sizeof (struct sect_opt)));
+                       }
                    }
                  else
                    error ("USAGE: add-symbol-file <filename> <textaddress> [-mapped] [-readnow] [-s <secname> <addr>]*");
@@ -1798,24 +1754,22 @@ add_symbol_file_command (char *args, int from_tty)
      statements because local_hex_string returns a local static
      string. */
  
-  printf_filtered ("add symbol table from file \"%s\" at\n", filename);
+  printf_unfiltered ("add symbol table from file \"%s\" at\n", filename);
+  section_addrs = alloc_section_addr_info (section_index);
+  make_cleanup (xfree, section_addrs);
   for (i = 0; i < section_index; i++)
     {
       CORE_ADDR addr;
       char *val = sect_opts[i].value;
       char *sec = sect_opts[i].name;
  
-      val = sect_opts[i].value;
-      if (val[0] == '0' && val[1] == 'x')
-       addr = strtoul (val+2, NULL, 16);
-      else
-       addr = strtoul (val, NULL, 10);
+      addr = parse_and_eval_address (val);
 
       /* Here we store the section offsets in the order they were
          entered on the command line. */
-      section_addrs.other[sec_num].name = sec;
-      section_addrs.other[sec_num].addr = addr;
-      printf_filtered ("\t%s_addr = %s\n",
+      section_addrs->other[sec_num].name = sec;
+      section_addrs->other[sec_num].addr = addr;
+      printf_unfiltered ("\t%s_addr = %s\n",
                       sec, 
                       local_hex_string ((unsigned long)addr));
       sec_num++;
@@ -1830,7 +1784,7 @@ add_symbol_file_command (char *args, int from_tty)
   if (from_tty && (!query ("%s", "")))
     error ("Not confirmed.");
 
-  symbol_file_add (filename, from_tty, &section_addrs, 0, flags);
+  symbol_file_add (filename, from_tty, section_addrs, 0, flags);
 
   /* Getting new symbols may change our opinion about what is
      frameless.  */
@@ -1868,7 +1822,7 @@ reread_symbols (void)
     {
       if (objfile->obfd)
        {
-#ifdef IBM6000_TARGET
+#ifdef DEPRECATED_IBM6000_TARGET
          /* If this object is from a shared library, then you should
             stat on the library name, not member name. */
 
@@ -1880,7 +1834,7 @@ reread_symbols (void)
          if (res != 0)
            {
              /* FIXME, should use print_sys_errmsg but it's not filtered. */
-             printf_filtered ("`%s' has disappeared; keeping its symbols.\n",
+             printf_unfiltered ("`%s' has disappeared; keeping its symbols.\n",
                               objfile->name);
              continue;
            }
@@ -1892,7 +1846,7 @@ reread_symbols (void)
              int num_offsets;
              char *obfd_filename;
 
-             printf_filtered ("`%s' has changed; re-reading symbols.\n",
+             printf_unfiltered ("`%s' has changed; re-reading symbols.\n",
                               objfile->name);
 
              /* There are various functions like symbol_file_add,
@@ -1927,8 +1881,10 @@ reread_symbols (void)
              /* Save the offsets, we will nuke them with the rest of the
                 psymbol_obstack.  */
              num_offsets = objfile->num_sections;
-             offsets = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
-             memcpy (offsets, objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
+             offsets = ((struct section_offsets *) 
+                        alloca (SIZEOF_N_SECTION_OFFSETS (num_offsets)));
+             memcpy (offsets, objfile->section_offsets, 
+                     SIZEOF_N_SECTION_OFFSETS (num_offsets));
 
              /* Nuke all the state that we will re-read.  Much of the following
                 code which sets things to NULL really is necessary to tell
@@ -1962,13 +1918,16 @@ reread_symbols (void)
              objfile->symtabs = NULL;
              objfile->psymtabs = NULL;
              objfile->free_psymtabs = NULL;
+             objfile->cp_namespace_symtab = NULL;
              objfile->msymbols = NULL;
+             objfile->sym_private = NULL;
              objfile->minimal_symbol_count = 0;
              memset (&objfile->msymbol_hash, 0,
                      sizeof (objfile->msymbol_hash));
              memset (&objfile->msymbol_demangled_hash, 0,
                      sizeof (objfile->msymbol_demangled_hash));
              objfile->fundamental_types = NULL;
+             clear_objfile_data (objfile);
              if (objfile->sf != NULL)
                {
                  (*objfile->sf->sym_finish) (objfile);
@@ -1996,8 +1955,10 @@ reread_symbols (void)
              /* We use the same section offsets as from last time.  I'm not
                 sure whether that is always correct for shared libraries.  */
              objfile->section_offsets = (struct section_offsets *)
-               obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
-             memcpy (objfile->section_offsets, offsets, SIZEOF_SECTION_OFFSETS);
+               obstack_alloc (&objfile->psymbol_obstack, 
+                              SIZEOF_N_SECTION_OFFSETS (num_offsets));
+             memcpy (objfile->section_offsets, offsets, 
+                     SIZEOF_N_SECTION_OFFSETS (num_offsets));
              objfile->num_sections = num_offsets;
 
              /* What the hell is sym_new_init for, anyway?  The concept of
@@ -2020,7 +1981,7 @@ reread_symbols (void)
              if (!have_partial_symbols () && !have_full_symbols ())
                {
                  wrap_here ("");
-                 printf_filtered ("(no debugging symbols found)\n");
+                 printf_unfiltered ("(no debugging symbols found)\n");
                  wrap_here ("");
                }
              objfile->flags |= OBJF_SYMS;
@@ -2041,14 +2002,6 @@ reread_symbols (void)
                 again now.  */
              objfile->mtime = new_modtime;
              reread_one = 1;
-
-             /* Call this after reading in a new symbol table to give target
-                dependent code a crack at the new symbols.  For instance, this
-                could be used to update the values of target-specific symbols GDB
-                needs to keep track of (such as _sigtramp, or whatever).  */
-
-             TARGET_SYMFILE_POSTREAD (objfile);
-
               reread_separate_symbols (objfile);
            }
        }
@@ -2115,8 +2068,7 @@ reread_separate_symbols (struct objfile *objfile)
             0, /* No addr table.  */
             objfile->section_offsets, objfile->num_sections,
             0, /* Not mainline.  See comments about this above.  */
-            objfile->flags & (OBJF_MAPPED | OBJF_REORDERED
-                              | OBJF_SHARED | OBJF_READNOW
+            objfile->flags & (OBJF_REORDERED | OBJF_SHARED | OBJF_READNOW
                               | OBJF_USERLOADED)));
       objfile->separate_debug_objfile->separate_debug_objfile_backlink
         = objfile;
@@ -2286,7 +2238,7 @@ deduce_language_from_filename (char *filename)
 struct symtab *
 allocate_symtab (char *filename, struct objfile *objfile)
 {
-  register struct symtab *symtab;
+  struct symtab *symtab;
 
   symtab = (struct symtab *)
     obstack_alloc (&objfile->symbol_obstack, sizeof (struct symtab));
@@ -2525,9 +2477,9 @@ free_named_symtabs (char *name)
      compilation units.  We want to blow away any old info about these
      compilation units, regardless of which objfiles they arrived in. --gnu.  */
 
-  register struct symtab *s;
-  register struct symtab *prev;
-  register struct partial_symtab *ps;
+  struct symtab *s;
+  struct symtab *prev;
+  struct partial_symtab *ps;
   struct blockvector *bv;
   int blewit = 0;
 
@@ -2544,7 +2496,7 @@ free_named_symtabs (char *name)
 again2:
   for (ps = partial_symtab_list; ps; ps = ps->next)
     {
-      if (STREQ (name, ps->filename))
+      if (strcmp (name, ps->filename) == 0)
        {
          cashier_psymtab (ps); /* Blow it away...and its little dog, too.  */
          goto again2;          /* Must restart, chain has been munged */
@@ -2555,7 +2507,7 @@ again2:
 
   for (s = symtab_list; s; s = s->next)
     {
-      if (STREQ (name, s->filename))
+      if (strcmp (name, s->filename) == 0)
        break;
       prev = s;
     }
@@ -2637,16 +2589,28 @@ start_psymtab_common (struct objfile *objfile,
 }
 \f
 /* Add a symbol with a long value to a psymtab.
-   Since one arg is a struct, we pass in a ptr and deref it (sigh).  */
-
-void
-add_psymbol_to_list (char *name, int namelength, namespace_enum namespace,
+   Since one arg is a struct, we pass in a ptr and deref it (sigh).  
+   Return the partial symbol that has been added.  */
+
+/* NOTE: carlton/2003-09-11: The reason why we return the partial
+   symbol is so that callers can get access to the symbol's demangled
+   name, which they don't have any cheap way to determine otherwise.
+   (Currenly, dwarf2read.c is the only file who uses that information,
+   though it's possible that other readers might in the future.)
+   Elena wasn't thrilled about that, and I don't blame her, but we
+   couldn't come up with a better way to get that information.  If
+   it's needed in other situations, we could consider breaking up
+   SYMBOL_SET_NAMES to provide access to the demangled name lookup
+   cache.  */
+
+const struct partial_symbol *
+add_psymbol_to_list (char *name, int namelength, domain_enum domain,
                     enum address_class class,
                     struct psymbol_allocation_list *list, long val,    /* Value as a long */
                     CORE_ADDR coreaddr,        /* Value as a CORE_ADDR */
                     enum language language, struct objfile *objfile)
 {
-  register struct partial_symbol *psym;
+  struct partial_symbol *psym;
   char *buf = alloca (namelength + 1);
   /* psymbol is static so that there will be no uninitialized gaps in the
      structure which might contain random data, causing cache misses in
@@ -2667,13 +2631,14 @@ add_psymbol_to_list (char *name, int namelength, namespace_enum namespace,
     }
   SYMBOL_SECTION (&psymbol) = 0;
   SYMBOL_LANGUAGE (&psymbol) = language;
-  PSYMBOL_NAMESPACE (&psymbol) = namespace;
+  PSYMBOL_DOMAIN (&psymbol) = domain;
   PSYMBOL_CLASS (&psymbol) = class;
 
   SYMBOL_SET_NAMES (&psymbol, buf, namelength, objfile);
 
   /* Stash the partial symbol away in the cache */
-  psym = bcache (&psymbol, sizeof (struct partial_symbol), objfile->psymbol_cache);
+  psym = deprecated_bcache (&psymbol, sizeof (struct partial_symbol),
+                           objfile->psymbol_cache);
 
   /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
   if (list->next >= list->list + list->size)
@@ -2682,6 +2647,8 @@ add_psymbol_to_list (char *name, int namelength, namespace_enum namespace,
     }
   *list->next++ = psym;
   OBJSTAT (objfile, n_psyms++);
+
+  return psym;
 }
 
 /* Add a symbol with a long value to a psymtab. This differs from
@@ -2690,14 +2657,14 @@ add_psymbol_to_list (char *name, int namelength, namespace_enum namespace,
 
 void
 add_psymbol_with_dem_name_to_list (char *name, int namelength, char *dem_name,
-                                  int dem_namelength, namespace_enum namespace,
+                                  int dem_namelength, domain_enum domain,
                                   enum address_class class,
                                   struct psymbol_allocation_list *list, long val,      /* Value as a long */
                                   CORE_ADDR coreaddr,  /* Value as a CORE_ADDR */
                                   enum language language,
                                   struct objfile *objfile)
 {
-  register struct partial_symbol *psym;
+  struct partial_symbol *psym;
   char *buf = alloca (namelength + 1);
   /* psymbol is static so that there will be no uninitialized gaps in the
      structure which might contain random data, causing cache misses in
@@ -2708,7 +2675,8 @@ add_psymbol_with_dem_name_to_list (char *name, int namelength, char *dem_name,
 
   memcpy (buf, name, namelength);
   buf[namelength] = '\0';
-  SYMBOL_NAME (&psymbol) = bcache (buf, namelength + 1, objfile->psymbol_cache);
+  DEPRECATED_SYMBOL_NAME (&psymbol) = deprecated_bcache (buf, namelength + 1,
+                                                        objfile->psymbol_cache);
 
   buf = alloca (dem_namelength + 1);
   memcpy (buf, dem_name, dem_namelength);
@@ -2719,7 +2687,7 @@ add_psymbol_with_dem_name_to_list (char *name, int namelength, char *dem_name,
     case language_c:
     case language_cplus:
       SYMBOL_CPLUS_DEMANGLED_NAME (&psymbol) =
-       bcache (buf, dem_namelength + 1, objfile->psymbol_cache);
+       deprecated_bcache (buf, dem_namelength + 1, objfile->psymbol_cache);
       break;
       /* FIXME What should be done for the default case? Ignoring for now. */
     }
@@ -2735,12 +2703,13 @@ add_psymbol_with_dem_name_to_list (char *name, int namelength, char *dem_name,
     }
   SYMBOL_SECTION (&psymbol) = 0;
   SYMBOL_LANGUAGE (&psymbol) = language;
-  PSYMBOL_NAMESPACE (&psymbol) = namespace;
+  PSYMBOL_DOMAIN (&psymbol) = domain;
   PSYMBOL_CLASS (&psymbol) = class;
   SYMBOL_INIT_LANGUAGE_SPECIFIC (&psymbol, language);
 
   /* Stash the partial symbol away in the cache */
-  psym = bcache (&psymbol, sizeof (struct partial_symbol), objfile->psymbol_cache);
+  psym = deprecated_bcache (&psymbol, sizeof (struct partial_symbol),
+                           objfile->psymbol_cache);
 
   /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
   if (list->next >= list->list + list->size)
@@ -2980,7 +2949,7 @@ pc_in_mapped_range (CORE_ADDR pc, asection *section)
 
 /* Return true if the mapped ranges of sections A and B overlap, false
    otherwise.  */
-int
+static int
 sections_overlap (asection *a, asection *b)
 {
   /* FIXME: need bfd *, so we can use bfd_section_vma methods. */
@@ -3182,7 +3151,7 @@ the 'overlay manual' command.");
                                  sec2->the_bfd_section))
        {
          if (info_verbose)
-           printf_filtered ("Note: section %s unmapped by overlap\n",
+           printf_unfiltered ("Note: section %s unmapped by overlap\n",
                             bfd_section_name (objfile->obfd,
                                               sec2->the_bfd_section));
          sec2->ovly_mapped = 0;        /* sec2 overlaps sec: unmap sec2 */
@@ -3232,7 +3201,7 @@ overlay_auto_command (char *args, int from_tty)
   overlay_debugging = ovly_auto;
   enable_overlay_breakpoints ();
   if (info_verbose)
-    printf_filtered ("Automatic overlay debugging enabled.");
+    printf_unfiltered ("Automatic overlay debugging enabled.");
 }
 
 /* Function: overlay_manual_command
@@ -3245,7 +3214,7 @@ overlay_manual_command (char *args, int from_tty)
   overlay_debugging = ovly_on;
   disable_overlay_breakpoints ();
   if (info_verbose)
-    printf_filtered ("Overlay debugging enabled.");
+    printf_unfiltered ("Overlay debugging enabled.");
 }
 
 /* Function: overlay_off_command
@@ -3258,7 +3227,7 @@ overlay_off_command (char *args, int from_tty)
   overlay_debugging = ovly_off;
   disable_overlay_breakpoints ();
   if (info_verbose)
-    printf_filtered ("Overlay debugging disabled.");
+    printf_unfiltered ("Overlay debugging disabled.");
 }
 
 static void
@@ -3573,7 +3542,7 @@ symfile_relocate_debug_section (bfd *abfd, asection *sectp, bfd_byte *buf)
      all sections begin at 0.  */
   bfd_map_over_sections (abfd, symfile_dummy_outputs, NULL);
 
-  return bfd_simple_get_relocated_section_contents (abfd, sectp, buf);
+  return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
 }
 
 void
This page took 0.052277 seconds and 4 git commands to generate.