From patchwork Thu Mar 7 20:57:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 31773 Received: (qmail 53461 invoked by alias); 7 Mar 2019 20:57:15 -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 53443 invoked by uid 89); 7 Mar 2019 20:57:15 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=2172, 2.17.2 X-HELO: gateway31.websitewelcome.com Received: from gateway31.websitewelcome.com (HELO gateway31.websitewelcome.com) (192.185.144.95) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 07 Mar 2019 20:57:13 +0000 Received: from cm17.websitewelcome.com (cm17.websitewelcome.com [100.42.49.20]) by gateway31.websitewelcome.com (Postfix) with ESMTP id EC7AB2F6DA for ; Thu, 7 Mar 2019 14:57:11 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id 204lhwZ3290on204lhFYyt; Thu, 07 Mar 2019 14:57:11 -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=ictRidwt6AnB5h2hNZUGo9erThmPqszNGDQzVM6z7F4=; b=LZjkQjjXK3acyPIwFFcAtgqDqK 50ihpqP0KMPsNAeyO5z8kOXdW1r85O+h4BcSFAX+lRXwPKcHMvHFNyhEH9LBAHG0s4yMpE+Y8Jr/3 /X8WDxstosDACZUN5BlgrC4qC; Received: from 75-166-85-218.hlrn.qwest.net ([75.166.85.218]:53182 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1h204l-002TOW-Nb; Thu, 07 Mar 2019 14:57:11 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 2/9] Introduce and use language_set Date: Thu, 7 Mar 2019 13:57:02 -0700 Message-Id: <20190307205709.21919-3-tom@tromey.com> In-Reply-To: <20190307205709.21919-1-tom@tromey.com> References: <20190307205709.21919-1-tom@tromey.com> I noticed that objfile_per_bfd_storage::demangled_hash_languages is a std::vector, which seemed quite large for something that, fundamentally, can be represented as a bit-set. This patch reimplements it as a bit-set. gdb/ChangeLog 2019-03-07 Tom Tromey * objfiles.h (struct objfile_per_bfd_storage) : Now a language_set. * minsyms.c (add_minsym_to_demangled_hash_table): Update. * language.h (class language_set): New. --- gdb/ChangeLog | 7 +++++ gdb/language.h | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/minsyms.c | 7 ++--- gdb/objfiles.h | 6 ++-- 4 files changed, 95 insertions(+), 9 deletions(-) diff --git a/gdb/language.h b/gdb/language.h index d56ec200208..d57eee96a12 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -747,4 +747,88 @@ private: enum language m_lang; }; +/* A set object specialized for keeping track of languages. */ + +class language_set +{ +public: + + language_set () + { + } + + /* Insert LANG into this set. */ + void insert (enum language lang) + { + m_mask |= 1 << lang; + } + + /* The underlying type used to represent the languages. */ + typedef unsigned mask_type; + + /* An iterator that iterates over languages contained in a language + set. */ + class iterator + { + public: + + iterator (unsigned int n, mask_type mask) + : m_index (n), + m_mask (mask) + { + gdb_assert (m_index <= nr_languages); + update (); + } + + enum language operator* () const + { + return (enum language) m_index; + } + + iterator &operator++ () + { + ++m_index; + update (); + return *this; + } + + bool operator!= (const iterator &other) const + { + return m_index != other.m_index; + } + + private: + + /* A helper function that will advance M_INDEX to the next + language in the set. */ + void update () + { + while (m_index < nr_languages && (m_mask & (1 << m_index)) == 0) + ++m_index; + } + + /* The current index of the iterator. */ + unsigned int m_index; + /* The mask from the underlying set. */ + mask_type m_mask; + }; + + iterator begin () const + { + return iterator (0, m_mask); + } + + iterator end () const + { + return iterator (nr_languages, m_mask); + } + +private: + + /* A bit mask of languages which are included in this set. */ + mask_type m_mask = 0; + + gdb_static_assert (nr_languages <= (sizeof (mask_type) * CHAR_BIT)); +}; + #endif /* defined (LANGUAGE_H) */ diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 0513cfe69f4..6395cc4ccab 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -160,11 +160,8 @@ add_minsym_to_demangled_hash_table (struct minimal_symbol *sym, unsigned int hash = search_name_hash (MSYMBOL_LANGUAGE (sym), MSYMBOL_SEARCH_NAME (sym)); - auto &vec = objfile->per_bfd->demangled_hash_languages; - auto it = std::lower_bound (vec.begin (), vec.end (), - MSYMBOL_LANGUAGE (sym)); - if (it == vec.end () || *it != MSYMBOL_LANGUAGE (sym)) - vec.insert (it, MSYMBOL_LANGUAGE (sym)); + objfile->per_bfd->demangled_hash_languages.insert + (MSYMBOL_LANGUAGE (sym)); struct minimal_symbol **table = objfile->per_bfd->msymbol_demangled_hash; diff --git a/gdb/objfiles.h b/gdb/objfiles.h index c5ce9eec955..843c44e1d24 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -313,10 +313,8 @@ struct objfile_per_bfd_storage minimal_symbol *msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE] {}; /* All the different languages of symbols found in the demangled - hash table. A flat/vector-based map is more efficient than a map - or hash table here, since this will only usually contain zero or - one entries. */ - std::vector demangled_hash_languages; + hash table. */ + language_set demangled_hash_languages; }; /* Master structure for keeping track of each file from which