From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8917 invoked by alias); 1 Sep 2014 07:28:36 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 8900 invoked by uid 89); 1 Sep 2014 07:28:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 01 Sep 2014 07:28:34 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-FEM-01.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1XOM2Q-0001yF-DS from Taimoor_Mirza@mentor.com for gdb-patches@sourceware.org; Mon, 01 Sep 2014 00:28:31 -0700 Received: from [137.202.156.220] (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server (TLS) id 14.2.247.3; Mon, 1 Sep 2014 08:28:29 +0100 Message-ID: <5404201A.3060308@codesourcery.com> Date: Mon, 01 Sep 2014 07:28:00 -0000 From: Taimoor User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.0 MIME-Version: 1.0 To: Subject: Re: [PING][PATCH 1/2] Fix varobj updation after symbol removal References: <1403864035-30650-1-git-send-email-tmirza@codesourcery.com> <1403864035-30650-2-git-send-email-tmirza@codesourcery.com> <53E0B954.3050407@codesourcery.com> In-Reply-To: <53E0B954.3050407@codesourcery.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2014-09/txt/msg00008.txt.bz2 Ping On 08/05/2014 04:00 PM, Taimoor wrote: > > Ping. > > On 06/27/2014 03:13 PM, Taimoor Mirza wrote: >> This problem was observed while loading and unloading symbols using >> add-symbol-file and remove-symbol-file. When remove-symbol-file >> command is invoked, it calls clear_symtab_users that calls >> varobj_invalidate >> to invalidate variable objects. This function invalidates the varobjs >> that are tied to locals and re-create the ones that are defined on >> globals. During this re-creation of globals, variable objects are >> re-evaluated that can result in new value. But this change is not >> recorded >> and because of this, -var-update for such modified variable objects >> gives empty change list. >> >> Proposed Fix: >> ============= >> GDB has mechanism of marking varobj's updated if they are set via >> varobj_set_value operation. This allows any next -var-update to report >> this change. Same approach should be used during varobj invalidation. >> If value of newly created varobj is different from previous one, mark it >> updated so that -var-update can get this change. >> >> Variable object invalidation code is cleaned up to avoid using pointers >> whose target has been already freed. >> >> Fix Testing: >> =========== >> This fix has been regression tested on both simulator and real boards. >> >> 2014-06-27 Taimoor Mirza >> Maciej W. Rozycki >> >> gdb/ >> * varobj.h (varobj_is_valid_p, varobj_set_invalid): New >> prototypes. >> * varobj.c (varobj_is_valid_p, varobj_set_invalid): New >> functions. >> (varobj_invalidate_iter): Mark re-created global object updated >> if its value is different from previous value. >> * objfiles.c (invalidate_objfile_varobj_type_iter): New >> function. >> (free_objfile): Call it. >> >> --- >> gdb/objfiles.c | 19 +++++++++++++++++++ >> gdb/varobj.c | 37 +++++++++++++++++++++++++++++++++++++ >> gdb/varobj.h | 3 +++ >> 3 files changed, 59 insertions(+) >> >> diff --git a/gdb/objfiles.c b/gdb/objfiles.c >> index 0a0b1cb..03559a3 100644 >> --- a/gdb/objfiles.c >> +++ b/gdb/objfiles.c >> @@ -32,6 +32,7 @@ >> #include "bcache.h" >> #include "expression.h" >> #include "parser-defs.h" >> +#include "varobj.h" >> >> #include "gdb_assert.h" >> #include >> @@ -538,6 +539,21 @@ free_objfile_separate_debug (struct objfile >> *objfile) >> } >> } >> >> +/* Mark the variable object VAR invalid if built upon a type coming from >> + the objfile requested, passed as DATA. Also clear the type >> reference. */ >> + >> +static void >> +invalidate_objfile_varobj_type_iter (struct varobj *var, void *data) >> +{ >> + struct objfile *objfile = data; >> + >> + if (varobj_is_valid_p (var) && TYPE_OBJFILE (var->type) == objfile) >> + { >> + varobj_set_invalid (var); >> + var->type = NULL; >> + } >> +} >> + >> /* Destroy an objfile and all the symtabs and psymtabs under it. */ >> >> void >> @@ -584,6 +600,9 @@ free_objfile (struct objfile *objfile) >> lists. */ >> preserve_values (objfile); >> >> + /* Varobj may refer to types stored in objfile's obstack. */ >> + all_root_varobjs (invalidate_objfile_varobj_type_iter, objfile); >> + >> /* It still may reference data modules have associated with the >> objfile and >> the symbol file data. */ >> forget_cached_source_info_for_objfile (objfile); >> diff --git a/gdb/varobj.c b/gdb/varobj.c >> index 7446f10..2a563af 100644 >> --- a/gdb/varobj.c >> +++ b/gdb/varobj.c >> @@ -2683,6 +2683,22 @@ varobj_floating_p (struct varobj *var) >> return var->root->floating; >> } >> >> +/* Get the valid flag of varobj VAR. */ >> + >> +int >> +varobj_is_valid_p (struct varobj *var) >> +{ >> + return var->root->is_valid; >> +} >> + >> +/* Clear the valid flag on varobj VAR. */ >> + >> +void >> +varobj_set_invalid (struct varobj *var) >> +{ >> + var->root->is_valid = 0; >> +} >> + >> /* Implement the "value_is_changeable_p" varobj callback for most >> languages. */ >> >> @@ -2762,6 +2778,7 @@ varobj_invalidate_iter (struct varobj *var, void >> *unused) >> if (var->root->floating || var->root->valid_block == NULL) >> { >> struct varobj *tmp_var; >> + char *tmp_var_value, *var_value; >> >> /* Try to create a varobj with same expression. If we succeed >> replace the old varobj, otherwise invalidate it. */ >> @@ -2770,6 +2787,26 @@ varobj_invalidate_iter (struct varobj *var, >> void *unused) >> if (tmp_var != NULL) >> { >> tmp_var->obj_name = xstrdup (var->obj_name); >> + tmp_var_value = varobj_get_value (tmp_var); >> + var_value = varobj_get_value (var); >> + >> + /* As varobjs are re-evaluated during creation so there is a >> + chance that new value is different from old one. Compare >> + value of old varobj and newly created varobj and mark >> + varobj updated If new value is different. */ >> + if (var_value == NULL && tmp_var_value == NULL) >> + ; /* Equal. */ >> + else if (var_value == NULL || tmp_var_value == NULL) >> + tmp_var->updated = 1; >> + else >> + { >> + /* Mark tmp_var updated if new value is different. */ >> + if (strcmp (tmp_var_value, var_value) != 0) >> + tmp_var->updated = 1; >> + } >> + >> + xfree (tmp_var_value); >> + xfree (var_value); >> varobj_delete (var, NULL, 0); >> install_variable (tmp_var); >> } >> diff --git a/gdb/varobj.h b/gdb/varobj.h >> index 74d41cf..7439a94 100644 >> --- a/gdb/varobj.h >> +++ b/gdb/varobj.h >> @@ -299,6 +299,9 @@ extern int varobj_editable_p (struct varobj *var); >> >> extern int varobj_floating_p (struct varobj *var); >> >> +extern int varobj_is_valid_p (struct varobj *var); >> +extern void varobj_set_invalid (struct varobj *var); >> + >> extern void varobj_set_visualizer (struct varobj *var, >> const char *visualizer); >> >>