From: Tom de Vries <tdevries@suse.de>
To: gdb-patches@sourceware.org
Subject: [PING] [PATCH v2] [gdb/symtab] Simplify memory management in parse_macro_definition
Date: Wed, 24 Jul 2024 16:46:55 +0200 [thread overview]
Message-ID: <b83ab17c-13f3-435d-98a3-dfece6d5271c@suse.de> (raw)
In-Reply-To: <20240626063233.19408-1-tdevries@suse.de>
On 6/26/24 08:32, Tom de Vries wrote:
> I noticed that parse_macro_definition does malloc and free, both for the
> argv array and its elements.
>
> Make memory management simpler by introducing a new class
> vector_c_string (copied from temporary_macro_definition here [1]) that uses an
> std::vector for the argv array.
>
Ping.
Thanks,
- Tom
> Tested on x86_64-linux.
>
> Co-Authored-By: Tom Tromey <tom@tromey.com>
>
> [1] https://sourceware.org/pipermail/gdb-patches/2024-April/208456.html
> ---
> gdb/dwarf2/macro.c | 67 +++++++++++++++++++++++++++++-----------------
> 1 file changed, 43 insertions(+), 24 deletions(-)
>
> diff --git a/gdb/dwarf2/macro.c b/gdb/dwarf2/macro.c
> index bc781c2cb92..e558a900a2c 100644
> --- a/gdb/dwarf2/macro.c
> +++ b/gdb/dwarf2/macro.c
> @@ -36,6 +36,34 @@
> #include "complaints.h"
> #include "objfiles.h"
>
> +/* Vector of C strings. */
> +
> +struct vector_c_string
> +{
> + vector_c_string () = default;
> + DISABLE_COPY_AND_ASSIGN (vector_c_string);
> +
> + ~vector_c_string ()
> + {
> + free_vector_argv (argv);
> + }
> +
> + /* Add element to vector. */
> + void push_back (gdb::unique_xmalloc_ptr<char> &&value)
> + {
> + argv.push_back (value.release ());
> + }
> +
> + /* De-allocate elements and clear vector. */
> + void clear ()
> + {
> + free_vector_argv (argv);
> + argv.clear ();
> + }
> +
> + std::vector<char *> argv;
> +};
> +
> static void
> dwarf2_macro_malformed_definition_complaint (const char *arg1)
> {
> @@ -103,7 +131,7 @@ consume_improper_spaces (const char *p, const char *body)
>
> static void
> parse_macro_definition (struct macro_source_file *file, int line,
> - const char *body)
> + const char *body, vector_c_string &tmp)
> {
> const char *p;
>
> @@ -159,15 +187,14 @@ parse_macro_definition (struct macro_source_file *file, int line,
>
> /* It's a function-like macro. */
> gdb_assert (*p == '(');
> - std::string name (body, p - body);
> - int argc = 0;
> - int argv_size = 1;
> - char **argv = XNEWVEC (char *, argv_size);
>
> + std::string name (body, p - body);
> p++;
>
> p = consume_improper_spaces (p, body);
>
> + tmp.clear ();
> +
> /* Parse the formal argument list. */
> while (*p && *p != ')')
> {
> @@ -181,14 +208,9 @@ parse_macro_definition (struct macro_source_file *file, int line,
> dwarf2_macro_malformed_definition_complaint (body);
> else
> {
> - /* Make sure argv has room for the new argument. */
> - if (argc >= argv_size)
> - {
> - argv_size *= 2;
> - argv = XRESIZEVEC (char *, argv, argv_size);
> - }
> -
> - argv[argc++] = savestring (arg_start, p - arg_start);
> + gdb::unique_xmalloc_ptr<char> arg (savestring (arg_start,
> + p - arg_start));
> + tmp.push_back (std::move (arg));
> }
>
> p = consume_improper_spaces (p, body);
> @@ -209,15 +231,15 @@ parse_macro_definition (struct macro_source_file *file, int line,
> if (*p == ' ')
> /* Perfectly formed definition, no complaints. */
> macro_define_function (file, line, name.c_str (),
> - argc, (const char **) argv,
> - p + 1);
> + tmp.argv.size (),
> + (const char **) tmp.argv.data (), p + 1);
> else if (*p == '\0')
> {
> /* Complain, but do define it. */
> dwarf2_macro_malformed_definition_complaint (body);
> macro_define_function (file, line, name.c_str (),
> - argc, (const char **) argv,
> - p);
> + tmp.argv.size (),
> + (const char **) tmp.argv.data (), p);
> }
> else
> /* Just complain. */
> @@ -226,11 +248,6 @@ parse_macro_definition (struct macro_source_file *file, int line,
> else
> /* Just complain. */
> dwarf2_macro_malformed_definition_complaint (body);
> -
> - for (int i = 0; i < argc; i++)
> - xfree (argv[i]);
> -
> - xfree (argv);
> }
>
> /* Skip some bytes from BYTES according to the form given in FORM.
> @@ -446,6 +463,8 @@ dwarf_decode_macro_bytes (dwarf2_per_objfile *per_objfile,
> int at_commandline;
> const gdb_byte *opcode_definitions[256];
>
> + vector_c_string tmp;
> +
> mac_ptr = dwarf_parse_macro_header (opcode_definitions, abfd, mac_ptr,
> &offset_size, section_is_gnu);
> if (mac_ptr == NULL)
> @@ -563,7 +582,7 @@ dwarf_decode_macro_bytes (dwarf2_per_objfile *per_objfile,
> line, current_file->filename);
> }
> else if (is_define)
> - parse_macro_definition (current_file, line, body);
> + parse_macro_definition (current_file, line, body, tmp);
> else
> {
> gdb_assert (macinfo_type == DW_MACRO_undef
> @@ -627,7 +646,7 @@ dwarf_decode_macro_bytes (dwarf2_per_objfile *per_objfile,
> }
>
> if (macinfo_type == DW_MACRO_define_strx)
> - parse_macro_definition (current_file, line, body);
> + parse_macro_definition (current_file, line, body, tmp);
> else
> macro_undef (current_file, line, body);
> }
>
> base-commit: bd54c881cd14af32f2347dab5ce51823ed631a88
next prev parent reply other threads:[~2024-07-24 14:47 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-26 6:32 Tom de Vries
2024-07-24 14:46 ` Tom de Vries [this message]
2024-07-24 16:07 ` Simon Marchi
2024-07-24 16:12 ` Tom de Vries
2024-07-29 16:13 ` Tom de Vries
2024-07-29 16:28 ` Simon Marchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b83ab17c-13f3-435d-98a3-dfece6d5271c@suse.de \
--to=tdevries@suse.de \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox