From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id 73D743858D1E for ; Tue, 14 Feb 2023 04:21:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 73D743858D1E Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=efficios.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=efficios.com Received: from localhost.localdomain (unknown [217.28.27.60]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id EA1FF1E110; Mon, 13 Feb 2023 23:21:40 -0500 (EST) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 1/3] gdb: store internalvars in an std::vector Date: Mon, 13 Feb 2023 23:21:37 -0500 Message-Id: <20230214042139.73638-1-simon.marchi@efficios.com> X-Mailer: git-send-email 2.39.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1173.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_NONE,KAM_DMARC_STATUS,SPF_HELO_PASS,SPF_SOFTFAIL,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Change the storage of internalvars to an std::vector of unique pointers to internalval. This helps automate memory management, and will help keep internalvars sorted in a subsequent patch. I initially tried to use an std::vector initially, but some parts of the code need for the addresses of internalvars to be stable. Change-Id: I1fca7e7877cc984a3a3432c7639d45e68d437241 --- gdb/value.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/gdb/value.c b/gdb/value.c index 7873aeb9558e..e884913abe5a 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1829,7 +1829,6 @@ union internalvar_data struct internalvar { - struct internalvar *next; char *name; /* We support various different kinds of content of an internal variable. @@ -1841,7 +1840,9 @@ struct internalvar union internalvar_data u; }; -static struct internalvar *internalvars; +using internalvar_up = std::unique_ptr; + +static std::vector internalvars; /* If the variable does not already exist create it and give it the value given. If no value is given then the default is zero. */ @@ -1891,11 +1892,9 @@ init_if_undefined_command (const char* args, int from_tty) struct internalvar * lookup_only_internalvar (const char *name) { - struct internalvar *var; - - for (var = internalvars; var; var = var->next) + for (internalvar_up &var : internalvars) if (strcmp (var->name, name) == 0) - return var; + return var.get (); return NULL; } @@ -1906,12 +1905,11 @@ lookup_only_internalvar (const char *name) void complete_internalvar (completion_tracker &tracker, const char *name) { - struct internalvar *var; int len; len = strlen (name); - for (var = internalvars; var; var = var->next) + for (internalvar_up &var : internalvars) if (strncmp (var->name, name, len) == 0) tracker.add_completion (make_unique_xstrdup (var->name)); } @@ -1922,12 +1920,12 @@ complete_internalvar (completion_tracker &tracker, const char *name) struct internalvar * create_internalvar (const char *name) { - struct internalvar *var = XNEW (struct internalvar); + internalvars.emplace_back (new internalvar); + internalvar *var = internalvars.back ().get (); var->name = xstrdup (name); var->kind = INTERNALVAR_VOID; - var->next = internalvars; - internalvars = var; + return var; } @@ -2412,8 +2410,6 @@ preserve_one_varobj (struct varobj *varobj, struct objfile *objfile, void preserve_values (struct objfile *objfile) { - struct internalvar *var; - /* Create the hash table. We allocate on the objfile's obstack, since it is soon to be deleted. */ htab_up copied_types = create_copied_types_hash (); @@ -2421,8 +2417,8 @@ preserve_values (struct objfile *objfile) for (const value_ref_ptr &item : value_history) item->preserve (objfile, copied_types.get ()); - for (var = internalvars; var; var = var->next) - preserve_one_internalvar (var, objfile, copied_types.get ()); + for (internalvar_up &var : internalvars) + preserve_one_internalvar (var.get (), objfile, copied_types.get ()); /* For the remaining varobj, check that none has type owned by OBJFILE. */ all_root_varobjs ([&copied_types, objfile] (struct varobj *varobj) @@ -2438,14 +2434,12 @@ static void show_convenience (const char *ignore, int from_tty) { struct gdbarch *gdbarch = get_current_arch (); - struct internalvar *var; int varseen = 0; struct value_print_options opts; get_user_print_options (&opts); - for (var = internalvars; var; var = var->next) + for (internalvar_up &var : internalvars) { - if (!varseen) { varseen = 1; @@ -2456,7 +2450,7 @@ show_convenience (const char *ignore, int from_tty) { struct value *val; - val = value_of_internalvar (gdbarch, var); + val = value_of_internalvar (gdbarch, var.get ()); value_print (val, gdb_stdout, &opts); } catch (const gdb_exception_error &ex) -- 2.39.1