From patchwork Sun Nov 25 19:20:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 30299 Received: (qmail 30075 invoked by alias); 25 Nov 2018 19:20:57 -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 29721 invoked by uid 89); 25 Nov 2018 19:20:54 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.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_HELO_PASS autolearn=ham version=3.3.2 spammy=practice, nearly, managed X-HELO: gateway24.websitewelcome.com Received: from gateway24.websitewelcome.com (HELO gateway24.websitewelcome.com) (192.185.50.66) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 25 Nov 2018 19:20:51 +0000 Received: from cm10.websitewelcome.com (cm10.websitewelcome.com [100.42.49.4]) by gateway24.websitewelcome.com (Postfix) with ESMTP id 4FC45A31C for ; Sun, 25 Nov 2018 13:20:50 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id QzxagS0sUBcCXQzxagXuQj; Sun, 25 Nov 2018 13:20:50 -0600 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: 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=qQ1EF8sFnVcdaY66xIFDv7wlA4CT+TnBkhL7FIyjVpM=; b=XyZssXBCijEPrdSeyO/cbLrFxl 180+tvVLUHuiupAtbAMEtSum+q5bAhL3cELQQsrECmOHxQX1J7B5WnzayDvMYmzM0kNOoJmYmyT/L 0DOsBguNsaZlHjvXsSIPSYhGf; Received: from 97-122-190-66.hlrn.qwest.net ([97.122.190.66]:52060 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1gQzxa-001TOx-37; Sun, 25 Nov 2018 13:20:50 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v2 12/12] Move psymtabs to their own obstack Date: Sun, 25 Nov 2018 12:20:43 -0700 Message-Id: <20181125192043.8405-13-tom@tromey.com> In-Reply-To: <20181125192043.8405-1-tom@tromey.com> References: <20181125192043.8405-1-tom@tromey.com> Previously, the psymtab obstack was just a pointer to the objfile obstack. This patch changes psymtabs to use their own obstack, instead. A gdb::optional is used to avoid unnecessary allocation when the obstack is not needed. After this patch, the psymtab code lifetime model is that, in the core psymtab code, objects allocated on the psymtab obstack may point to other such objects, or to objects on the per-BFD obstack -- but never to the objfile obstack. Note however that this invariant is only obeyed the core psymtab code. Symbol readers are free to work however they like; and in particular, even after this patch, in practice all symbol readers violate this invariant via the read_symtab_private field. gdb/ChangeLog 2018-11-25 Tom Tromey * objfiles.h (objfile::reset_psymtabs): Update. * objfiles.c (objfile::objfile): Update. * psymtab.h (psymtab_storage::obstack): Update. (psymtab_storage::m_obstack): Use gdb::optional. (class psymtab_storage): Update comment. Remove objfile parameter. * psymtab.c (psymtab_storage::psymtab_storage): Update. --- gdb/ChangeLog | 10 ++++++++++ gdb/objfiles.c | 2 +- gdb/objfiles.h | 2 +- gdb/psymtab.c | 5 ++--- gdb/psymtab.h | 26 +++++++++++++++++++++----- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/gdb/objfiles.c b/gdb/objfiles.c index b1fa36609b..dde4f0d55d 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -369,7 +369,7 @@ build_objfile_section_table (struct objfile *objfile) objfile::objfile (bfd *abfd, const char *name, objfile_flags flags_) : flags (flags_), pspace (current_program_space), - partial_symtabs (new psymtab_storage (this)), + partial_symtabs (new psymtab_storage ()), obfd (abfd) { const char *expanded_name; diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 7b132db395..776f5d9dea 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -296,7 +296,7 @@ struct objfile void reset_psymtabs () { psymbol_map.clear (); - partial_symtabs.reset (new psymtab_storage (this)); + partial_symtabs.reset (new psymtab_storage ()); } diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 50236f2de3..1f757291e7 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -67,9 +67,8 @@ static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile, -psymtab_storage::psymtab_storage (struct objfile *objfile) - : psymbol_cache (psymbol_bcache_init ()), - m_obstack (&objfile->objfile_obstack) +psymtab_storage::psymtab_storage () + : psymbol_cache (psymbol_bcache_init ()) { } diff --git a/gdb/psymtab.h b/gdb/psymtab.h index 061b63dcdf..a01c2450b3 100644 --- a/gdb/psymtab.h +++ b/gdb/psymtab.h @@ -30,13 +30,26 @@ struct partial_symbol; struct psymbol_bcache; /* An instance of this class manages the partial symbol tables and - partial symbols for a given objfile. */ + partial symbols for a given objfile. + + The core psymtab functions -- those in psymtab.c -- arrange for + nearly all psymtab- and psymbol-related allocations to happen + either in the psymtab_storage object (either on its obstack or in + other memory managed by this class), or on the per-BFD object. The + only link from the psymtab storage object back to the objfile (or + objfile_obstack) that is made by the core psymtab code is the + compunit_symtab member in the psymtab. + + However, it is up to each symbol reader to maintain this invariant + in other ways, if it wants to reuse psymtabs across multiple + objfiles. The main issue here is ensuring that read_symtab_private + does not point into objfile_obstack. */ class psymtab_storage { public: - explicit psymtab_storage (struct objfile *objfile); + psymtab_storage (); ~psymtab_storage (); @@ -59,7 +72,9 @@ public: struct obstack *obstack () { - return m_obstack; + if (!m_obstack.has_value ()) + m_obstack.emplace (); + return &*m_obstack; } /* Allocate storage for the "dependencies" field of a psymtab. @@ -107,9 +122,10 @@ private: struct partial_symtab *free_psymtabs = nullptr; - /* The obstack where allocations are made. */ + /* The obstack where allocations are made. This is lazily allocated + so that we don't waste memory when there are no psymtabs. */ - struct obstack *m_obstack; + gdb::optional m_obstack; };