[PATCH] Clear current source symtab if belongs to objfile being freed

Fred Fish
2006-01-03T17:42:10Z

[-- Attachment #1: Type: text/plain, Size: 452 bytes --]

I stumbled over this problem while chasing something else. If the
current source symtab belongs to a loaded shared library, and the
objfile for that library is freed in the process or rerunning the
executable, the current source symtab can be left pointing to garbage.

An alternative solution, though a little more heavy handed, would be
to replace the previous clear_pc_function_cache() call with a call to
clear_symtab_users().

Comments?

-Fred

[-- Attachment #2: symtab.patch --]
[-- Type: text/x-diff, Size: 2071 bytes --]

2006-01-03 Fred Fish <fnf@specifix.com>

* objfiles.c (source.h): Include.
(free_objfile): Update comment about clear_symtab_users().
(free_objfile): Check all symtabs of objfile being freed and if
one of them is the current source symtab, call
clear_current_source_symtab_and_line().

Index: objfiles.c
===================================================================
RCS file: /cvsroots/latest/src/gdb/gdb/objfiles.c,v
retrieving revision 1.1.1.2
diff -c -p -r1.1.1.2 objfiles.c
*** objfiles.c 30 Dec 2005 18:53:15 -0000 1.1.1.2
--- objfiles.c 3 Jan 2006 15:57:05 -0000
***************
*** 45,50 ****
--- 45,51 ----
#include "breakpoint.h"
#include "block.h"
#include "dictionary.h"
+ #include "source.h"

/* Prototypes for local functions */

*************** free_objfile (struct objfile *objfile)
*** 432,441 ****
is unknown, but we play it safe for now and keep each action until
it is shown to be no longer needed. */

! /* I *think* all our callers call clear_symtab_users. If so, no need
! to call this here. */
clear_pc_function_cache ();

/* The last thing we do is free the objfile struct itself. */

objfile_free_data (objfile);
--- 433,457 ----
is unknown, but we play it safe for now and keep each action until
it is shown to be no longer needed. */

! /* I *think* all our callers call clear_symtab_users. If so, no
! need to call this here. Update: We are called via
! objfile_purge_solibs which doesn't call clear_symtab_users. */
clear_pc_function_cache ();

+ /* Check to see if the current_source_symtab belongs to this objfile,
+ and if so, call clear_current_source_symtab_and_line. */
+
+ {
+ struct symtab_and_line cursal = get_current_source_symtab_and_line ();
+ struct symtab *s;
+
+ ALL_OBJFILE_SYMTABS (objfile, s)
+ {
+ if (s == cursal.symtab)
+ clear_current_source_symtab_and_line ();
+ }
+ }
+
/* The last thing we do is free the objfile struct itself. */

objfile_free_data (objfile);