Copyright updates for 2007.
[deliverable/binutils-gdb.git] / gdb / somread.c
index e3df6e167a1dfa5c95ab7cb9201264492242ca12..5f0c13b6011daac3d399b50dfa6953a10913719d 100644 (file)
@@ -1,6 +1,6 @@
 /* Read HP PA/Risc object files for GDB.
-   Copyright 1991, 1992, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-   Free Software Foundation, Inc.
+   Copyright (C) 1991, 1992, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002,
+   2004, 2007 Free Software Foundation, Inc.
    Written by Fred Fish at Cygnus Support.
 
    This file is part of GDB.
@@ -17,8 +17,8 @@
 
    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.  */
 
 #include "defs.h"
 #include "bfd.h"
 #include "som.h"
 #include "libhppa.h"
 
-/* Various things we might complain about... */
+#include "solib-som.h"
 
+/* Prototypes for local functions.  */
 static int init_import_symbols (struct objfile *objfile);
 
-static void som_symfile_init (struct objfile *);
-
-static void som_new_init (struct objfile *);
-
-static void som_symfile_read (struct objfile *, int);
-
-static void som_symfile_finish (struct objfile *);
-
-static void som_symtab_read (bfd *, struct objfile *,
-                            struct section_offsets *);
-
-static void som_symfile_offsets (struct objfile *, struct section_addr_info *);
-
 /* FIXME: These should really be in a common header somewhere */
 
 extern void hpread_build_psymtabs (struct objfile *, int);
@@ -100,19 +88,26 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 
   number_of_symbols = bfd_get_symcount (abfd);
 
-  /* FIXME (alloca): could be quite large. */
-  buf = alloca (symsize * number_of_symbols);
+  /* Allocate a buffer to read in the debug info.
+     We avoid using alloca because the memory size could be so large
+     that we could hit the stack size limit.  */
+  buf = xmalloc (symsize * number_of_symbols);
+  make_cleanup (xfree, buf);
   bfd_seek (abfd, obj_som_sym_filepos (abfd), SEEK_SET);
   val = bfd_bread (buf, symsize * number_of_symbols, abfd);
   if (val != symsize * number_of_symbols)
-    error ("Couldn't read symbol dictionary!");
-
-  /* FIXME (alloca): could be quite large. */
-  stringtab = alloca (obj_som_stringtab_size (abfd));
+    error (_("Couldn't read symbol dictionary!"));
+
+  /* Allocate a buffer to read in the som stringtab section of
+     the debugging info.  Again, we avoid using alloca because
+     the data could be so large that we could potentially hit
+     the stack size limitat.  */
+  stringtab = xmalloc (obj_som_stringtab_size (abfd));
+  make_cleanup (xfree, stringtab);
   bfd_seek (abfd, obj_som_str_filepos (abfd), SEEK_SET);
   val = bfd_bread (stringtab, obj_som_stringtab_size (abfd), abfd);
   if (val != obj_som_stringtab_size (abfd))
-    error ("Can't read in HP string table.");
+    error (_("Can't read in HP string table."));
 
   /* We need to determine if objfile is a dynamic executable (so we
      can do the right thing for ST_ENTRY vs ST_CODE symbols).
@@ -219,6 +214,7 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
              if ((symname[0] == 'L' && symname[1] == '$')
              || (symname[0] == '$' && symname[strlen (symname) - 1] == '$')
                  || (symname[0] == 'D' && symname[1] == '$')
+                 || (strncmp (symname, "L0\001", 3) == 0)
                  || (strncmp (symname, "$PIC", 4) == 0))
                continue;
              break;
@@ -288,7 +284,7 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
        }
 
       if (bufp->name.n_strx > obj_som_stringtab_size (abfd))
-       error ("Invalid symbol data; bad HP string table offset: %d",
+       error (_("Invalid symbol data; bad HP string table offset: %d"),
               bufp->name.n_strx);
 
       prim_record_minimal_symbol (symname, bufp->symbol_value, ms_type,
@@ -364,9 +360,7 @@ som_symfile_read (struct objfile *objfile, int mainline)
   do_cleanups (back_to);
 
   /* Now read information from the stabs debug sections.
-     This is a no-op for SOM.
-     Perhaps it is intended for some kind of mixed STABS/SOM
-     situation? */
+     This is emitted by gcc.  */
   stabsect_build_psymtabs (objfile, mainline,
                           "$GDB_SYMBOLS$", "$GDB_STRINGS$", "$TEXT$");
 
@@ -375,9 +369,6 @@ som_symfile_read (struct objfile *objfile, int mainline)
      the DNTT, but is now done via the PXDB-built quick-lookup tables
      together with a scan of the GNTT. See hp-psymtab-read.c. */
   hpread_build_psymtabs (objfile, mainline);
-
-  /* Force hppa-tdep.c to re-read the unwind descriptors.  */
-  objfile->obj_private = NULL;
 }
 
 /* Initialize anything that needs initializing when a completely new symbol
@@ -401,9 +392,9 @@ som_new_init (struct objfile *ignore)
 static void
 som_symfile_finish (struct objfile *objfile)
 {
-  if (objfile->sym_stab_info != NULL)
+  if (objfile->deprecated_sym_stab_info != NULL)
     {
-      xmfree (objfile->md, objfile->sym_stab_info);
+      xfree (objfile->deprecated_sym_stab_info);
     }
   hpread_symfile_finish (objfile);
 }
@@ -432,7 +423,7 @@ som_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
 
   objfile->num_sections = bfd_count_sections (objfile->obfd);
   objfile->section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile->psymbol_obstack, 
+    obstack_alloc (&objfile->objfile_obstack, 
                   SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
 
   /* FIXME: ezannoni 2000-04-20 The section names in SOM are not
@@ -453,7 +444,7 @@ som_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
       /* Note: Here is OK to compare with ".text" because this is the
          name that gdb itself gives to that section, not the SOM
          name. */
-      for (i = 0; i < objfile->num_sections && addrs->other[i].name; i++)
+      for (i = 0; i < addrs->num_sections && addrs->other[i].name; i++)
        if (strcmp (addrs->other[i].name, ".text") == 0)
          break;
       text_addr = addrs->other[i].addr;
@@ -477,9 +468,9 @@ init_import_symbols (struct objfile *objfile)
   unsigned int string_table;
   unsigned int string_table_size;
   char *string_buffer;
-  register int i;
-  register int j;
-  register int k;
+  int i;
+  int j;
+  int k;
   asection *text_section;      /* section handle */
   unsigned int dl_header[12];  /* SOM executable header */
 
@@ -534,7 +525,7 @@ init_import_symbols (struct objfile *objfile)
      to do with psymbols, just a matter of convenience.  We want the
      import list to be freed when the objfile is deallocated */
   objfile->import_list
-    = (ImportEntry *) obstack_alloc (&objfile->psymbol_obstack,
+    = (ImportEntry *) obstack_alloc (&objfile->objfile_obstack,
                                   import_list_size * sizeof (ImportEntry));
 
   /* Read in the import entries, a bunch at a time */
@@ -550,7 +541,7 @@ init_import_symbols (struct objfile *objfile)
          if (buffer[i].type != (unsigned char) 0)
            {
              objfile->import_list[k]
-               = (char *) obstack_alloc (&objfile->psymbol_obstack, strlen (string_buffer + buffer[i].name) + 1);
+               = (char *) obstack_alloc (&objfile->objfile_obstack, strlen (string_buffer + buffer[i].name) + 1);
              strcpy (objfile->import_list[k], string_buffer + buffer[i].name);
              /* Some day we might want to record the type and other information too */
            }
@@ -570,7 +561,7 @@ init_import_symbols (struct objfile *objfile)
       if (buffer[i].type != (unsigned char) 0)
        {
          objfile->import_list[k]
-           = (char *) obstack_alloc (&objfile->psymbol_obstack, strlen (string_buffer + buffer[i].name) + 1);
+           = (char *) obstack_alloc (&objfile->objfile_obstack, strlen (string_buffer + buffer[i].name) + 1);
          strcpy (objfile->import_list[k], string_buffer + buffer[i].name);
          /* Some day we might want to record the type and other information too */
        }
@@ -597,9 +588,9 @@ init_export_symbols (struct objfile *objfile)
   unsigned int string_table;
   unsigned int string_table_size;
   char *string_buffer;
-  register int i;
-  register int j;
-  register int k;
+  int i;
+  int j;
+  int k;
   asection *text_section;      /* section handle */
   unsigned int dl_header[12];  /* SOM executable header */
 
@@ -657,7 +648,7 @@ init_export_symbols (struct objfile *objfile)
      to do with psymbols, just a matter of convenience.  We want the
      export list to be freed when the objfile is deallocated */
   objfile->export_list
-    = (ExportEntry *) obstack_alloc (&objfile->psymbol_obstack,
+    = (ExportEntry *) obstack_alloc (&objfile->objfile_obstack,
                                   export_list_size * sizeof (ExportEntry));
 
   /* Read in the export entries, a bunch at a time */
@@ -673,7 +664,7 @@ init_export_symbols (struct objfile *objfile)
          if (buffer[i].type != (unsigned char) 0)
            {
              objfile->export_list[k].name
-               = (char *) obstack_alloc (&objfile->psymbol_obstack, strlen (string_buffer + buffer[i].name) + 1);
+               = (char *) obstack_alloc (&objfile->objfile_obstack, strlen (string_buffer + buffer[i].name) + 1);
              strcpy (objfile->export_list[k].name, string_buffer + buffer[i].name);
              objfile->export_list[k].address = buffer[i].value;
              /* Some day we might want to record the type and other information too */
@@ -697,7 +688,7 @@ init_export_symbols (struct objfile *objfile)
       if (buffer[i].type != (unsigned char) 0)
        {
          objfile->export_list[k].name
-           = (char *) obstack_alloc (&objfile->psymbol_obstack, strlen (string_buffer + buffer[i].name) + 1);
+           = (char *) obstack_alloc (&objfile->objfile_obstack, strlen (string_buffer + buffer[i].name) + 1);
          strcpy (objfile->export_list[k].name, string_buffer + buffer[i].name);
          /* Some day we might want to record the type and other information too */
          objfile->export_list[k].address = buffer[i].value;
This page took 0.033538 seconds and 4 git commands to generate.