[PR,symtab/17855] Fix.

Message ID 20150129071929.GE5193@adacore.com
State New, archived
Headers

Commit Message

Joel Brobecker Jan. 29, 2015, 7:19 a.m. UTC
  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
> 
> 
>
  

Comments

Doug Evans Jan. 29, 2015, 7:28 a.m. UTC | #1
On Wed, Jan 28, 2015 at 11:19 PM, Joel Brobecker <brobecker@adacore.com> wrote:
> 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.

I think yours is fine too.
I'm ok with using it.
  
Doug Evans Jan. 31, 2015, 9:07 p.m. UTC | #2
Doug Evans <xdje42@gmail.com> writes:
> On Wed, Jan 28, 2015 at 11:19 PM, Joel Brobecker <brobecker@adacore.com> wrote:
>> 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.
>
> I think yours is fine too.
> I'm ok with using it.

Hi.
There's value in the simplicity of your approach so I
committed it to trunk and the branch.
  
Pedro Alves Feb. 3, 2015, 5:01 p.m. UTC | #3
On 01/31/2015 10:07 PM, Doug Evans wrote:
> Doug Evans <xdje42@gmail.com> writes:
>> On Wed, Jan 28, 2015 at 11:19 PM, Joel Brobecker <brobecker@adacore.com> wrote:
>>> Your comment is a lot more detailed, I like it.
>>
>> I think yours is fine too.
>> I'm ok with using it.
> 
> Hi.
> There's value in the simplicity of your approach so I
> committed it to trunk and the branch.
> 

Thanks guys.

Pedro Alves
  

Patch

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