From patchwork Sun Apr 21 17:00:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 88818 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 564CB384AB5D for ; Sun, 21 Apr 2024 17:01:36 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from omta34.uswest2.a.cloudfilter.net (omta34.uswest2.a.cloudfilter.net [35.89.44.33]) by sourceware.org (Postfix) with ESMTPS id 77E573858D34 for ; Sun, 21 Apr 2024 17:00:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 77E573858D34 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tromey.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 77E573858D34 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=35.89.44.33 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713718811; cv=none; b=rzd5BSmfYnh8vPTetpD3XAExviCAAxO8duTKY1Lv/ROQCbDZNQ6Ft74kJpPOVUQIOK1PmZm0DKeUKlqS+8gI/nsdckfcBqArTf78wK6PqihbQFMXk0h0fS1ouDH/JhmdQCKba/0bLrgTiXKdt6TxuVII5ywiPzsR9gYREC1httU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713718811; c=relaxed/simple; bh=3v29XyiZuuW/mfPv6sHEjYkMTna4IRPwMc+hAWooquY=; h=DKIM-Signature:From:Date:Subject:MIME-Version:Message-Id:To; b=sJiC7SL/1epQAEXbYGa35XCttD60TYZkIlV/HsoAHpvihusPlFYiYxFt7Xyotmn28y0TEsryYHx4LHeNlDrpMhfIW1A7Umou6gH/U1jq5ZFFY6rqTShWy7xxtBoLtWXRBs7jIiVfjMonup/ha8Qej3LGN8BqxspxxMOrbrScyiI= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from eig-obgw-6002a.ext.cloudfilter.net ([10.0.30.222]) by cmsmtp with ESMTPS id yPDar5BaSHXmAyaXsr1W0j; Sun, 21 Apr 2024 17:00:04 +0000 Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with ESMTPS id yaXrrPsRUiKqRyaXsrylKB; Sun, 21 Apr 2024 17:00:04 +0000 X-Authority-Analysis: v=2.4 cv=I9quR8gg c=1 sm=1 tr=0 ts=66254614 a=ApxJNpeYhEAb1aAlGBBbmA==:117 a=ApxJNpeYhEAb1aAlGBBbmA==:17 a=IkcTkHD0fZMA:10 a=raytVjVEu-sA:10 a=Qbun_eYptAEA:10 a=s53vAFbfyyM1y-YKfssA:9 a=QEXdDO2ut3YA:10 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=To:In-Reply-To:References:Message-Id:Content-Transfer-Encoding: Content-Type:MIME-Version:Subject:Date:From:Sender:Reply-To:Cc:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=ZMQ5AVvo8eTnGbQqjNHNpuD2o+K8J0a6A03beNRp6so=; b=shuJo0+9ADa90BhWmV58x+/Neu fxy+eiBzeR76AN8iEos+TsY0qBFLTsh/T5+e/rdnNnFKrzJV2eis9DGPOdS8Vb6uf42CQU3WEZmfF Qqv0S/7qgf5nHtHKNfma2Jw4Q; Received: from 97-122-86-252.hlrn.qwest.net ([97.122.86.252]:53968 helo=[192.168.0.21]) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96.2) (envelope-from ) id 1ryaXr-003wVC-1V for gdb-patches@sourceware.org; Sun, 21 Apr 2024 11:00:03 -0600 From: Tom Tromey Date: Sun, 21 Apr 2024 11:00:04 -0600 Subject: [PATCH 04/10] Change storage of demangle_component MIME-Version: 1.0 Message-Id: <20240421-canon-fixes-v1-4-4dc4791d270d@tromey.com> References: <20240421-canon-fixes-v1-0-4dc4791d270d@tromey.com> In-Reply-To: <20240421-canon-fixes-v1-0-4dc4791d270d@tromey.com> To: gdb-patches@sourceware.org X-Mailer: b4 0.13.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 97.122.86.252 X-Source-L: No X-Exim-ID: 1ryaXr-003wVC-1V X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 97-122-86-252.hlrn.qwest.net ([192.168.0.21]) [97.122.86.252]:53968 X-Source-Auth: tom+tromey.com X-Email-Count: 5 X-Org: HG=bhshared;ORG=bluehost; X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-CMAE-Envelope: MS4xfPeNkiJHuRUhxf7eRjxUJy6PxbBHBbO6q9rbj0b+impHl70VU2PCMOtckNcLc//qEPSQ+qmJ0geMnnaYRW5u+iRG3wtNFQuMA0nnqs2Na4UzoWF8oBDE CqrN5OY6ncn2pfVcEt8Q9GiGqcSZfnb/33lLLA9RoTafZfyxqOiEC3sk8SrfGtVm1/gJl3Cea8tCyxx3N67nYV39XFcGVXRSYrc= X-Spam-Status: No, score=-3021.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, JMQ_SPF_NEUTRAL, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP, T_FILL_THIS_FORM_SHORT 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+patchwork=sourceware.org@sourceware.org This changes demangle_component objects to be stored on the obstack that is part of demangle_info. It also arranges for a demangle_info object to be kept alive by cp_merge_demangle_parse_infos. This way, other data on the obstack can be kept while an "outer" demangle_info needs it. Acked-By: John Baldwin --- gdb/cp-name-parser.y | 78 +++++----------------------------------------------- gdb/cp-support.c | 2 +- gdb/cp-support.h | 15 ++++------ 3 files changed, 14 insertions(+), 81 deletions(-) diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y index 2f73be35f37..6003ed0b01e 100644 --- a/gdb/cp-name-parser.y +++ b/gdb/cp-name-parser.y @@ -48,17 +48,6 @@ #define GDB_YY_REMAP_PREFIX cpname #include "yy-remap.h" -/* The components built by the parser are allocated ahead of time, - and cached in this structure. */ - -#define ALLOC_CHUNK 100 - -struct demangle_info { - int used; - struct demangle_info *next; - struct demangle_component comps[ALLOC_CHUNK]; -}; - %} %union @@ -92,7 +81,7 @@ struct cpname_state const char *lexptr, *prev_lexptr, *error_lexptr, *global_errmsg; - struct demangle_info *demangle_info; + demangle_parse_info *demangle_info; /* The parse tree created by the parser is stored here after a successful parse. */ @@ -136,23 +125,7 @@ struct cpname_state struct demangle_component * cpname_state::d_grab () { - struct demangle_info *more; - - if (demangle_info->used >= ALLOC_CHUNK) - { - if (demangle_info->next == NULL) - { - more = XNEW (struct demangle_info); - more->next = NULL; - demangle_info->next = more; - } - else - more = demangle_info->next; - - more->used = 0; - demangle_info = more; - } - return &demangle_info->comps[demangle_info->used++]; + return obstack_new (&demangle_info->obstack); } /* Flags passed to d_qualify. */ @@ -1933,20 +1906,6 @@ yyerror (cpname_state *state, const char *msg) state->global_errmsg = msg ? msg : "parse error"; } -/* Allocate a chunk of the components we'll need to build a tree. We - generally allocate too many components, but the extra memory usage - doesn't hurt because the trees are temporary and the storage is - reused. More may be allocated later, by d_grab. */ -static struct demangle_info * -allocate_info (void) -{ - struct demangle_info *info = XNEW (struct demangle_info); - - info->next = NULL; - info->used = 0; - return info; -} - /* See cp-support.h. */ gdb::unique_xmalloc_ptr @@ -1959,20 +1918,6 @@ cp_comp_to_string (struct demangle_component *result, int estimated_len) return gdb::unique_xmalloc_ptr (res); } -/* Destructor for demangle_parse_info. */ - -demangle_parse_info::~demangle_parse_info () -{ - /* Free any allocated chunks of memory for the parse. */ - while (info != NULL) - { - struct demangle_info *next = info->next; - - free (info); - info = next; - } -} - /* Merge the two parse trees given by DEST and SRC. The parse tree in SRC is attached to DEST at the node represented by TARGET. @@ -1986,21 +1931,14 @@ demangle_parse_info::~demangle_parse_info () void cp_merge_demangle_parse_infos (struct demangle_parse_info *dest, struct demangle_component *target, - struct demangle_parse_info *src) + std::unique_ptr src) { - struct demangle_info *di; - /* Copy the SRC's parse data into DEST. */ *target = *src->tree; - di = dest->info; - while (di->next != NULL) - di = di->next; - di->next = src->info; - - /* Clear the (pointer to) SRC's parse data so that it is not freed when - cp_demangled_parse_info_free is called. */ - src->info = NULL; + + /* Make sure SRC is owned by DEST. */ + dest->infos.push_back (std::move (src)); } /* Convert a demangled name to a demangle_component tree. On success, @@ -2018,10 +1956,8 @@ cp_demangled_name_to_comp (const char *demangled_name, state.error_lexptr = NULL; state.global_errmsg = NULL; - state.demangle_info = allocate_info (); - auto result = std::make_unique (); - result->info = state.demangle_info; + state.demangle_info = result.get (); if (yyparse (&state)) { diff --git a/gdb/cp-support.c b/gdb/cp-support.c index e6e811ddf50..4c64e4963e4 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -258,7 +258,7 @@ inspect_type (struct demangle_parse_info *info, if (i != NULL) { /* Merge the two trees. */ - cp_merge_demangle_parse_infos (info, ret_comp, i.get ()); + cp_merge_demangle_parse_infos (info, ret_comp, std::move (i)); /* Replace any newly introduced typedefs -- but not if the type is anonymous (that would lead to infinite diff --git a/gdb/cp-support.h b/gdb/cp-support.h index d0bedcd7b80..765c4435f41 100644 --- a/gdb/cp-support.h +++ b/gdb/cp-support.h @@ -58,18 +58,15 @@ struct using_direct; struct demangle_parse_info { - demangle_parse_info () = default; - - ~demangle_parse_info (); - - /* The memory used during the parse. */ - struct demangle_info *info = nullptr; - /* The result of the parse. */ struct demangle_component *tree = nullptr; - /* Any temporary memory used during typedef replacement. */ + /* Any memory used during processing. */ auto_obstack obstack; + + /* Any other objects referred to by this object, and whose storage + lifetime must be linked. */ + std::vector> infos; }; @@ -182,7 +179,7 @@ extern gdb::unique_xmalloc_ptr cp_comp_to_string extern void cp_merge_demangle_parse_infos (struct demangle_parse_info *, struct demangle_component *, - struct demangle_parse_info *); + std::unique_ptr); /* The list of "maint cplus" commands. */