From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id YNV0Jyy2e2ZDgw4AWB0awg (envelope-from ) for ; Wed, 26 Jun 2024 02:33:16 -0400 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=IpRFUsu8; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=QTCxhlvZ; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=s5IVHjOP; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=p8kcFpFg; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 940B81E0C1; Wed, 26 Jun 2024 02:33:16 -0400 (EDT) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 4E2791E092 for ; Wed, 26 Jun 2024 02:33:14 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 95946384609B for ; Wed, 26 Jun 2024 06:33:12 +0000 (GMT) Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2a07:de40:b251:101:10:150:64:1]) by sourceware.org (Postfix) with ESMTPS id D2853385841E for ; Wed, 26 Jun 2024 06:32:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D2853385841E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org D2853385841E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:1 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719383571; cv=none; b=oUpOoHo29AYf9QJtdc9EbFImHWVOewznp5FQX8tKxhgIf3zqqr50Q4EuGahfkQE3LkGIf4ffoIXDef67IRGniZlB5oH/T5OKFGKQrnPG8RllKETA7gJqAO+edKb9hvP80dSk0yl999WyoZbzxuIDO/FnUFgZg74xovtYOSTAYlw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719383571; c=relaxed/simple; bh=3CgsUKfqdTj1/ku0VdP3NH6Iscl078TyEZbJAWEq8NM=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-Id:MIME-Version; b=ENQNy5czzeQkAs/xR/pIStQjv5TGlr/IOcmTze2Y4adjlnPXIYxr7XMkF9om6I6LjKp3Sak9SWWXG/tyqEEpUIp7niT5omxGphT+hr4eamvFavOZMglUQdNLTLQrtpovkTdfqlLprARBrgFJ8qnc4U/UagHbGVK7FiQPkw3k9Sc= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 7465321AB3 for ; Wed, 26 Jun 2024 06:32:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1719383568; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=026FpVfX0JqWHThJY7X6Iwo7GjnPJ3eqhntOoDz604g=; b=IpRFUsu8doDChu5YsiXt42b/0/Du2SoO7TVszURkIj+8plmI7kRqJW8AzAfQmmYhBNo8bn 4sw6K/PQpLO/S6ECaT40g9yf7ZqnYLN0Ou7kZis8g03Eswd1z9rCk7PBgccEiybzz58kjK 8bUGtk+OKZDs9Qmlvq41YpUBDKTh6gI= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1719383568; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=026FpVfX0JqWHThJY7X6Iwo7GjnPJ3eqhntOoDz604g=; b=QTCxhlvZ6Tht2B0KX/COeKsTIuV4LyzEOJKDcdLmNHFEb+GN5mystLoX9KiAZzRKPPot4s fAEZsX3zkqKPShDg== Authentication-Results: smtp-out1.suse.de; dkim=pass header.d=suse.de header.s=susede2_rsa header.b=s5IVHjOP; dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=p8kcFpFg DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1719383567; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=026FpVfX0JqWHThJY7X6Iwo7GjnPJ3eqhntOoDz604g=; b=s5IVHjOPcfNtXxSibiIlhTRDsrdhdrSoiDtUQNqZMaL1QrbQUXNXxvf/jUAQvo6jBOTJl5 ndaGk2XyVyniKVs5012CVjU5QouO1U0ifpK6m3XHR1MEl/L04mqEYybUVU2adh+5yaD+oB v1gUscq1hvfUiYDWInkxeC/YnFpIY3U= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1719383567; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=026FpVfX0JqWHThJY7X6Iwo7GjnPJ3eqhntOoDz604g=; b=p8kcFpFgSSTr53jnYyzIV4FOjeSLgyJv+voahk0VGRNWPIvbLxs7eOLvN/LLidIQKbCfWw 4+ARxesuwwCWqaCA== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 5C33D139C2 for ; Wed, 26 Jun 2024 06:32:47 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id WwDwFA+2e2aOOAAAD6G6ig (envelope-from ) for ; Wed, 26 Jun 2024 06:32:47 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH v2] [gdb/symtab] Simplify memory management in parse_macro_definition Date: Wed, 26 Jun 2024 08:32:33 +0200 Message-Id: <20240626063233.19408-1-tdevries@suse.de> X-Mailer: git-send-email 2.35.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spamd-Result: default: False [-5.01 / 50.00]; BAYES_HAM(-3.00)[100.00%]; DWL_DNSWL_MED(-2.00)[suse.de:dkim]; NEURAL_HAM_LONG(-1.00)[-1.000]; MID_CONTAINS_FROM(1.00)[]; R_MISSING_CHARSET(0.50)[]; R_DKIM_ALLOW(-0.20)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; MX_GOOD(-0.01)[]; FUZZY_BLOCKED(0.00)[rspamd.com]; MIME_TRACE(0.00)[0:+]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; RCPT_COUNT_ONE(0.00)[1]; ARC_NA(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; RCVD_TLS_ALL(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; FROM_EQ_ENVFROM(0.00)[]; FROM_HAS_DN(0.00)[]; DKIM_TRACE(0.00)[suse.de:+]; RCVD_COUNT_TWO(0.00)[2]; PREVIOUSLY_DELIVERED(0.00)[gdb-patches@sourceware.org]; TO_DN_NONE(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:dkim, imap1.dmz-prg2.suse.org:helo, imap1.dmz-prg2.suse.org:rdns] X-Rspamd-Action: no action X-Rspamd-Server: rspamd2.dmz-prg2.suse.org X-Rspamd-Queue-Id: 7465321AB3 X-Spam-Score: -5.01 X-Spam-Level: X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, 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 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org 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. Tested on x86_64-linux. Co-Authored-By: Tom Tromey [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 &&value) + { + argv.push_back (value.release ()); + } + + /* De-allocate elements and clear vector. */ + void clear () + { + free_vector_argv (argv); + argv.clear (); + } + + std::vector 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 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 -- 2.35.3