[PATCH][PR symtab/17855] Fix.

Joel Brobecker brobecker@adacore.com
Thu Jan 29 08:12:00 GMT 2015


Aargh - I was working on it just now because I wasn't sure if anyone
felt they "had the ball on their court".

> Like so?
> 
> 2015-01-28  Doug Evans  <xdje42@gmail.com>
> 
> 	PR symtab/17855
> 	* symfile.c (clear_symtab_users): Move call to breakpoint_re_set
> 	closer to end.

What I've tested is moving the call last, as shown in the attached
diff.  Not technically necessarily better, but as the comment explains,
I move it last so that it's after we've purged all relevant caches.
That way, the function is organized in two rough sections:
  - do purges first;
  - do updates next.
Your comment is a lot more detailed, I like it.

> diff --git a/gdb/symfile.c b/gdb/symfile.c
> index d55e361..bad244c 100644
> --- a/gdb/symfile.c
> +++ b/gdb/symfile.c
> @@ -3023,13 +3023,8 @@ clear_symtab_users (int add_flags)
>    /* Someday, we should do better than this, by only blowing away
>       the things that really need to be blown.  */
>  
> -  /* Clear the "current" symtab first, because it is no longer valid.
> -     breakpoint_re_set may try to access the current symtab.  */
>    clear_current_source_symtab_and_line ();
> -
>    clear_displays ();
> -  if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0)
> -    breakpoint_re_set ();
>    clear_last_displayed_sal ();
>    clear_pc_function_cache ();
>    observer_notify_new_objfile (NULL);
> @@ -3040,9 +3035,19 @@ clear_symtab_users (int add_flags)
>    expression_context_block = NULL;
>    innermost_block = NULL;
>  
> +  /* Now that most everything has been reset, reset any existing breakpoints.
> +     Reasons for doing this after the above are that breakpoint resetting may
> +     involve:
> +     - reading the current source symtab and line,
> +     - reading the last displayed sal,
> +     - reading the pc function cache,
> +     - symbol lookup which requires, for example, invalidating any caches
> +       first.  */
> +  if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0)
> +    breakpoint_re_set ();
> +
>    /* Varobj may refer to old symbols, perform a cleanup.  */
>    varobj_invalidate ();
> -
>  }
>  
>  static void
> 
> 
> 

-- 
Joel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bp-re-set.diff
Type: text/x-diff
Size: 789 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20150129/3b84146c/attachment.bin>


More information about the Gdb-patches mailing list