diff options
author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-10-10 15:33:57 +0000 |
---|---|---|
committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-10-10 15:33:57 +0000 |
commit | 60f5701c7d058e2ad67ae9d0ab508c28dedc2308 (patch) | |
tree | d2daeaf622dee7a1143f7b1ac906eb9065fdf9d9 /libstdc++-v3/include | |
parent | c0688d2b8428a13236e118327abaef82ffd0cded (diff) | |
download | gcc-60f5701c7d058e2ad67ae9d0ab508c28dedc2308.tar.gz |
PR libstdc++/49561
* acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_CXX11_ABI): Define.
* configure.ac: Use GLIBCXX_ENABLE_LIBSTDCXX_CXX11_ABI.
* configure: Regenerate.
* include/Makefile.am (stamp-cxx11-abi): New target.
(c++config.h): Set _GLIBCXX_USE_CXX11_ABI macro.
* include/Makefile.in: Regenerate.
* include/bits/c++config: Add _GLIBCXX_USE_CXX11_ABI placeholder and
define _GLIBCXX_DEFAULT_ABI_TAG.
* include/bits/list.tcc (list::emplace(const_iterator, _Args&...)):
Increment size.
(list::emplace(const_iterator, const value_type&)): Likewise.
(list::merge(list&), list::merge(list&, _StrictWeakOrdering)): Adjust
list sizes.
* include/bits/stl_list.h (_List_base, list): Add ABI tag macro.
(_List_base::_M_size): New data member in cxx11 ABI mode.
(_List_base::_S_distance(_List_node_base*, _List_node_base*)): New
function.
(_List_base::_M_get_size(), _List_base::_M_set_size(size_t),
_List_base::_M_inc_size(size_t), _List_base::_M_dec_size(size_t),
_List_base::_M_distance, _List_base::_M_node_count): New functions for
accessing list size correctly for the ABI mode.
(_List_base::_List_base(_List_base&&)): Copy size and reset source.
(_List_base::_M_init()): Initialize size member.
(list::size()): Use _List_base::_M_node_count.
(list::swap(list&)): Swap sizes.
(list::splice(iterator, list&)): Update sizes.
(list::splice(iterator, list&, iterator)): Likewise.
(list::insert(iterator, const value_type&)): Update size.
(list::insert(iterator, _Args&&...)): Likewise.
(list::_M_erase(iterator)): Likewise.
* testsuite/23_containers/list/requirements/dr438/assign_neg.cc:
Adjust.
* testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc:
Adjust.
* testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc:
Adjust.
* testsuite/23_containers/list/requirements/dr438/insert_neg.cc:
Adjust.
* testsuite/ext/profile/mutex_extensions_neg.cc: Adjust.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@216094 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/Makefile.am | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/Makefile.in | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/c++config | 11 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/list.tcc | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_list.h | 74 |
5 files changed, 110 insertions, 6 deletions
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index dee4a3fc6f8..e3aed848615 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -1122,6 +1122,14 @@ stamp-visibility: echo 0 > stamp-visibility endif +if ENABLE_CXX11_ABI +stamp-cxx11-abi: + echo 1 > stamp-cxx11-abi +else +stamp-cxx11-abi: + echo 0 > stamp-cxx11-abi +endif + # NB: The non-empty default ldbl_compat works around an AIX sed # oddity, see libstdc++/31957 for details. ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ @@ -1130,11 +1138,13 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ ${toplevel_srcdir}/gcc/DATESTAMP \ stamp-namespace-version \ stamp-visibility \ - stamp-extern-template + stamp-extern-template \ + stamp-cxx11-abi @date=`cat ${toplevel_srcdir}/gcc/DATESTAMP` ;\ ns_version=`cat stamp-namespace-version` ;\ visibility=`cat stamp-visibility` ;\ externtemplate=`cat stamp-extern-template` ;\ + cxx11abi=`cat stamp-cxx11-abi` ;\ ldbl_compat='s,g,g,' ;\ grep "^[ ]*#[ ]*define[ ][ ]*_GLIBCXX_LONG_DOUBLE_COMPAT[ ][ ]*1[ ]*$$" \ ${CONFIG_HEADER} > /dev/null 2>&1 \ @@ -1143,6 +1153,7 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ -e "s,define _GLIBCXX_INLINE_VERSION, define _GLIBCXX_INLINE_VERSION $$ns_version," \ -e "s,define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY, define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY $$visibility," \ -e "s,define _GLIBCXX_EXTERN_TEMPLATE$$, define _GLIBCXX_EXTERN_TEMPLATE $$externtemplate," \ + -e "s,define _GLIBCXX_USE_CXX11_ABI, define _GLIBCXX_USE_CXX11_ABI $$cxx11abi," \ -e "$$ldbl_compat" \ < ${glibcxx_srcdir}/include/bits/c++config > $@ ;\ sed -e 's/HAVE_/_GLIBCXX_HAVE_/g' \ diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in index 83dcefbd2df..b49c501a6f3 100644 --- a/libstdc++-v3/include/Makefile.in +++ b/libstdc++-v3/include/Makefile.in @@ -1532,6 +1532,11 @@ stamp-host: ${host_headers} ${bits_host_headers} ${ext_host_headers} ${host_head @ENABLE_VISIBILITY_FALSE@stamp-visibility: @ENABLE_VISIBILITY_FALSE@ echo 0 > stamp-visibility +@ENABLE_CXX11_ABI_TRUE@stamp-cxx11-abi: +@ENABLE_CXX11_ABI_TRUE@ echo 1 > stamp-cxx11-abi +@ENABLE_CXX11_ABI_FALSE@stamp-cxx11-abi: +@ENABLE_CXX11_ABI_FALSE@ echo 0 > stamp-cxx11-abi + # NB: The non-empty default ldbl_compat works around an AIX sed # oddity, see libstdc++/31957 for details. ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ @@ -1540,11 +1545,13 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ ${toplevel_srcdir}/gcc/DATESTAMP \ stamp-namespace-version \ stamp-visibility \ - stamp-extern-template + stamp-extern-template \ + stamp-cxx11-abi @date=`cat ${toplevel_srcdir}/gcc/DATESTAMP` ;\ ns_version=`cat stamp-namespace-version` ;\ visibility=`cat stamp-visibility` ;\ externtemplate=`cat stamp-extern-template` ;\ + cxx11abi=`cat stamp-cxx11-abi` ;\ ldbl_compat='s,g,g,' ;\ grep "^[ ]*#[ ]*define[ ][ ]*_GLIBCXX_LONG_DOUBLE_COMPAT[ ][ ]*1[ ]*$$" \ ${CONFIG_HEADER} > /dev/null 2>&1 \ @@ -1553,6 +1560,7 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ -e "s,define _GLIBCXX_INLINE_VERSION, define _GLIBCXX_INLINE_VERSION $$ns_version," \ -e "s,define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY, define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY $$visibility," \ -e "s,define _GLIBCXX_EXTERN_TEMPLATE$$, define _GLIBCXX_EXTERN_TEMPLATE $$externtemplate," \ + -e "s,define _GLIBCXX_USE_CXX11_ABI, define _GLIBCXX_USE_CXX11_ABI $$cxx11abi," \ -e "$$ldbl_compat" \ < ${glibcxx_srcdir}/include/bits/c++config > $@ ;\ sed -e 's/HAVE_/_GLIBCXX_HAVE_/g' \ diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index ff6afc8558b..bb58a9b9748 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -193,6 +193,17 @@ namespace std #endif } +// Use abi_tag("cxx11") +#ifndef _GLIBCXX_USE_CXX11_ABI +#define _GLIBCXX_USE_CXX11_ABI +#endif + +#if _GLIBCXX_USE_CXX11_ABI +# define _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_ABI_TAG_CXX11 +#else +# define _GLIBCXX_DEFAULT_ABI_TAG +#endif + // Defined if inline namespaces are used for versioning. #define _GLIBCXX_INLINE_VERSION diff --git a/libstdc++-v3/include/bits/list.tcc b/libstdc++-v3/include/bits/list.tcc index 42855a4e31e..f99ec54ca40 100644 --- a/libstdc++-v3/include/bits/list.tcc +++ b/libstdc++-v3/include/bits/list.tcc @@ -89,6 +89,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { _Node* __tmp = _M_create_node(std::forward<_Args>(__args)...); __tmp->_M_hook(__position._M_const_cast()._M_node); + this->_M_inc_size(1); return iterator(__tmp); } #endif @@ -104,6 +105,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { _Node* __tmp = _M_create_node(__x); __tmp->_M_hook(__position._M_const_cast()._M_node); + this->_M_inc_size(1); return iterator(__tmp); } @@ -353,6 +355,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ++__first1; if (__first2 != __last2) _M_transfer(__last1, __first2, __last2); + + this->_M_inc_size(__x._M_get_size()); + __x._M_set_size(0); } } @@ -387,6 +392,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ++__first1; if (__first2 != __last2) _M_transfer(__last1, __first2, __last2); + + this->_M_inc_size(__x._M_get_size()); + __x._M_set_size(0); } } diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h index dd9bba73bc1..8e6567cfe67 100644 --- a/libstdc++-v3/include/bits/stl_list.h +++ b/libstdc++-v3/include/bits/stl_list.h @@ -295,7 +295,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER /// See bits/stl_deque.h's _Deque_base for an explanation. template<typename _Tp, typename _Alloc> - class _List_base + class _GLIBCXX_DEFAULT_ABI_TAG _List_base { protected: // NOTA BENE @@ -316,6 +316,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; + static size_t + _S_distance(const __detail::_List_node_base* __first, + const __detail::_List_node_base* __last) + { + size_t __n = 0; + while (__first != __last) + { + __first = __first->_M_next; + ++__n; + } + return __n; + } + struct _List_impl : public _Node_alloc_type { @@ -338,6 +351,40 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _List_impl _M_impl; +#if _GLIBCXX_USE_CXX11_ABI + size_t _M_size; + + size_t _M_get_size() const { return _M_size; } + + void _M_set_size(size_t __n) { _M_size = __n; } + + void _M_inc_size(size_t __n) { _M_size += __n; } + + void _M_dec_size(size_t __n) { _M_size -= __n; } + + size_t + _M_distance(const __detail::_List_node_base* __first, + const __detail::_List_node_base* __last) const + { return _S_distance(__first, __last); } + + // return the stored size + size_t _M_node_count() const { return _M_size; } +#else + // dummy implementations used when the size is not stored + size_t _M_get_size() const { return 0; } + void _M_set_size(size_t) { } + void _M_inc_size(size_t) { } + void _M_dec_size(size_t) { } + size_t _M_distance(const void*, const void*) const { return 0; } + + // count the number of nodes + size_t _M_node_count() const + { + return _S_distance(_M_impl._M_node._M_next, + std::__addressof(_M_impl._M_node)); + } +#endif + _List_node<_Tp>* _M_get_node() { return _M_impl._Node_alloc_type::allocate(1); } @@ -386,7 +433,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER __node->_M_next = __xnode->_M_next; __node->_M_prev = __xnode->_M_prev; __node->_M_next->_M_prev = __node->_M_prev->_M_next = __node; - __xnode->_M_next = __xnode->_M_prev = __xnode; + _M_set_size(__x._M_get_size()); + __x._M_init(); } } #endif @@ -403,6 +451,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { this->_M_impl._M_node._M_next = &this->_M_impl._M_node; this->_M_impl._M_node._M_prev = &this->_M_impl._M_node; + _M_set_size(0); } }; @@ -453,7 +502,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * %empty. */ template<typename _Tp, typename _Alloc = std::allocator<_Tp> > - class list : protected _List_base<_Tp, _Alloc> + class _GLIBCXX_DEFAULT_ABI_TAG list : protected _List_base<_Tp, _Alloc> { // concept requirements typedef typename _Alloc::value_type _Alloc_value_type; @@ -893,7 +942,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER /** Returns the number of elements in the %list. */ size_type size() const _GLIBCXX_NOEXCEPT - { return std::distance(begin(), end()); } + { return this->_M_node_count(); } /** Returns the size() of the largest possible %list. */ size_type @@ -1295,6 +1344,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER __detail::_List_node_base::swap(this->_M_impl._M_node, __x._M_impl._M_node); + size_t __xsize = __x._M_get_size(); + __x._M_set_size(this->_M_get_size()); + this->_M_set_size(__xsize); + // _GLIBCXX_RESOLVE_LIB_DEFECTS // 431. Swapping containers with unequal allocators. std::__alloc_swap<typename _Base::_Node_alloc_type>:: @@ -1339,6 +1392,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER this->_M_transfer(__position._M_const_cast(), __x.begin(), __x.end()); + + this->_M_inc_size(__x._M_get_size()); + __x._M_set_size(0); } } @@ -1385,6 +1441,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER this->_M_transfer(__position._M_const_cast(), __i._M_const_cast(), __j); + + this->_M_inc_size(1); + __x._M_dec_size(1); } #if __cplusplus >= 201103L @@ -1443,6 +1502,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER if (this != &__x) _M_check_equal_allocators(__x); + size_t __n = this->_M_distance(__first._M_node, __last._M_node); + this->_M_inc_size(__n); + __x._M_dec_size(__n); + this->_M_transfer(__position._M_const_cast(), __first._M_const_cast(), __last._M_const_cast()); @@ -1688,6 +1751,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { _Node* __tmp = _M_create_node(__x); __tmp->_M_hook(__position._M_node); + this->_M_inc_size(1); } #else template<typename... _Args> @@ -1696,6 +1760,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { _Node* __tmp = _M_create_node(std::forward<_Args>(__args)...); __tmp->_M_hook(__position._M_node); + this->_M_inc_size(1); } #endif @@ -1703,6 +1768,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER void _M_erase(iterator __position) _GLIBCXX_NOEXCEPT { + this->_M_dec_size(1); __position._M_node->_M_unhook(); _Node* __n = static_cast<_Node*>(__position._M_node); #if __cplusplus >= 201103L |