* stabsread.c (get_substring): Declare second arg as int.
[deliverable/binutils-gdb.git] / gdb / dbxread.c
index 9ec4c16df5686a5df73b9db39bc2e69fd3cb6e6b..5b0e5cc2bcb660d8c73d49d6e20142e905711584 100644 (file)
@@ -1,5 +1,5 @@
 /* Read dbx symbol tables and convert to internal format, for GDB.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
    Free Software Foundation, Inc.
 
 This file is part of GDB.
@@ -206,6 +206,9 @@ static int bincls_allocated;
 
 /* Local function prototypes */
 
+static void 
+process_now PARAMS ((struct objfile *));
+
 static void
 free_header_files PARAMS ((void));
 
@@ -242,7 +245,7 @@ static void
 init_bincl_list PARAMS ((int, struct objfile *));
 
 static char *
-dbx_next_symbol_text PARAMS ((void));
+dbx_next_symbol_text PARAMS ((struct objfile *));
 
 static void
 fill_symbuf PARAMS ((bfd *));
@@ -494,12 +497,7 @@ record_minimal_symbol (name, address, type, objfile)
     lowest_text_address = address;
 
   prim_record_minimal_symbol_and_info
-    (obsavestring (name, strlen (name), &objfile -> symbol_obstack),
-     address,
-     ms_type,
-     NULL,
-     section,
-     objfile);
+    (name, address, ms_type, NULL, section, objfile);
 }
 \f
 /* Scan and build partial symbols for a symbol file.
@@ -706,6 +704,7 @@ dbx_symfile_init (objfile)
          DBX_STRINGTAB (objfile) =
            (char *) obstack_alloc (&objfile -> psymbol_obstack,
                                    DBX_STRINGTAB_SIZE (objfile));
+         OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile));
          
          /* Now read in the string table in one big gulp.  */
          
@@ -742,6 +741,68 @@ static struct internal_nlist symbuf[4096];
 static int symbuf_idx;
 static int symbuf_end;
 
+/* cont_elem is used for continuing information in cfront.
+   It saves information about which types need to be fixed up and 
+   completed after all the stabs are read.  */
+struct cont_elem 
+  {
+    /* sym and stabsstring for continuing information in cfront */
+    struct symbol * sym;
+    char * stabs;
+    /* state dependancies (statics that must be preserved) */
+    int sym_idx;
+    int sym_end;
+    int symnum;
+    /* other state dependancies include:
+       (assumption is that these will not change since process_now FIXME!!)
+        stringtab_global
+        n_stabs
+        objfile
+        symfile_bfd */
+};
+static struct cont_elem cont_list[100];
+static int cont_count = 0;
+
+void 
+process_later(sym,p)
+  struct symbol * sym;
+  char * p;
+{
+  /* save state so we can process these stabs later */
+  cont_list[cont_count].sym_idx = symbuf_idx;
+  cont_list[cont_count].sym_end = symbuf_end;
+  cont_list[cont_count].symnum = symnum;
+  cont_list[cont_count].sym = sym;
+  cont_list[cont_count].stabs = p;
+  cont_count++;
+}
+
+static void 
+process_now(objfile) 
+  struct objfile * objfile;
+{
+  int i;
+  /* save original state */
+  int save_symbuf_idx = symbuf_idx;
+  int save_symbuf_end = symbuf_end;
+  int save_symnum = symnum;
+  for (i=0; i<cont_count; i++) 
+    {
+      /* set state as if we were parsing stabs strings 
+         for this symbol */
+      symbuf_idx = cont_list[i].sym_idx;   /* statics used by gdb */
+      symbuf_end = cont_list[i].sym_end;  
+      symnum = cont_list[i].symnum;  
+      resolve_cfront_continuation(objfile,cont_list[i].sym,cont_list[i].stabs);
+    }
+  /* restore original state */
+  symbuf_idx = save_symbuf_idx;
+  symbuf_end = save_symbuf_end;
+  symnum = save_symnum;
+  cont_count=0;  /* reset for next run */
+}
+
+
 /* Name of last function encountered.  Used in Solaris to approximate
    object file boundaries.  */
 static char *last_function_name;
@@ -825,12 +886,14 @@ fill_symbuf (sym_bfd)
    call this function to get the continuation.  */
 
 static char *
-dbx_next_symbol_text ()
+dbx_next_symbol_text (objfile)
+     struct objfile *objfile;
 {
   if (symbuf_idx == symbuf_end)
     fill_symbuf (symfile_bfd);
   symnum++;
   SWAP_SYMBOL(&symbuf[symbuf_idx], symfile_bfd);
+  OBJSTAT (objfile, n_stabs++);
   return symbuf[symbuf_idx++].n_strx + stringtab_global
          + file_string_table_offset;
 }
@@ -1037,11 +1100,8 @@ read_dbx_dynamic_symtab (section_offsets, objfile)
        }
 
       name = (char *) bfd_asymbol_name (*rel->sym_ptr_ptr);
-      prim_record_minimal_symbol
-       (obsavestring (name, strlen (name), &objfile -> symbol_obstack),
-        address,
-        mst_solib_trampoline,
-        objfile);
+      prim_record_minimal_symbol (name, address, mst_solib_trampoline,
+                                 objfile);
     }
 
   do_cleanups (back_to);
@@ -1066,8 +1126,10 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
   int nsl;
   int past_first_source_file = 0;
   CORE_ADDR last_o_file_start = 0;
+  CORE_ADDR last_function_start = 0;
   struct cleanup *back_to;
   bfd *abfd;
+  int textlow_not_set;
 
   /* Current partial symtab */
   struct partial_symtab *pst;
@@ -1113,6 +1175,7 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
   abfd = objfile->obfd;
   symbuf_end = symbuf_idx = 0;
   next_symbol_text_func = dbx_next_symbol_text;
+  textlow_not_set = 1;
 
   for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
     {
@@ -1128,6 +1191,7 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
       if (bufp->n_type == (unsigned char)N_SLINE) continue;
 
       SWAP_SYMBOL (bufp, abfd);
+      OBJSTAT (objfile, n_stabs++);
 
       /* Ok.  There is a lot of code duplicated in the rest of this
          switch statement (for efficiency reasons).  Since I don't
@@ -1160,8 +1224,8 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
 #define DBXREAD_ONLY
 #define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms)\
   start_psymtab(ofile, secoff, fname, low, symoff, global_syms, static_syms)
-#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps)\
-  end_psymtab(pst,ilist,ninc,c_off,c_text,dep_list,n_deps)
+#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)\
+  end_psymtab(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)
 
 #include "partial-stab.h"
     }
@@ -1185,7 +1249,7 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
                    ? (text_addr + section_offsets->offsets[SECT_OFF_TEXT])
                    : lowest_text_address)
                   + text_size,
-                  dependency_list, dependencies_used);
+                  dependency_list, dependencies_used, textlow_not_set);
     }
 
   do_cleanups (back_to);
@@ -1207,8 +1271,8 @@ start_psymtab (objfile, section_offsets,
      char *filename;
      CORE_ADDR textlow;
      int ldsymoff;
-     struct partial_symbol *global_syms;
-     struct partial_symbol *static_syms;
+     struct partial_symbol **global_syms;
+     struct partial_symbol **static_syms;
 {
   struct partial_symtab *result =
       start_psymtab_common(objfile, section_offsets,
@@ -1242,7 +1306,7 @@ start_psymtab (objfile, section_offsets,
 
 struct partial_symtab *
 end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
-            capping_text, dependency_list, number_dependencies)
+            capping_text, dependency_list, number_dependencies, textlow_not_set)
      struct partial_symtab *pst;
      char **include_list;
      int num_includes;
@@ -1250,12 +1314,13 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
      CORE_ADDR capping_text;
      struct partial_symtab **dependency_list;
      int number_dependencies;
+     int textlow_not_set;
 {
   int i;
   struct objfile *objfile = pst -> objfile;
 
   if (capping_symbol_offset != -1)
-      LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
+    LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
   pst->texthigh = capping_text;
 
 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
@@ -1264,8 +1329,8 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
      we have to do some tricks to fill in texthigh and textlow.
      The first trick is in partial-stab.h: if we see a static
      or global function, and the textlow for the current pst
-     is still 0, then we use that function's address for 
-     the textlow of the pst.  */
+     is not set (ie: textlow_not_set), then we use that function's
+     address for the textlow of the pst.  */
 
   /* Now, to fill in texthigh, we remember the last function seen
      in the .o file (also in partial-stab.h).  Also, there's a hack in
@@ -1274,52 +1339,53 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
      a reliable texthigh by taking the address plus size of the
      last function in the file.  */
 
-  if (pst->texthigh == 0 && last_function_name) {
-    char *p;
-    int n;
-    struct minimal_symbol *minsym;
-
-    p = strchr (last_function_name, ':');
-    if (p == NULL)
-      p = last_function_name;
-    n = p - last_function_name;
-    p = alloca (n + 1);
-    strncpy (p, last_function_name, n);
-    p[n] = 0;
+  if (pst->texthigh == 0 && last_function_name)
+    {
+      char *p;
+      int n;
+      struct minimal_symbol *minsym;
+
+      p = strchr (last_function_name, ':');
+      if (p == NULL)
+       p = last_function_name;
+      n = p - last_function_name;
+      p = alloca (n + 1);
+      strncpy (p, last_function_name, n);
+      p[n] = 0;
     
-    minsym = lookup_minimal_symbol (p, pst->filename, objfile);
+      minsym = lookup_minimal_symbol (p, pst->filename, objfile);
 
-    if (minsym)
-      pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) +
-       (long) MSYMBOL_INFO (minsym);
+      if (minsym)
+       pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym)
+         + (long) MSYMBOL_INFO (minsym);
 
-    last_function_name = NULL;
-  }
+      last_function_name = NULL;
+    }
 
   /* this test will be true if the last .o file is only data */
-  if (pst->textlow == 0)
-    /* This loses if the text section really starts at address zero
-       (generally true when we are debugging a .o file, for example).
-       That is why this whole thing is inside SOFUN_ADDRESS_MAYBE_MISSING.  */
+  if (textlow_not_set)
     pst->textlow = pst->texthigh;
+  else
+    {
+      struct partial_symtab *p1;
 
-  /* If we know our own starting text address, then walk through all other
-     psymtabs for this objfile, and if any didn't know their ending text
-     address, set it to our starting address.  Take care to not set our
-     own ending address to our starting address, nor to set addresses on
-     `dependency' files that have both textlow and texthigh zero.  */
-  if (pst->textlow) {
-    struct partial_symtab *p1;
-
-    ALL_OBJFILE_PSYMTABS (objfile, p1) {
-      if (p1->texthigh == 0  && p1->textlow != 0 && p1 != pst) {
-       p1->texthigh = pst->textlow;
-       /* if this file has only data, then make textlow match texthigh */
-       if (p1->textlow == 0)
-         p1->textlow = p1->texthigh;
-      }
+      /* If we know our own starting text address, then walk through all other
+        psymtabs for this objfile, and if any didn't know their ending text
+        address, set it to our starting address.  Take care to not set our
+        own ending address to our starting address, nor to set addresses on
+        `dependency' files that have both textlow and texthigh zero.  */
+
+      ALL_OBJFILE_PSYMTABS (objfile, p1)
+       {
+         if (p1->texthigh == 0  && p1->textlow != 0 && p1 != pst)
+           {
+             p1->texthigh = pst->textlow;
+             /* if this file has only data, then make textlow match texthigh */
+             if (p1->textlow == 0)
+               p1->textlow = p1->texthigh;
+           }
+       }
     }
-  }
 
   /* End of kludge for patching Solaris textlow and texthigh.  */
 #endif /* SOFUN_ADDRESS_MAYBE_MISSING.  */
@@ -1561,6 +1627,7 @@ read_ofile_symtab (pst)
       fill_symbuf (abfd);
       bufp = &symbuf[symbuf_idx++];
       SWAP_SYMBOL (bufp, abfd);
+      OBJSTAT (objfile, n_stabs++);
 
       SET_NAMESTRING ();
 
@@ -1616,6 +1683,7 @@ read_ofile_symtab (pst)
        fill_symbuf(abfd);
       bufp = &symbuf[symbuf_idx++];
       SWAP_SYMBOL (bufp, abfd);
+      OBJSTAT (objfile, n_stabs++);
 
       type = bufp->n_type;
 
@@ -1669,8 +1737,17 @@ read_ofile_symtab (pst)
   if (last_source_start_addr == 0)
     last_source_start_addr = text_offset;
 
-  pst->symtab = end_symtab (text_offset + text_size, 0, 0, objfile,
-                           SECT_OFF_TEXT);
+  /* In reordered executables last_source_start_addr may not be the
+     lower bound for this symtab, instead use text_offset which comes
+     from pst->textlow which is correct.  */
+  if (last_source_start_addr > text_offset)
+    last_source_start_addr = text_offset;
+
+  pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT);
+
+  if (ARM_DEMANGLING)  /* process incomplete C++ types now */
+    process_now(objfile);
+
   end_stabs ();
 }
 
@@ -1745,6 +1822,21 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
     {
     case N_FUN:
     case N_FNAME:
+
+      if (! strcmp (name, ""))
+       {
+         /* This N_FUN marks the end of a function.  This closes off the
+            current block.  */
+         within_function = 0;
+         new = pop_context ();
+
+         /* Make a block for the local symbols within.  */
+         finish_block (new->name, &local_symbols, new->old_blocks,
+                       function_start_offset, function_start_offset + valu,
+                       objfile);
+         break;
+       }
+
       /* Relocate for dynamic loading */
       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
       goto define_a_symbol;
@@ -1896,7 +1988,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, SECT_OFF_TEXT);
+         end_symtab (valu, objfile, SECT_OFF_TEXT);
          end_stabs ();
        }
 
@@ -2131,7 +2223,8 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
                      && SYMBOL_NAME (m) [l] == '\0')
                    /* last_pc_address was in this function */
                    valu = SYMBOL_VALUE (m);
-                 else if (m && STREQN (SYMBOL_NAME (m+1), name, l)
+                 else if (m && SYMBOL_NAME (m+1)
+                          && STREQN (SYMBOL_NAME (m+1), name, l)
                           && SYMBOL_NAME (m+1) [l] == '\0')
                    /* last_pc_address was in last function */
                    valu = SYMBOL_VALUE (m+1);
@@ -2268,6 +2361,7 @@ coffstab_build_psymtabs (objfile, section_offsets, mainline,
     error ("ridiculous string table size: %d bytes", stabstrsize);
   DBX_STRINGTAB (objfile) = (char *)
     obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
+  OBJSTAT (objfile, sz_strtab += stabstrsize+1);
 
   /* Now read in the string table in one big gulp.  */
 
@@ -2373,6 +2467,7 @@ elfstab_build_psymtabs (objfile, section_offsets, mainline,
     error ("ridiculous string table size: %d bytes", stabstrsize);
   DBX_STRINGTAB (objfile) = (char *)
     obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
+  OBJSTAT (objfile, sz_strtab += stabstrsize+1);
 
   /* Now read in the string table in one big gulp.  */
 
@@ -2460,6 +2555,7 @@ stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
     error ("ridiculous string table size: %d bytes", DBX_STRINGTAB_SIZE (objfile));
   DBX_STRINGTAB (objfile) = (char *)
     obstack_alloc (&objfile->psymbol_obstack, DBX_STRINGTAB_SIZE (objfile) + 1);
+  OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile) + 1);
 
   /* Now read in the string table in one big gulp.  */
 
@@ -2484,29 +2580,6 @@ stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
   dbx_symfile_read (objfile, section_offsets, 0);
 }
 \f
-/* Parse the user's idea of an offset for dynamic linking, into our idea
-   of how to represent it for fast symbol reading.  */
-
-static struct section_offsets *
-dbx_symfile_offsets (objfile, addr)
-     struct objfile *objfile;
-     CORE_ADDR addr;
-{
-  struct section_offsets *section_offsets;
-  int i;
-
-  objfile->num_sections = SECT_OFF_MAX;
-  section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile -> psymbol_obstack,
-                  sizeof (struct section_offsets)
-                  + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
-
-  for (i = 0; i < SECT_OFF_MAX; i++)
-    ANOFFSET (section_offsets, i) = addr;
-  
-  return section_offsets;
-}
-\f
 static struct sym_fns aout_sym_fns =
 {
   bfd_target_aout_flavour,
@@ -2514,7 +2587,8 @@ static struct sym_fns aout_sym_fns =
   dbx_symfile_init,    /* sym_init: read initial info, setup for sym_read() */
   dbx_symfile_read,    /* sym_read: read a symbol file into symtab */
   dbx_symfile_finish,  /* sym_finish: finished with file, cleanup */
-  dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
+  default_symfile_offsets,
+                       /* sym_offsets: parse user's offsets to internal form */
   NULL                 /* next: pointer to next struct sym_fns */
 };
 
This page took 0.028755 seconds and 4 git commands to generate.