From patchwork Sat Dec 9 00:07:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 24841 Received: (qmail 58512 invoked by alias); 9 Dec 2017 00:07:10 -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 58502 invoked by uid 89); 9 Dec 2017 00:07:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 09 Dec 2017 00:07:08 +0000 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 07CE285A05; Sat, 9 Dec 2017 00:07:07 +0000 (UTC) Received: from [127.0.0.1] (ovpn04.gateway.prod.ext.ams2.redhat.com [10.39.146.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id C7F0460BE0; Sat, 9 Dec 2017 00:07:02 +0000 (UTC) Subject: [pushed] Add gdb::hash_enum (Re: [PATCH v3.2 5/5] DWARF-5: .debug_names index consumer) To: Jan Kratochvil , gdb-patches@sourceware.org References: <149790572259.20186.14601775821404892582.stgit@host1.jankratochvil.net> <149790576669.20186.17091294504362630191.stgit@host1.jankratochvil.net> <20170628212114.GA23559@host1.jankratochvil.net> <20170702142957.GA22686@host1.jankratochvil.net> <628074a3-b992-1d96-273e-ecdf1e90bd8c@redhat.com> Cc: Victor Leschuk From: Pedro Alves Message-ID: Date: Sat, 9 Dec 2017 00:07:01 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <628074a3-b992-1d96-273e-ecdf1e90bd8c@redhat.com> On 12/08/2017 11:58 PM, Pedro Alves wrote: >> + std::unordered_map> + dwarf2_per_cu_data *> debug_info_offset_to_per_cu; > > This doesn't compile with 5.3.1 and earlier (at least): > > In file included from /usr/include/c++/5.3.1/bits/hashtable.h:35:0, > from /usr/include/c++/5.3.1/unordered_set:47, > from src/gdb/dwarf2read.c:79: > /usr/include/c++/5.3.1/bits/hashtable_policy.h: In instantiation of ‘struct std::__detail::__is_noexcept_hash >’: > /usr/include/c++/5.3.1/type_traits:137:12: required from ‘struct std::__and_ >, std::__detail::__is_noexcept_hash > >’ > /usr/include/c++/5.3.1/type_traits:148:38: required from ‘struct std::__not_ >, std::__detail::__is_noexcept_hash > > >’ > /usr/include/c++/5.3.1/bits/unordered_map.h:100:66: required from ‘class std::unordered_map’ > src/gdb/dwarf2read.c:3260:30: required from here > /usr/include/c++/5.3.1/bits/hashtable_policy.h:85:34: error: no match for call to ‘(const std::hash) (const sect_offset&)’ > noexcept(declval()(declval()))> > ^ > In file included from /usr/include/c++/5.3.1/bits/move.h:57:0, > from /usr/include/c++/5.3.1/bits/stl_pair.h:59, > from /usr/include/c++/5.3.1/bits/stl_algobase.h:64, > from /usr/include/c++/5.3.1/bits/char_traits.h:39, > from /usr/include/c++/5.3.1/string:40, > from /home/pedro/gdb/mygit/src/gdb/common/common-utils.h:23, > from /home/pedro/gdb/mygit/src/gdb/common/common-defs.h:78, > from /home/pedro/gdb/mygit/src/gdb/defs.h:28, > from /home/pedro/gdb/mygit/src/gdb/dwarf2read.c:31: > > This is due to a C++11 language defect: > http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2148 > > I've fixed this by adding a gdb::hash_enum type (in a separate > preparatory patch). I almost forgot to post this one. Here it is. From e5fa6583a7b1e5e0e0f33a4964a1f271e189cf35 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 8 Dec 2017 22:44:12 +0000 Subject: [PATCH 5/9] Add gdb::hash_enum MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The DWARF-5 .debug_names consumer patch will want to use an std::unordered_map with an enum as key type, like: std::unordered_map That doesn't work in C++11 in non-recent compilers due to a language defect: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2148 ~~~ In file included from /usr/include/c++/5.3.1/bits/hashtable.h:35:0, from /usr/include/c++/5.3.1/unordered_set:47, from src/gdb/dwarf2read.c:79: /usr/include/c++/5.3.1/bits/hashtable_policy.h: In instantiation of ‘struct std::__detail::__is_noexcept_hash >’: /usr/include/c++/5.3.1/type_traits:137:12: required from ‘struct std::__and_ >, std::__detail::__is_noexcept_hash > >’ /usr/include/c++/5.3.1/type_traits:148:38: required from ‘struct std::__not_ >, std::__detail::__is_noexcept_hash > > >’ /usr/include/c++/5.3.1/bits/unordered_map.h:100:66: required from ‘class std::unordered_map’ src/gdb/dwarf2read.c:3260:30: required from here /usr/include/c++/5.3.1/bits/hashtable_policy.h:85:34: error: no match for call to ‘(const std::hash) (const sect_offset&)’ noexcept(declval()(declval()))> ^ In file included from /usr/include/c++/5.3.1/bits/move.h:57:0, from /usr/include/c++/5.3.1/bits/stl_pair.h:59, from /usr/include/c++/5.3.1/bits/stl_algobase.h:64, from /usr/include/c++/5.3.1/bits/char_traits.h:39, from /usr/include/c++/5.3.1/string:40, from /home/pedro/gdb/mygit/src/gdb/common/common-utils.h:23, from /home/pedro/gdb/mygit/src/gdb/common/common-defs.h:78, from /home/pedro/gdb/mygit/src/gdb/defs.h:28, from /home/pedro/gdb/mygit/src/gdb/dwarf2read.c:31: ~~~ This commits adds a helper replacement. gdb/ChangeLog: 2017-12-08 Pedro Alves * common/hash_enum.h: New file. --- gdb/ChangeLog | 4 ++++ gdb/common/hash_enum.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 gdb/common/hash_enum.h diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5d596f0..09cafd0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2017-12-08 Pedro Alves + + * common/hash_enum.h: New file. + 2017-12-08 Jan Kratochvil * dwarf2read.c (create_cu_from_index_list): New from ... diff --git a/gdb/common/hash_enum.h b/gdb/common/hash_enum.h new file mode 100644 index 0000000..0ea3221 --- /dev/null +++ b/gdb/common/hash_enum.h @@ -0,0 +1,45 @@ +/* A hasher for enums. + + Copyright (C) 2017 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef COMMON_HASH_ENUM_H +#define COMMON_HASH_ENUM_H + +/* A hasher for enums, which was missing in C++11: + http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2148 +*/ + +namespace gdb { + +/* Helper struct for hashing enum types. */ +template +struct hash_enum +{ + typedef size_t result_type; + typedef T argument_type; + + size_t operator() (T val) const noexcept + { + using underlying = typename std::underlying_type::type; + return std::hash () (static_cast (val)); + } +}; + +} /* namespace gdb */ + +#endif /* COMMON_HASH_ENUM_H */