Add gdb::hash_enum
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<sect_offset, dwarf2_per_cu_data*> 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<sect_offset, std::hash<sect_offset> >’: /usr/include/c++/5.3.1/type_traits:137:12: required from ‘struct std::__and_<std::__is_fast_hash<std::hash<sect_offset> >, std::__detail::__is_noexcept_hash<sect_offset, std::hash<sect_offset> > >’ /usr/include/c++/5.3.1/type_traits:148:38: required from ‘struct std::__not_<std::__and_<std::__is_fast_hash<std::hash<sect_offset> >, std::__detail::__is_noexcept_hash<sect_offset, std::hash<sect_offset> > > >’ /usr/include/c++/5.3.1/bits/unordered_map.h💯66: required from ‘class std::unordered_map<sect_offset, dwarf2_per_cu_data*>’ 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<sect_offset>) (const sect_offset&)’ noexcept(declval<const _Hash&>()(declval<const _Key&>()))> ^ 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 <palves@redhat.com> * common/hash_enum.h: New file.
This commit is contained in:
parent
4b514bc808
commit
e5fa6583a7
@ -1,3 +1,7 @@
|
||||
2017-12-08 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* common/hash_enum.h: New file.
|
||||
|
||||
2017-12-08 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* dwarf2read.c (create_cu_from_index_list): New from ...
|
||||
|
45
gdb/common/hash_enum.h
Normal file
45
gdb/common/hash_enum.h
Normal file
@ -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 <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#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<typename T>
|
||||
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<T>::type;
|
||||
return std::hash<underlying> () (static_cast<underlying> (val));
|
||||
}
|
||||
};
|
||||
|
||||
} /* namespace gdb */
|
||||
|
||||
#endif /* COMMON_HASH_ENUM_H */
|
Loading…
Reference in New Issue
Block a user