diff options
author | John Gilmore <gnu@cygnus> | 1991-04-13 21:51:28 +0000 |
---|---|---|
committer | John Gilmore <gnu@cygnus> | 1991-04-13 21:51:28 +0000 |
commit | f96238813e81c4c11ff5afefa032b19ae5658491 (patch) | |
tree | 20af6a4eb164b4f863446f05051a12dc6197193d | |
parent | bb335cf4aad664ab5b054b4a521f2fa0d83a83ec (diff) | |
download | gdb-f96238813e81c4c11ff5afefa032b19ae5658491.zip gdb-f96238813e81c4c11ff5afefa032b19ae5658491.tar.gz gdb-f96238813e81c4c11ff5afefa032b19ae5658491.tar.bz2 |
Permit symbols to be superseded when new symbol files have
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.
-rw-r--r-- | gdb/dbxread.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 777baf8..c8db6a7 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -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; |