Permit symbols to be superseded when new symbol files have
authorJohn Gilmore <gnu@cygnus>
Sat, 13 Apr 1991 21:51:28 +0000 (21:51 +0000)
committerJohn Gilmore <gnu@cygnus>
Sat, 13 Apr 1991 21:51:28 +0000 (21:51 +0000)
        been read in, particularly for VxWorks.

        * dbxread.c (read_dbx_symtab): Allow N_SOL to cleanly take us back
        to the main file, as well as to include files.  Also, put global
        functions into the global psymtab, to make "i fun" work.
        (end_psymtab):  Free named symtabs and psymtabs for a file, once a
        new psymtab for it has been read.

gdb/dbxread.c

index 777baf8bd85cd49b50f738c9ad68b724c2e68244..c8db6a7175a3c67c5fc055542d34570359cc1eda 100644 (file)
@@ -1167,10 +1167,10 @@ end_symtab (end_addr)
       symtab->language = language_unknown;
       symtab->fullname = NULL;
 
-      /* If there is already a symtab for a file of this name, remove it,
-        and clear out other dependent data structures such as
-        breakpoints.  This happens in VxWorks maybe?  -gnu@cygnus */
-      free_named_symtab (symtab->filename);
+      /* There should never already be a symtab for this name, since
+        any prev dups have been removed when the psymtab was read in.
+        FIXME, there ought to be a way to check this here.  */
+      /* FIXME blewit |= free_named_symtabs (symtab->filename);  */
 
       /* Link the new symtab into the list of such.  */
       symtab->next = symtab_list;
@@ -2010,12 +2010,15 @@ read_dbx_symtab (symfile_name, addr,
          /* In C++, one may expect the same filename to come round many
             times, when code is coming alternately from the main file
             and from inline functions in other files. So I check to see
-            if this is a file we've seen before.
+            if this is a file we've seen before -- either the main
+            source file, or a previously included file.
 
             This seems to be a lot of time to be spending on N_SOL, but
             things like "break expread.y:435" need to work (I
             suppose the psymtab_include_list could be hashed or put
             in a binary tree, if profiling shows this is a major hog).  */
+         if (!strcmp (namestring, pst->filename))
+           continue;
          {
            register int i;
            for (i = 0; i < includes_used; i++)
@@ -2204,6 +2207,17 @@ read_dbx_symtab (symfile_name, addr,
                                   static_psymbols, bufp->n_value);
              continue;
 
+             /* Global functions were ignored here, but now they
+                are put into the global psymtab like one would expect.
+                They're also in the misc fn vector... 
+                FIXME, why did it used to ignore these?  That broke
+                "i fun" on these functions.  */
+           case 'F':
+             ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
+                                  VAR_NAMESPACE, LOC_BLOCK,
+                                  global_psymbols, bufp->n_value);
+             continue;
+
              /* Two things show up here (hopefully); static symbols of
                 local scope (static used inside braces) or extensions
                 of structure symbols.  We can ignore both.  */
@@ -2219,10 +2233,6 @@ read_dbx_symtab (symfile_name, addr,
            case '7':
            case '8':
            case '9':
-             /* Global functions are ignored here.  I'm not
-                sure what psymtab they go into (or just the misc
-                function vector).  */
-           case 'F':
              continue;
 
            default:
@@ -2495,6 +2505,11 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
   qsort (global_psymbols.list + pst->globals_offset, pst->n_global_syms,
         sizeof (struct partial_symbol), compare_psymbols);
 
+  /* If there is already a psymtab or symtab for a file of this name, remove it.
+     (If there is a symtab, more drastic things also happen.)
+     This happens in VxWorks.  */
+  free_named_symtabs (pst->filename);
+
   /* Put the psymtab on the psymtab list */
   pst->next = partial_symtab_list;
   partial_symtab_list = pst;