* Rename remote-es1800.c to remote-es.c
[deliverable/binutils-gdb.git] / gdb / dbxread.c
index 3cb4bcdd965fa78c496e4ecfb9eac38a748be9e9..025bc36d08224dbe92cafc1331e5153d16233f85 100644 (file)
@@ -1,5 +1,6 @@
 /* Read dbx symbol tables and convert to internal format, for GDB.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
+   Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -165,6 +166,9 @@ struct complaint string_table_offset_complaint =
 struct complaint unknown_symtype_complaint =
   {"unknown symbol type %s", 0, 0};
 
+struct complaint unknown_symchar_complaint =
+  {"unknown symbol type character `%c'", 0, 0};
+
 struct complaint lbrac_rbrac_complaint =
   {"block start larger than block end", 0, 0};
 
@@ -515,6 +519,8 @@ dbx_new_init (ignore)
    be called unless this is an a.out (or very similar) file. 
    FIXME, there should be a cleaner peephole into the BFD environment here.  */
 
+#define DBX_STRINGTAB_SIZE_SIZE sizeof(long)   /* FIXME */
+
 static void
 dbx_symfile_init (objfile)
      struct objfile *objfile;
@@ -522,7 +528,7 @@ dbx_symfile_init (objfile)
   int val;
   bfd *sym_bfd = objfile->obfd;
   char *name = bfd_get_filename (sym_bfd);
-  unsigned char size_temp[sizeof(long)];
+  unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
 
   /* Allocate struct to keep track of the symfile */
   objfile->sym_private = (PTR)
@@ -552,41 +558,70 @@ dbx_symfile_init (objfile)
      table size would be so totally bogus that the malloc would fail.  Now
      that we put in on the psymbol_obstack, we can't do this since gdb gets
      a fatal error (out of virtual memory) if the size is bogus.  We can
-     however at least check to see if the size is zero or some negative
-     value.  */
-
-  val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
-  if (val < 0)
-    perror_with_name (name);
-
-  memset (size_temp, 0, sizeof (size_temp));
-  val = bfd_read ((PTR)size_temp, sizeof (long), 1, sym_bfd);
-  if (val < 0)
-    perror_with_name (name);
+     however at least check to see if the size is less than the size of
+     the size field itself, or larger than the size of the entire file.
+     Note that all valid string tables have a size greater than zero, since
+     the bytes used to hold the size are included in the count. */
 
-  DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
-
-  if (DBX_STRINGTAB_SIZE (objfile) == 0)
-    error ("%s has no string table.", name);
-
-  if (DBX_STRINGTAB_SIZE (objfile) < 0
-      || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
-    error ("ridiculous string table size (%d bytes).",
-          DBX_STRINGTAB_SIZE (objfile));
-
-  DBX_STRINGTAB (objfile) =
-    (char *) obstack_alloc (&objfile -> psymbol_obstack,
-                           DBX_STRINGTAB_SIZE (objfile));
-
-  /* Now read in the string table in one big gulp.  */
-
-  val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
-  if (val < 0)
-    perror_with_name (name);
-  val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
-                 sym_bfd);
-  if (val != DBX_STRINGTAB_SIZE (objfile))
-    perror_with_name (name);
+  if (STRING_TABLE_OFFSET == 0)
+    {
+      /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
+        will never be zero, even when there is no string table.  This
+        would appear to be a bug in bfd. */
+      DBX_STRINGTAB_SIZE (objfile) = 0;
+      DBX_STRINGTAB (objfile) = NULL;
+    }
+  else
+    {
+      val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
+      if (val < 0)
+       perror_with_name (name);
+      
+      memset ((PTR) size_temp, 0, sizeof (size_temp));
+      val = bfd_read ((PTR) size_temp, sizeof (size_temp), 1, sym_bfd);
+      if (val < 0)
+       {
+         perror_with_name (name);
+       }
+      else if (val == 0)
+       {
+         /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
+            EOF if there is no string table, and attempting to read the size
+            from EOF will read zero bytes. */
+         DBX_STRINGTAB_SIZE (objfile) = 0;
+         DBX_STRINGTAB (objfile) = NULL;
+       }
+      else
+       {
+         /* Read some data that would appear to be the string table size.
+            If there really is a string table, then it is probably the right
+            size.  Byteswap if necessary and validate the size.  Note that
+            the minimum is DBX_STRINGTAB_SIZE_SIZE.  If we just read some
+            random data that happened to be at STRING_TABLE_OFFSET, because
+            bfd can't tell us there is no string table, the sanity checks may
+            or may not catch this. */
+         DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
+         
+         if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
+             || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
+           error ("ridiculous string table size (%d bytes).",
+                  DBX_STRINGTAB_SIZE (objfile));
+         
+         DBX_STRINGTAB (objfile) =
+           (char *) obstack_alloc (&objfile -> psymbol_obstack,
+                                   DBX_STRINGTAB_SIZE (objfile));
+         
+         /* Now read in the string table in one big gulp.  */
+         
+         val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
+         if (val < 0)
+           perror_with_name (name);
+         val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
+                         sym_bfd);
+         if (val != DBX_STRINGTAB_SIZE (objfile))
+           perror_with_name (name);
+       }
+    }
 }
 
 /* Perform any local cleanups required when we are done with a particular
@@ -1119,7 +1154,7 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
 
       subpst->readin = 0;
       subpst->symtab = 0;
-      subpst->read_symtab = dbx_psymtab_to_symtab;
+      subpst->read_symtab = pst->read_symtab;
     }
 
   sort_pst_symbols (pst);
@@ -1323,12 +1358,10 @@ read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
 
       if (processing_gcc_compilation)
        {
-#if 1    /* Works, but is experimental.  -fnf */
          if (AUTO_DEMANGLING)
            {
              set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
            }
-#endif
        }
     }
   else
@@ -1381,12 +1414,10 @@ read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
          else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
            processing_gcc_compilation = 2;
 
-#if 1    /* Works, but is experimental.  -fnf */
          if (AUTO_DEMANGLING)
            {
              set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
            }
-#endif
        }
       else if (type & N_EXT || type == (unsigned char)N_TEXT
               || type == (unsigned char)N_NBTEXT
@@ -1412,7 +1443,7 @@ read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
   if (last_source_start_addr == 0)
     last_source_start_addr = text_offset;
 
-  rtn = end_symtab (text_offset + text_size, 0, 0, objfile);
+  rtn = end_symtab (text_offset + text_size, 0, 0, objfile, SECT_OFF_TEXT);
   end_stabs ();
   return (rtn);
 }
@@ -1659,7 +1690,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
              patch_subfile_names (current_subfile, name);
              break;            /* Ignore repeated SOs */
            }
-         end_symtab (valu, 0, 0, objfile);
+         end_symtab (valu, 0, 0, objfile, SECT_OFF_TEXT);
          end_stabs ();
        }
       start_stabs ();
This page took 0.02521 seconds and 4 git commands to generate.