From patchwork Mon Oct 21 23:13:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 35213 Received: (qmail 44656 invoked by alias); 21 Oct 2019 23:13:16 -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 44648 invoked by uid 89); 21 Oct 2019 23:13:15 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.1 spammy= X-HELO: mx1.osci.io Received: from polly.osci.io (HELO mx1.osci.io) (8.43.85.229) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 21 Oct 2019 23:13:14 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id 787AB204C6; Mon, 21 Oct 2019 19:13:12 -0400 (EDT) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [8.43.85.239]) by mx1.osci.io (Postfix) with ESMTP id 7549820172; Mon, 21 Oct 2019 19:13:10 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 4BFA321926; Mon, 21 Oct 2019 19:13:10 -0400 (EDT) X-Gerrit-PatchSet: 5 Date: Mon, 21 Oct 2019 19:13:09 -0400 From: "Christian Biesinger (Code Review)" To: Christian Biesinger , gdb-patches@sourceware.org Cc: Simon Marchi Auto-Submitted: auto-generated X-Gerrit-MessageType: newpatchset Subject: [review v5] Store the mangled name as a string_view X-Gerrit-Change-Id: I24711ae2bcaa9e79ca89a6f8fda385d400419175 X-Gerrit-Change-Number: 37 X-Gerrit-ChangeURL: X-Gerrit-Commit: 2c8260147f0115c20a625cb5d776403ac1cbca2f In-Reply-To: References: Reply-To: cbiesinger@google.com, simon.marchi@polymtl.ca, cbiesinger@google.com, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3 Message-Id: <20191021231310.4BFA321926@gnutoolchain-gerrit.osci.io> Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/37 ...................................................................... Store the mangled name as a string_view This should be a bit faster (because we can compare the size first), but it is also a dependency for the next patch. (3.47% of gdb startup time is spent in eq_demangled_name_entry when attaching to Chrome's content_shell binary) gdb/ChangeLog: 2019-09-27 Christian Biesinger * symtab.c (struct demangled_name_entry): Change type of mangled to gdb::string_view. (hash_demangled_name_entry): Update. (eq_demangled_name_entry): Update. (symbol_set_names): Update. Change-Id: I24711ae2bcaa9e79ca89a6f8fda385d400419175 --- M gdb/symtab.c 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/gdb/symtab.c b/gdb/symtab.c index fc736fd..06c0d03 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -68,6 +68,7 @@ #include "filename-seen-cache.h" #include "arch-utils.h" #include +#include "gdbsupport/gdb_string_view.h" #include "gdbsupport/pathstuff.h" /* Forward declarations for local functions. */ @@ -713,7 +714,10 @@ /* Objects of this type are stored in the demangled name hash table. */ struct demangled_name_entry { - const char *mangled; + demangled_name_entry (gdb::string_view mangled_name) + : mangled (mangled_name) {} + + gdb::string_view mangled; ENUM_BITFIELD(language) language : LANGUAGE_BITS; char demangled[1]; }; @@ -726,7 +730,7 @@ const struct demangled_name_entry *e = (const struct demangled_name_entry *) data; - return htab_hash_string (e->mangled); + return iterative_hash (e->mangled.data (), e->mangled.length (), 0); } /* Equality function for the demangled name hash. */ @@ -739,7 +743,16 @@ const struct demangled_name_entry *db = (const struct demangled_name_entry *) b; - return strcmp (da->mangled, db->mangled) == 0; + return da->mangled == db->mangled; +} + +static void +free_demangled_name_entry (void *data) +{ + struct demangled_name_entry *e + = (struct demangled_name_entry *) data; + + e->~demangled_name_entry(); } /* Create the hash table used for demangled names. Each hash entry is @@ -756,7 +769,7 @@ 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 @@ -817,7 +830,6 @@ struct demangled_name_entry **slot; /* A 0-terminated copy of the linkage name. */ const char *linkage_name_copy; - struct demangled_name_entry entry; if (gsymbol->language == language_ada) { @@ -855,7 +867,7 @@ else linkage_name_copy = linkage_name; - entry.mangled = linkage_name_copy; + struct demangled_name_entry entry (gdb::string_view (linkage_name_copy, len)); slot = ((struct demangled_name_entry **) htab_find_slot (per_bfd->demangled_names_hash.get (), &entry, INSERT)); @@ -888,7 +900,8 @@ obstack_alloc (&per_bfd->storage_obstack, offsetof (struct demangled_name_entry, demangled) + demangled_len + 1)); - (*slot)->mangled = linkage_name; + new (*slot) demangled_name_entry + (gdb::string_view (linkage_name, len)); } else { @@ -904,7 +917,8 @@ + len + demangled_len + 2)); mangled_ptr = &((*slot)->demangled[demangled_len + 1]); strcpy (mangled_ptr, linkage_name_copy); - (*slot)->mangled = mangled_ptr; + new (*slot) demangled_name_entry + (gdb::string_view (mangled_ptr, len)); } (*slot)->language = gsymbol->language; @@ -917,7 +931,7 @@ || gsymbol->language == language_auto) gsymbol->language = (*slot)->language; - gsymbol->name = (*slot)->mangled; + gsymbol->name = (*slot)->mangled.data (); if ((*slot)->demangled[0] != '\0') symbol_set_demangled_name (gsymbol, (*slot)->demangled, &per_bfd->storage_obstack);