From patchwork Wed Oct 2 19:46:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Terekhov, Mikhail via Gdb-patches" X-Patchwork-Id: 34799 Received: (qmail 106852 invoked by alias); 2 Oct 2019 19:46:26 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 106834 invoked by uid 89); 2 Oct 2019 19:46:26 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=H*MI:google X-HELO: mail-qk1-f201.google.com Received: from mail-qk1-f201.google.com (HELO mail-qk1-f201.google.com) (209.85.222.201) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 02 Oct 2019 19:46:24 +0000 Received: by mail-qk1-f201.google.com with SMTP id r17so131294qkm.16 for ; Wed, 02 Oct 2019 12:46:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=BKOqv+zjOyJsw6xa9GgnIPXXY8Da5e+dcohjMh7D8Os=; b=l6gXLuVS291rnTP5UVFE8b/MwKJAPzZOIjftrldbTJ9LyysuTAbnY12CiDUdg/4Qq6 erk2c7ng231p9uhUol5HL2ApWovT72wCCgC6EDV0u8w5oqhgVgz9CQd28m+CvgevX+43 4KCSadvD2CBFiRSBhjddbYSktDq9E7NC0+hDp3epaCwmo7ngwxZbS1syq4I//e5+iwfH asCrrqhjjy3ugZdOspFmEI9sLA1ptvdde9wswBROMsIDWc2bheArulIcCpeGcwwWXHC0 v3srxnK2UOtSwH7w6WEWhOPv3FoEuzjD2gWwJqq7PEAbdSs3YVTnUHQTQ1bHXf0frulQ bAxA== Date: Wed, 2 Oct 2019 14:46:19 -0500 Message-Id: <20191002194619.72854-1-cbiesinger@google.com> Mime-Version: 1.0 Subject: [PATCH] Don't make an extra copy + allocation of the demangled name X-Patchwork-Original-From: "Christian Biesinger via gdb-patches" From: "Terekhov, Mikhail via Gdb-patches" Reply-To: Christian Biesinger To: gdb-patches@sourceware.org Cc: Christian Biesinger X-IsSubscribed: yes We can just keep around the malloc()-ed name we got from bfd and free it later. gdb/ChangeLog: 2019-10-02 Christian Biesinger * symtab.c (struct demangled_name_entry): Change demangled name to a char*, now that we don't allocate it as part of the struct anymore. (free_demangled_name_entry): New function. (create_demangled_names_hash): Pass free function to htab_create_alloc. (symbol_set_names): No longer obstack allocate + copy the demangled name, just store the allocated name from bfd. --- gdb/symtab.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/gdb/symtab.c b/gdb/symtab.c index 8a551f1575..a185f922ad 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -715,7 +715,7 @@ struct demangled_name_entry { const char *mangled; ENUM_BITFIELD(language) language : LANGUAGE_BITS; - char demangled[1]; + char* demangled; }; /* Hash function for the demangled name hash. */ @@ -742,6 +742,15 @@ eq_demangled_name_entry (const void *a, const void *b) return strcmp (da->mangled, db->mangled) == 0; } +static void +free_demangled_name_entry (void *data) +{ + struct demangled_name_entry *e + = (struct demangled_name_entry *) data; + + xfree (e->demangled); +} + /* Create the hash table used for demangled names. Each hash entry is a pair of strings; one for the mangled name and one for the demangled name. The entry is hashed via just the mangled name. */ @@ -756,7 +765,7 @@ create_demangled_names_hash (struct objfile_per_bfd_storage *per_bfd) per_bfd->demangled_names_hash.reset (htab_create_alloc (256, hash_demangled_name_entry, eq_demangled_name_entry, - NULL, xcalloc, xfree)); + free_demangled_name_entry, xcalloc, xfree)); } /* Try to determine the demangled name for a symbol, based on the @@ -869,8 +878,6 @@ symbol_set_names (struct general_symbol_info *gsymbol, { char *demangled_name_ptr = symbol_find_demangled_name (gsymbol, linkage_name_copy); - gdb::unique_xmalloc_ptr demangled_name (demangled_name_ptr); - int demangled_len = demangled_name ? strlen (demangled_name.get ()) : 0; /* Suppose we have demangled_name==NULL, copy_name==0, and linkage_name_copy==linkage_name. In this case, we already have the @@ -886,39 +893,31 @@ symbol_set_names (struct general_symbol_info *gsymbol, *slot = ((struct demangled_name_entry *) obstack_alloc (&per_bfd->storage_obstack, - offsetof (struct demangled_name_entry, demangled) - + demangled_len + 1)); + sizeof (demangled_name_entry))); (*slot)->mangled = linkage_name; } else { - char *mangled_ptr; - /* If we must copy the mangled name, put it directly after - the demangled name so we can have a single + the struct so we can have a single allocation. */ *slot = ((struct demangled_name_entry *) obstack_alloc (&per_bfd->storage_obstack, - offsetof (struct demangled_name_entry, demangled) - + len + demangled_len + 2)); - mangled_ptr = &((*slot)->demangled[demangled_len + 1]); + sizeof (demangled_name_entry) + len + 1)); + char *mangled_ptr = reinterpret_cast (*slot + 1); strcpy (mangled_ptr, linkage_name_copy); (*slot)->mangled = mangled_ptr; } + (*slot)->demangled = demangled_name_ptr; (*slot)->language = gsymbol->language; - - if (demangled_name != NULL) - strcpy ((*slot)->demangled, demangled_name.get ()); - else - (*slot)->demangled[0] = '\0'; } else if (gsymbol->language == language_unknown || gsymbol->language == language_auto) gsymbol->language = (*slot)->language; gsymbol->name = (*slot)->mangled; - if ((*slot)->demangled[0] != '\0') + if ((*slot)->demangled != nullptr) symbol_set_demangled_name (gsymbol, (*slot)->demangled, &per_bfd->storage_obstack); else