aboutsummaryrefslogtreecommitdiff
path: root/gdb/varobj.c
diff options
context:
space:
mode:
authorLancelot SIX <lancelot.six@amd.com>2022-08-10 22:23:29 +0100
committerLancelot SIX <lancelot.six@amd.com>2022-08-11 15:10:35 +0100
commit906dca17d429f468d49a6cc4753993581c51a899 (patch)
treebedf64436956f8bd52c8084ff6c24a57261dcfa8 /gdb/varobj.c
parentccb5e559ef13f1c7a32312199f7887b463c56216 (diff)
downloadfsf-binutils-gdb-906dca17d429f468d49a6cc4753993581c51a899.zip
fsf-binutils-gdb-906dca17d429f468d49a6cc4753993581c51a899.tar.gz
fsf-binutils-gdb-906dca17d429f468d49a6cc4753993581c51a899.tar.bz2
gdb/varobj: Only re-evaluate invalid globals during re_set
When doing varobj_re_set, we currently try to recreate floating varobj. This was introduced by 4e969b4f0128 "Re-evaluate floating varobj as part of varobj_invalidate" to deal with use a after free issue. However since bc20e562ec0 "Fix use after free in varobj" we now ensure that we never have dangling pointers so this all recreation is not strictly needed anymore for floating varobjs. This commit proposes to remove this recreation process for floating varobjs. Tested on x86_64-linux.
Diffstat (limited to 'gdb/varobj.c')
-rw-r--r--gdb/varobj.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/gdb/varobj.c b/gdb/varobj.c
index 55a7bd9..d3df608 100644
--- a/gdb/varobj.c
+++ b/gdb/varobj.c
@@ -2359,29 +2359,21 @@ all_root_varobjs (gdb::function_view<void (struct varobj *var)> func)
static void
varobj_re_set_iter (struct varobj *var)
{
- /* Invalidated globals and floating var must be re-evaluated. */
- if (var->root->global || var->root->floating)
+ /* Invalidated global varobjs must be re-evaluated. */
+ if (!var->root->is_valid && var->root->global)
{
struct varobj *tmp_var;
/* Try to create a varobj with same expression. If we succeed
- replace the old varobj, otherwise invalidate it. */
+ and have a global replace the old varobj. */
tmp_var = varobj_create (nullptr, var->name.c_str (), (CORE_ADDR) 0,
- var->root->floating
- ? USE_SELECTED_FRAME : USE_CURRENT_FRAME);
- if (tmp_var != nullptr)
+ USE_CURRENT_FRAME);
+ if (tmp_var != nullptr && tmp_var->root->global)
{
- gdb_assert (var->root->floating == tmp_var->root->floating);
tmp_var->obj_name = var->obj_name;
varobj_delete (var, 0);
install_variable (tmp_var);
}
- else if (var->root->global)
- {
- /* Only invalidate globals as floating vars might still be valid in
- some other frame. */
- var->root->is_valid = false;
- }
}
}