This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][PR symtab/17855] Fix.


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
diff --git a/gdb/symfile.c b/gdb/symfile.c
index d55e361..04a5c58 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -3028,8 +3028,6 @@ clear_symtab_users (int add_flags)
   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);
@@ -3043,6 +3041,10 @@ clear_symtab_users (int add_flags)
   /* Varobj may refer to old symbols, perform a cleanup.  */
   varobj_invalidate ();
 
+  /* Now that the various caches have been cleared, we can re_set
+     our breakpoints without risking it using stale data.  */
+  if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0)
+    breakpoint_re_set ();
 }
 
 static void

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]