From patchwork Fri Oct 25 20:02:27 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: 35351 Received: (qmail 121812 invoked by alias); 25 Oct 2019 20:02:34 -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 121800 invoked by uid 89); 25 Oct 2019 20:02:34 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.3 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; Fri, 25 Oct 2019 20:02:33 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id 5881A21059; Fri, 25 Oct 2019 16:02:31 -0400 (EDT) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [8.43.85.239]) by mx1.osci.io (Postfix) with ESMTP id 45C78202EB; Fri, 25 Oct 2019 16:02:28 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 1F68A204C9; Fri, 25 Oct 2019 16:02:28 -0400 (EDT) X-Gerrit-PatchSet: 2 Date: Fri, 25 Oct 2019 16:02:27 -0400 From: "Christian Biesinger (Code Review)" To: Christian Biesinger , Luis Machado , gdb-patches@sourceware.org Cc: Tom Tromey Auto-Submitted: auto-generated X-Gerrit-MessageType: newpatchset Subject: [review v2] Only make a nullterminated string if we need to X-Gerrit-Change-Id: I183302e1f51483ff6dff0fd5c3b0f32f0f04a5d2 X-Gerrit-Change-Number: 222 X-Gerrit-ChangeURL: X-Gerrit-Commit: 5e11c9b9bba232a71f62bef9f7fb3e798e1c9ffa In-Reply-To: References: Reply-To: cbiesinger@google.com, tromey@sourceware.org, luis.machado@linaro.org, cbiesinger@google.com, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3 Message-Id: <20191025200228.1F68A204C9@gnutoolchain-gerrit.osci.io> Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/222 ...................................................................... Only make a nullterminated string if we need to As of 7bb43059820c5febb4509b15202a93efde442bc6, we no longer need a nullterminated linkage_name to look up the entry in the hash table. So this patch makes it so we only make the copy if the entry was not found. gdb/ChangeLog: 2019-10-22 Christian Biesinger * symtab.c (symbol_set_names): Only make a nullterminated copy of linkage_name if the entry was not found and we need to demangle. Change-Id: I183302e1f51483ff6dff0fd5c3b0f32f0f04a5d2 --- M gdb/symtab.c 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/gdb/symtab.c b/gdb/symtab.c index 79c5fde..65d6311 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -832,8 +832,6 @@ struct objfile_per_bfd_storage *per_bfd) { struct demangled_name_entry **slot; - /* A 0-terminated copy of the linkage name. */ - const char *linkage_name_copy; if (gsymbol->language == language_ada) { @@ -858,20 +856,7 @@ if (per_bfd->demangled_names_hash == NULL) create_demangled_names_hash (per_bfd); - if (linkage_name[len] != '\0') - { - char *alloc_name; - - alloc_name = (char *) alloca (len + 1); - memcpy (alloc_name, linkage_name, len); - alloc_name[len] = '\0'; - - linkage_name_copy = alloc_name; - } - else - linkage_name_copy = linkage_name; - - struct demangled_name_entry entry (gdb::string_view (linkage_name_copy, len)); + struct demangled_name_entry entry (gdb::string_view (linkage_name, len)); slot = ((struct demangled_name_entry **) htab_find_slot (per_bfd->demangled_names_hash.get (), &entry, INSERT)); @@ -882,6 +867,21 @@ This happens to, e.g., main.init (__go_init_main). Cope. */ || (gsymbol->language == language_go && (*slot)->demangled == nullptr)) { + /* A 0-terminated copy of the linkage name. */ + const char *linkage_name_copy; + if (linkage_name[len] != '\0') + { + char *alloc_name; + + alloc_name = (char *) alloca (len + 1); + memcpy (alloc_name, linkage_name, len); + alloc_name[len] = '\0'; + + linkage_name_copy = alloc_name; + } + else + linkage_name_copy = linkage_name; + gdb::unique_xmalloc_ptr demangled_name_ptr (symbol_find_demangled_name (gsymbol, linkage_name_copy)); @@ -912,7 +912,8 @@ obstack_alloc (&per_bfd->storage_obstack, sizeof (demangled_name_entry) + len + 1)); char *mangled_ptr = reinterpret_cast (*slot + 1); - strcpy (mangled_ptr, linkage_name_copy); + memcpy (mangled_ptr, linkage_name, len); + mangled_ptr [len] = '\0'; new (*slot) demangled_name_entry (gdb::string_view (mangled_ptr, len)); }