From 544be2beb1fa53dfdd6988418ad3b365c289536d Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 13 May 2019 11:50:21 +0100 Subject: [PATCH] Remove Profile Mode, deprecated since GCC 7.1 The Profile Mode extension is not used by anybody, nor maintained by anybody. The containers do not support the full API specified in recent standards, and so enabling Profile Mode is not source compatible with much modern C++ code. The heuristics that would check the profile information and make useful suggestions never materialized, so it isn't useful. It should be removed. Remove Profile Mode, deprecated since 7.1.0 * doc/Makefile.am: Remove XML file for profile mode docs. * doc/Makefile.in: Regenerate. * doc/xml/authors.xml: Remove authors of profile mode docs. * doc/xml/manual/appendix_contributing.xml: Remove mention of profile mode. * doc/xml/manual/debug.xml: Likewise. * doc/xml/manual/evolution.xml: Document removal of profile mode. * doc/xml/manual/profile_mode.xml: Remove profile mode docs. * doc/xml/manual/spine.xml: Remove profile mode author credit. * doc/xml/manual/test.xml: Remove docs for dg-require-profile-mode directive. * doc/xml/manual/using.xml: Remove docs for profile mode headers and macro. * doc/html/*: Regenerate. * include/Makefile.am: Remove profile mode headers. * include/Makefile.in: Regenerate. * include/bits/c++config (std::__profile): Remove namespace. [_GLIBCXX_PROFILE]: Remove checks for macro. * include/profile/array: Remove. * include/profile/base.h: Remove. * include/profile/bitset: Remove. * include/profile/deque: Remove. * include/profile/forward_list: Remove. * include/profile/impl/profiler.h: Remove. * include/profile/impl/profiler_algos.h: Remove. * include/profile/impl/profiler_container_size.h: Remove. * include/profile/impl/profiler_hash_func.h: Remove. * include/profile/impl/profiler_hashtable_size.h: Remove. * include/profile/impl/profiler_list_to_slist.h: Remove. * include/profile/impl/profiler_list_to_vector.h: Remove. * include/profile/impl/profiler_map_to_unordered_map.h: Remove. * include/profile/impl/profiler_node.h: Remove. * include/profile/impl/profiler_state.h: Remove. * include/profile/impl/profiler_trace.h: Remove. * include/profile/impl/profiler_vector_size.h: Remove. * include/profile/impl/profiler_vector_to_list.h: Remove. * include/profile/iterator_tracker.h: Remove. * include/profile/list: Remove. * include/profile/map: Remove. * include/profile/map.h: Remove. * include/profile/multimap.h: Remove. * include/profile/multiset.h: Remove. * include/profile/ordered_base.h: Remove. * include/profile/set: Remove. * include/profile/set.h: Remove. * include/profile/unordered_base.h: Remove. * include/profile/unordered_map: Remove. * include/profile/unordered_set: Remove. * include/profile/vector: Remove. * scripts/run_doxygen: Do not process profile mode headers. * testsuite/23_containers/array/element_access/60497.cc: Don't use profile mode type. * testsuite/23_containers/array/specialized_algorithms/swap_cxx17.cc: Remove dg-skip-if for profile mode. * testsuite/23_containers/forward_list/capacity/1.cc: Remove preprocessor check for profile mode. * testsuite/23_containers/list/capacity/29134.cc: Likewise. * testsuite/23_containers/map/modifiers/extract.cc: Remove dg-skip-if for profile mode. * testsuite/23_containers/map/modifiers/insert_or_assign/1.cc: Likewise. * testsuite/23_containers/map/modifiers/try_emplace/1.cc: Likewise. * testsuite/23_containers/multimap/modifiers/extract.cc: Likewise. * testsuite/23_containers/multiset/modifiers/extract.cc: Likewise. * testsuite/23_containers/set/modifiers/extract.cc: Likewise. * testsuite/23_containers/unordered_map/modifiers/extract.cc: Likewise. * testsuite/23_containers/unordered_multimap/modifiers/extract.cc: Likewise. * testsuite/23_containers/unordered_multiset/modifiers/extract.cc: Likewise. * testsuite/23_containers/unordered_set/modifiers/extract.cc: Likewise. * testsuite/23_containers/vector/bool/capacity/29134.cc: Remove preprocessor check for profile mode. * testsuite/23_containers/vector/bool/modifiers/insert/31370.cc: Likewise. * testsuite/23_containers/vector/modifiers/insert_vs_emplace.cc: Remove dg-skip-if for profile mode. * testsuite/25_algorithms/binary_search/partitioned.cc: Likewise. * testsuite/25_algorithms/equal_range/partitioned.cc: Likewise. * testsuite/25_algorithms/lexicographical_compare/71545.cc: Likewise. * testsuite/25_algorithms/lower_bound/partitioned.cc: Likewise. * testsuite/25_algorithms/upper_bound/partitioned.cc: Likewise. * testsuite/Makefile.am: Remove profile_flags variable and * testsuite/Makefile.am: Remove profile_flags variable and check-profile target. * testsuite/Makefile.in: Regenerate. * testsuite/ext/profile/all.cc: Remove. * testsuite/ext/profile/mutex_extensions_neg.cc: Remove. * testsuite/ext/profile/profiler_algos.cc: Remove. * testsuite/ext/profile/replace_new.cc: Remove. * testsuite/ext/throw_allocator/deallocate_global.cc: Remove preprocessor check for profile mode. * testsuite/ext/throw_allocator/deallocate_local.cc: Likewise. * testsuite/lib/libstdc++.exp (check_v3_target_profile_mode): Remove. (check_v3_target_normal_mode): Do not check for profile mode macro. * testsuite/libstdc++-prettyprinters/80276.cc: Remove dg-skip-if for profile mode. * testsuite/libstdc++-prettyprinters/compat.cc: Likewise. * testsuite/libstdc++-prettyprinters/cxx11.cc: Likewise. * testsuite/libstdc++-prettyprinters/cxx17.cc: Likewise. * testsuite/libstdc++-prettyprinters/debug.cc: Likewise. * testsuite/libstdc++-prettyprinters/debug_cxx11.cc: Likewise. * testsuite/libstdc++-prettyprinters/libfundts.cc: Likewise. * testsuite/libstdc++-prettyprinters/simple.cc: Likewise. * testsuite/libstdc++-prettyprinters/simple11.cc: Likewise. * testsuite/libstdc++-prettyprinters/whatis.cc: Likewise. * testsuite/libstdc++-prettyprinters/whatis2.cc: Likewise. From-SVN: r271120 --- libstdc++-v3/ChangeLog | 111 ++ libstdc++-v3/doc/Makefile.am | 1 - libstdc++-v3/doc/Makefile.in | 1 - libstdc++-v3/doc/html/index.html | 8 +- libstdc++-v3/doc/html/manual/api.html | 4 +- libstdc++-v3/doc/html/manual/appendix.html | 2 +- .../doc/html/manual/appendix_porting.html | 2 +- .../doc/html/manual/bitmap_allocator.html | 4 +- .../html/manual/bitmap_allocator_impl.html | 6 +- libstdc++-v3/doc/html/manual/bugs.html | 22 +- libstdc++-v3/doc/html/manual/debug.html | 5 +- .../doc/html/manual/ext_algorithms.html | 6 +- .../doc/html/manual/ext_concurrency.html | 6 +- .../doc/html/manual/ext_concurrency_impl.html | 4 +- .../doc/html/manual/ext_concurrency_use.html | 2 +- .../doc/html/manual/ext_containers.html | 4 +- .../doc/html/manual/ext_demangling.html | 6 +- libstdc++-v3/doc/html/manual/ext_io.html | 6 +- .../doc/html/manual/ext_iterators.html | 6 +- .../doc/html/manual/ext_numerics.html | 6 +- libstdc++-v3/doc/html/manual/ext_sgi.html | 4 +- .../doc/html/manual/ext_utilities.html | 6 +- libstdc++-v3/doc/html/manual/extensions.html | 4 +- libstdc++-v3/doc/html/manual/index.html | 26 +- libstdc++-v3/doc/html/manual/intro.html | 2 +- libstdc++-v3/doc/html/manual/io_and_c.html | 2 +- libstdc++-v3/doc/html/manual/memory.html | 17 +- .../doc/html/manual/mt_allocator.html | 6 +- .../doc/html/manual/mt_allocator_design.html | 4 +- .../html/manual/mt_allocator_ex_multi.html | 4 +- .../html/manual/mt_allocator_ex_single.html | 2 +- .../doc/html/manual/mt_allocator_impl.html | 2 +- .../doc/html/manual/parallel_mode_test.html | 4 +- .../policy_based_data_structures_test.html | 2 +- .../html/manual/policy_data_structures.html | 16 +- .../manual/policy_data_structures_ack.html | 4 +- .../manual/policy_data_structures_design.html | 70 +- .../manual/policy_data_structures_using.html | 6 +- .../doc/html/manual/source_organization.html | 4 +- libstdc++-v3/doc/html/manual/status.html | 6 +- libstdc++-v3/doc/html/manual/test.html | 5 +- libstdc++-v3/doc/html/manual/using.html | 2 +- .../doc/html/manual/using_headers.html | 2 +- .../doc/html/manual/using_macros.html | 3 - libstdc++-v3/doc/xml/authors.xml | 6 - .../doc/xml/manual/appendix_contributing.xml | 4 +- libstdc++-v3/doc/xml/manual/debug.xml | 8 - libstdc++-v3/doc/xml/manual/evolution.xml | 8 +- libstdc++-v3/doc/xml/manual/extensions.xml | 6 - libstdc++-v3/doc/xml/manual/profile_mode.xml | 1718 ----------------- libstdc++-v3/doc/xml/manual/spine.xml | 6 - libstdc++-v3/doc/xml/manual/test.xml | 8 +- libstdc++-v3/doc/xml/manual/using.xml | 38 - libstdc++-v3/include/Makefile.am | 57 +- libstdc++-v3/include/Makefile.in | 59 +- libstdc++-v3/include/bits/c++config | 19 +- libstdc++-v3/include/profile/array | 281 --- libstdc++-v3/include/profile/base.h | 58 - libstdc++-v3/include/profile/bitset | 245 --- libstdc++-v3/include/profile/deque | 188 -- libstdc++-v3/include/profile/forward_list | 219 --- libstdc++-v3/include/profile/impl/profiler.h | 370 ---- .../include/profile/impl/profiler_algos.h | 111 -- .../profile/impl/profiler_container_size.h | 186 -- .../include/profile/impl/profiler_hash_func.h | 153 -- .../profile/impl/profiler_hashtable_size.h | 100 - .../profile/impl/profiler_list_to_slist.h | 168 -- .../profile/impl/profiler_list_to_vector.h | 261 --- .../impl/profiler_map_to_unordered_map.h | 275 --- .../include/profile/impl/profiler_node.h | 155 -- .../include/profile/impl/profiler_state.h | 69 - .../include/profile/impl/profiler_trace.h | 663 ------- .../profile/impl/profiler_vector_size.h | 100 - .../profile/impl/profiler_vector_to_list.h | 261 --- .../include/profile/iterator_tracker.h | 286 --- libstdc++-v3/include/profile/list | 650 ------- libstdc++-v3/include/profile/map | 35 - libstdc++-v3/include/profile/map.h | 705 ------- libstdc++-v3/include/profile/multimap.h | 663 ------- libstdc++-v3/include/profile/multiset.h | 647 ------- libstdc++-v3/include/profile/ordered_base.h | 100 - libstdc++-v3/include/profile/set | 35 - libstdc++-v3/include/profile/set.h | 628 ------ libstdc++-v3/include/profile/unordered_base.h | 308 --- libstdc++-v3/include/profile/unordered_map | 586 ------ libstdc++-v3/include/profile/unordered_set | 561 ------ libstdc++-v3/include/profile/vector | 572 ------ libstdc++-v3/scripts/run_doxygen | 8 - .../array/element_access/60497.cc | 4 - .../specialized_algorithms/swap_cxx17.cc | 1 - .../23_containers/forward_list/capacity/1.cc | 2 +- .../23_containers/list/capacity/29134.cc | 6 +- .../23_containers/map/modifiers/extract.cc | 1 - .../map/modifiers/insert_or_assign/1.cc | 1 - .../map/modifiers/try_emplace/1.cc | 1 - .../multimap/modifiers/extract.cc | 1 - .../multiset/modifiers/extract.cc | 1 - .../23_containers/set/modifiers/extract.cc | 1 - .../unordered_map/modifiers/extract.cc | 1 - .../unordered_multimap/modifiers/extract.cc | 1 - .../unordered_multiset/modifiers/extract.cc | 1 - .../unordered_set/modifiers/extract.cc | 1 - .../vector/bool/capacity/29134.cc | 2 - .../vector/bool/modifiers/insert/31370.cc | 2 - .../vector/modifiers/insert_vs_emplace.cc | 1 - .../binary_search/partitioned.cc | 1 - .../25_algorithms/equal_range/partitioned.cc | 1 - .../lexicographical_compare/71545.cc | 1 - .../25_algorithms/lower_bound/partitioned.cc | 1 - .../25_algorithms/upper_bound/partitioned.cc | 1 - libstdc++-v3/testsuite/Makefile.am | 16 +- libstdc++-v3/testsuite/Makefile.in | 16 +- libstdc++-v3/testsuite/ext/profile/all.cc | 52 - .../ext/profile/mutex_extensions_neg.cc | 33 - .../testsuite/ext/profile/profiler_algos.cc | 147 -- .../testsuite/ext/profile/replace_new.cc | 54 - .../ext/throw_allocator/deallocate_global.cc | 2 - .../ext/throw_allocator/deallocate_local.cc | 2 - libstdc++-v3/testsuite/lib/libstdc++.exp | 28 +- .../libstdc++-prettyprinters/80276.cc | 1 - .../libstdc++-prettyprinters/compat.cc | 1 - .../libstdc++-prettyprinters/cxx11.cc | 1 - .../libstdc++-prettyprinters/cxx17.cc | 1 - .../libstdc++-prettyprinters/debug.cc | 1 - .../libstdc++-prettyprinters/debug_cxx11.cc | 1 - .../libstdc++-prettyprinters/libfundts.cc | 1 - .../libstdc++-prettyprinters/simple.cc | 1 - .../libstdc++-prettyprinters/simple11.cc | 1 - .../libstdc++-prettyprinters/whatis.cc | 1 - .../libstdc++-prettyprinters/whatis2.cc | 1 - 130 files changed, 282 insertions(+), 12111 deletions(-) delete mode 100644 libstdc++-v3/doc/xml/manual/profile_mode.xml delete mode 100644 libstdc++-v3/include/profile/array delete mode 100644 libstdc++-v3/include/profile/base.h delete mode 100644 libstdc++-v3/include/profile/bitset delete mode 100644 libstdc++-v3/include/profile/deque delete mode 100644 libstdc++-v3/include/profile/forward_list delete mode 100644 libstdc++-v3/include/profile/impl/profiler.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_algos.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_container_size.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_hash_func.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_hashtable_size.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_list_to_slist.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_list_to_vector.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_map_to_unordered_map.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_node.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_state.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_trace.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_vector_size.h delete mode 100644 libstdc++-v3/include/profile/impl/profiler_vector_to_list.h delete mode 100644 libstdc++-v3/include/profile/iterator_tracker.h delete mode 100644 libstdc++-v3/include/profile/list delete mode 100644 libstdc++-v3/include/profile/map delete mode 100644 libstdc++-v3/include/profile/map.h delete mode 100644 libstdc++-v3/include/profile/multimap.h delete mode 100644 libstdc++-v3/include/profile/multiset.h delete mode 100644 libstdc++-v3/include/profile/ordered_base.h delete mode 100644 libstdc++-v3/include/profile/set delete mode 100644 libstdc++-v3/include/profile/set.h delete mode 100644 libstdc++-v3/include/profile/unordered_base.h delete mode 100644 libstdc++-v3/include/profile/unordered_map delete mode 100644 libstdc++-v3/include/profile/unordered_set delete mode 100644 libstdc++-v3/include/profile/vector delete mode 100644 libstdc++-v3/testsuite/ext/profile/all.cc delete mode 100644 libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc delete mode 100644 libstdc++-v3/testsuite/ext/profile/profiler_algos.cc delete mode 100644 libstdc++-v3/testsuite/ext/profile/replace_new.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2869dafa810..1a9431bbbb5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,116 @@ 2019-05-11 Jonathan Wakely + Remove Profile Mode, deprecated since 7.1.0 + * doc/Makefile.am: Remove XML file for profile mode docs. + * doc/Makefile.in: Regenerate. + * doc/xml/authors.xml: Remove authors of profile mode docs. + * doc/xml/manual/appendix_contributing.xml: Remove mention of profile + mode. + * doc/xml/manual/debug.xml: Likewise. + * doc/xml/manual/evolution.xml: Document removal of profile mode. + * doc/xml/manual/profile_mode.xml: Remove profile mode docs. + * doc/xml/manual/spine.xml: Remove profile mode author credit. + * doc/xml/manual/test.xml: Remove docs for dg-require-profile-mode + directive. + * doc/xml/manual/using.xml: Remove docs for profile mode headers and + macro. + * doc/html/*: Regenerate. + * include/Makefile.am: Remove profile mode headers. + * include/Makefile.in: Regenerate. + * include/bits/c++config (std::__profile): Remove namespace. + [_GLIBCXX_PROFILE]: Remove checks for macro. + * include/profile/array: Remove. + * include/profile/base.h: Remove. + * include/profile/bitset: Remove. + * include/profile/deque: Remove. + * include/profile/forward_list: Remove. + * include/profile/impl/profiler.h: Remove. + * include/profile/impl/profiler_algos.h: Remove. + * include/profile/impl/profiler_container_size.h: Remove. + * include/profile/impl/profiler_hash_func.h: Remove. + * include/profile/impl/profiler_hashtable_size.h: Remove. + * include/profile/impl/profiler_list_to_slist.h: Remove. + * include/profile/impl/profiler_list_to_vector.h: Remove. + * include/profile/impl/profiler_map_to_unordered_map.h: Remove. + * include/profile/impl/profiler_node.h: Remove. + * include/profile/impl/profiler_state.h: Remove. + * include/profile/impl/profiler_trace.h: Remove. + * include/profile/impl/profiler_vector_size.h: Remove. + * include/profile/impl/profiler_vector_to_list.h: Remove. + * include/profile/iterator_tracker.h: Remove. + * include/profile/list: Remove. + * include/profile/map: Remove. + * include/profile/map.h: Remove. + * include/profile/multimap.h: Remove. + * include/profile/multiset.h: Remove. + * include/profile/ordered_base.h: Remove. + * include/profile/set: Remove. + * include/profile/set.h: Remove. + * include/profile/unordered_base.h: Remove. + * include/profile/unordered_map: Remove. + * include/profile/unordered_set: Remove. + * include/profile/vector: Remove. + * scripts/run_doxygen: Do not process profile mode headers. + * testsuite/23_containers/array/element_access/60497.cc: Don't use + profile mode type. + * testsuite/23_containers/array/specialized_algorithms/swap_cxx17.cc: + Remove dg-skip-if for profile mode. + * testsuite/23_containers/forward_list/capacity/1.cc: Remove + preprocessor check for profile mode. + * testsuite/23_containers/list/capacity/29134.cc: Likewise. + * testsuite/23_containers/map/modifiers/extract.cc: Remove dg-skip-if + for profile mode. + * testsuite/23_containers/map/modifiers/insert_or_assign/1.cc: + Likewise. + * testsuite/23_containers/map/modifiers/try_emplace/1.cc: Likewise. + * testsuite/23_containers/multimap/modifiers/extract.cc: Likewise. + * testsuite/23_containers/multiset/modifiers/extract.cc: Likewise. + * testsuite/23_containers/set/modifiers/extract.cc: Likewise. + * testsuite/23_containers/unordered_map/modifiers/extract.cc: + Likewise. + * testsuite/23_containers/unordered_multimap/modifiers/extract.cc: + Likewise. + * testsuite/23_containers/unordered_multiset/modifiers/extract.cc: + Likewise. + * testsuite/23_containers/unordered_set/modifiers/extract.cc: + Likewise. + * testsuite/23_containers/vector/bool/capacity/29134.cc: Remove + preprocessor check for profile mode. + * testsuite/23_containers/vector/bool/modifiers/insert/31370.cc: + Likewise. + * testsuite/23_containers/vector/modifiers/insert_vs_emplace.cc: + Remove dg-skip-if for profile mode. + * testsuite/25_algorithms/binary_search/partitioned.cc: Likewise. + * testsuite/25_algorithms/equal_range/partitioned.cc: Likewise. + * testsuite/25_algorithms/lexicographical_compare/71545.cc: Likewise. + * testsuite/25_algorithms/lower_bound/partitioned.cc: Likewise. + * testsuite/25_algorithms/upper_bound/partitioned.cc: Likewise. + * testsuite/Makefile.am: Remove profile_flags variable and + * testsuite/Makefile.am: Remove profile_flags variable and + check-profile target. + * testsuite/Makefile.in: Regenerate. + * testsuite/ext/profile/all.cc: Remove. + * testsuite/ext/profile/mutex_extensions_neg.cc: Remove. + * testsuite/ext/profile/profiler_algos.cc: Remove. + * testsuite/ext/profile/replace_new.cc: Remove. + * testsuite/ext/throw_allocator/deallocate_global.cc: Remove + preprocessor check for profile mode. + * testsuite/ext/throw_allocator/deallocate_local.cc: Likewise. + * testsuite/lib/libstdc++.exp (check_v3_target_profile_mode): Remove. + (check_v3_target_normal_mode): Do not check for profile mode macro. + * testsuite/libstdc++-prettyprinters/80276.cc: Remove dg-skip-if for + profile mode. + * testsuite/libstdc++-prettyprinters/compat.cc: Likewise. + * testsuite/libstdc++-prettyprinters/cxx11.cc: Likewise. + * testsuite/libstdc++-prettyprinters/cxx17.cc: Likewise. + * testsuite/libstdc++-prettyprinters/debug.cc: Likewise. + * testsuite/libstdc++-prettyprinters/debug_cxx11.cc: Likewise. + * testsuite/libstdc++-prettyprinters/libfundts.cc: Likewise. + * testsuite/libstdc++-prettyprinters/simple.cc: Likewise. + * testsuite/libstdc++-prettyprinters/simple11.cc: Likewise. + * testsuite/libstdc++-prettyprinters/whatis.cc: Likewise. + * testsuite/libstdc++-prettyprinters/whatis2.cc: Likewise. + Remove array_allocator extension, deprecated since 4.9.0 * doc/xml/manual/allocator.xml: Remove documentation for array_allocator. diff --git a/libstdc++-v3/doc/Makefile.am b/libstdc++-v3/doc/Makefile.am index eb8251d10e3..b9aca381b74 100644 --- a/libstdc++-v3/doc/Makefile.am +++ b/libstdc++-v3/doc/Makefile.am @@ -336,7 +336,6 @@ xml_sources_manual = \ ${xml_dir}/manual/policy_data_structures.xml \ ${xml_dir}/manual/policy_data_structures_biblio.xml \ ${xml_dir}/manual/prerequisites.xml \ - ${xml_dir}/manual/profile_mode.xml \ ${xml_dir}/manual/shared_ptr.xml \ ${xml_dir}/manual/spine.xml \ ${xml_dir}/manual/status_cxx1998.xml \ diff --git a/libstdc++-v3/doc/Makefile.in b/libstdc++-v3/doc/Makefile.in index 12be1f7e254..5fee1b2d310 100644 --- a/libstdc++-v3/doc/Makefile.in +++ b/libstdc++-v3/doc/Makefile.in @@ -477,7 +477,6 @@ xml_sources_manual = \ ${xml_dir}/manual/policy_data_structures.xml \ ${xml_dir}/manual/policy_data_structures_biblio.xml \ ${xml_dir}/manual/prerequisites.xml \ - ${xml_dir}/manual/profile_mode.xml \ ${xml_dir}/manual/shared_ptr.xml \ ${xml_dir}/manual/spine.xml \ ${xml_dir}/manual/status_cxx1998.xml \ diff --git a/libstdc++-v3/doc/html/index.html b/libstdc++-v3/doc/html/index.html index 25447dbcefe..2b7f36070f8 100644 --- a/libstdc++-v3/doc/html/index.html +++ b/libstdc++-v3/doc/html/index.html @@ -23,7 +23,7 @@


Table of Contents

The GNU C++ Library Manual
I. Introduction -
1. Status
Implementation Status
C++ 1998/2003
Implementation Status
Implementation Specific Behavior
C++ 2011
Implementation Specific Behavior
C++ 2014
C++ 2017
Implementation Specific Behavior
C++ 202a
Implementation Specific Behavior
C++ TR1
Implementation Specific Behavior
C++ TR 24733
C++ IS 29124
Implementation Specific Behavior
License
The Code: GPL
The Documentation: GPL, FDL
Bugs
Implementation Bugs
Standard Bugs
2. Setup
Prerequisites
Configure
Make
3. Using
Command Options
Headers
Header Files
Mixing Headers
The C Headers and namespace std
Precompiled Headers
Macros
Dual ABI
Troubleshooting
Namespaces
Available Namespaces
namespace std
Using Namespace Composition
Linking
Almost Nothing
Finding Dynamic or Shared Libraries
Experimental Library Extensions
Concurrency
Prerequisites
Thread Safety
Atomics
IO
Structure
Defaults
Future
Alternatives
Containers
Exceptions
Exception Safety
Exception Neutrality
Doing without
Compatibility
With C
With POSIX thread cancellation
Debugging Support
Using g++
Debug Versions of Library Binary Files
Memory Leak Hunting
Non-memory leaks in Pool and MT allocators
Data Race Hunting
Using gdb
Tracking uncaught exceptions
Debug Mode
Compile Time Checking
Profile-based Performance Analysis
II. +
1. Status
Implementation Status
C++ 1998/2003
Implementation Status
Implementation Specific Behavior
C++ 2011
Implementation Specific Behavior
C++ 2014
C++ 2017
Implementation Specific Behavior
C++ 202a
Implementation Specific Behavior
C++ TR1
Implementation Specific Behavior
C++ TR 24733
C++ IS 29124
Implementation Specific Behavior
License
The Code: GPL
The Documentation: GPL, FDL
Bugs
Implementation Bugs
Standard Bugs
2. Setup
Prerequisites
Configure
Make
3. Using
Command Options
Headers
Header Files
Mixing Headers
The C Headers and namespace std
Precompiled Headers
Macros
Dual ABI
Troubleshooting
Namespaces
Available Namespaces
namespace std
Using Namespace Composition
Linking
Almost Nothing
Finding Dynamic or Shared Libraries
Experimental Library Extensions
Concurrency
Prerequisites
Thread Safety
Atomics
IO
Structure
Defaults
Future
Alternatives
Containers
Exceptions
Exception Safety
Exception Neutrality
Doing without
Compatibility
With C
With POSIX thread cancellation
Debugging Support
Using g++
Debug Versions of Library Binary Files
Memory Leak Hunting
Non-memory leaks in Pool and MT allocators
Data Race Hunting
Using gdb
Tracking uncaught exceptions
Debug Mode
Compile Time Checking
II. Standard Contents
4. Support @@ -65,7 +65,7 @@ Extensions
16. Compile Time Checks
17. Debug Mode
Intro
Semantics
Using
Using the Debug Mode
Using a Specific Debug Container
Design
Goals
Methods
The Wrapper Model
Safe Iterators
Safe Sequences (Containers)
Precondition Checking
Release- and debug-mode coexistence
Compile-time coexistence of release- and debug-mode components
Link- and run-time coexistence of release- and - debug-mode components
Alternatives for Coexistence
Other Implementations
18. Parallel Mode
Intro
Semantics
Using
Prerequisite Compiler Flags
Using Parallel Mode
Using Specific Parallel Components
Design
Interface Basics
Configuration and Tuning
Setting up the OpenMP Environment
Compile Time Switches
Run Time Settings and Defaults
Implementation Namespaces
Testing
Bibliography
19. Profile Mode
Intro
Using the Profile Mode
Tuning the Profile Mode
Design
Wrapper Model
Instrumentation
Run Time Behavior
Analysis and Diagnostics
Cost Model
Reports
Testing
Extensions for Custom Containers
Empirical Cost Model
Implementation Issues
Stack Traces
Symbolization of Instruction Addresses
Concurrency
Using the Standard Library in the Instrumentation Implementation
Malloc Hooks
Construction and Destruction of Global Objects
Developer Information
Big Picture
How To Add A Diagnostic
Diagnostics
Diagnostic Template
Containers
Hashtable Too Small
Hashtable Too Large
Inefficient Hash
Vector Too Small
Vector Too Large
Vector to Hashtable
Hashtable to Vector
Vector to List
List to Vector
List to Forward List (Slist)
Ordered to Unordered Associative Container
Algorithms
Sort Algorithm Performance
Data Locality
Need Software Prefetch
Linked Structure Locality
Multithreaded Data Access
Data Dependence Violations at Container Level
False Sharing
Statistics
Bibliography
20. The mt_allocator
Intro
Design Issues
Overview
Implementation
Tunable Parameters
Initialization
Deallocation Notes
Single Thread Example
Multiple Thread Example
21. The bitmap_allocator
Design
Implementation
Free List Store
Super Block
Super Block Data Layout
Maximum Wasted Percentage
allocate
deallocate
Questions
1
2
3
Locality
Overhead and Grow Policy
22. Policy-Based Data Structures
Intro
Performance Issues
Associative
Priority Que
Goals
Associative
Policy Choices
Underlying Data Structures
Iterators
Functional
Priority Queues
Policy Choices
Underlying Data Structures
Binary Heaps
Using
Prerequisites
Organization
Tutorial
Basic Use
+ debug-mode components
Alternatives for Coexistence
Other Implementations
18. Parallel Mode
Intro
Semantics
Using
Prerequisite Compiler Flags
Using Parallel Mode
Using Specific Parallel Components
Design
Interface Basics
Configuration and Tuning
Setting up the OpenMP Environment
Compile Time Switches
Run Time Settings and Defaults
Implementation Namespaces
Testing
Bibliography
19. The mt_allocator
Intro
Design Issues
Overview
Implementation
Tunable Parameters
Initialization
Deallocation Notes
Single Thread Example
Multiple Thread Example
20. The bitmap_allocator
Design
Implementation
Free List Store
Super Block
Super Block Data Layout
Maximum Wasted Percentage
allocate
deallocate
Questions
1
2
3
Locality
Overhead and Grow Policy
21. Policy-Based Data Structures
Intro
Performance Issues
Associative
Priority Que
Goals
Associative
Policy Choices
Underlying Data Structures
Iterators
Functional
Priority Queues
Policy Choices
Underlying Data Structures
Binary Heaps
Using
Prerequisites
Organization
Tutorial
Basic Use
Configuring via Template Parameters
Querying Container Attributes @@ -127,7 +127,7 @@ Text modify Up
Text modify Down -
Observations
Associative
Priority_Queue
Acknowledgments
Bibliography
23. HP/SGI Extensions
Backwards Compatibility
Deprecated
24. Utilities
25. Algorithms
26. Numerics
27. Iterators
28. Input and Output
Derived filebufs
29. Demangling
30. Concurrency
Design
Interface to Locks and Mutexes
Interface to Atomic Functions
Implementation
Using Built-in Atomic Functions
Thread Abstraction
Use
IV. +
Observations
Associative
Priority_Queue
Acknowledgments
Bibliography
22. HP/SGI Extensions
Backwards Compatibility
Deprecated
23. Utilities
24. Algorithms
25. Numerics
26. Iterators
27. Input and Output
Derived filebufs
28. Demangling
29. Concurrency
Design
Interface to Locks and Mutexes
Interface to Atomic Functions
Implementation
Using Built-in Atomic Functions
Thread Abstraction
Use
IV. Appendices
A. Contributing @@ -142,7 +142,7 @@ Existing tests
C++11 Requirements Test Sequence Descriptions -
ABI Policy and Guidelines
The C++ Interface
Versioning
Goals
History
Prerequisites
Configuring
Checking Active
Allowed Changes
Prohibited Changes
Implementation
Testing
Single ABI Testing
Multiple ABI Testing
Outstanding Issues
API Evolution and Deprecation History
3.0
3.1
3.2
3.3
3.4
4.0
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
5
5.3
6
7
7.2
7.3
8
9
Backwards Compatibility
First
No ios_base
No cout in <ostream.h>, no cin in <istream.h>
Second
Namespace std:: not supported
Illegal iterator usage
isspace from <cctype> is a macro +
ABI Policy and Guidelines
The C++ Interface
Versioning
Goals
History
Prerequisites
Configuring
Checking Active
Allowed Changes
Prohibited Changes
Implementation
Testing
Single ABI Testing
Multiple ABI Testing
Outstanding Issues
API Evolution and Deprecation History
3.0
3.1
3.2
3.3
3.4
4.0
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
5
5.3
6
7
7.2
7.3
8
9
10
Backwards Compatibility
First
No ios_base
No cout in <ostream.h>, no cin in <istream.h>
Second
Namespace std:: not supported
Illegal iterator usage
isspace from <cctype> is a macro
No vector::at, deque::at, string::at
No std::char_traits<char>::eof
No string::clear
Removal of ostream::form and istream::scan extensions diff --git a/libstdc++-v3/doc/html/manual/api.html b/libstdc++-v3/doc/html/manual/api.html index f9cbad526a8..bb131d3010c 100644 --- a/libstdc++-v3/doc/html/manual/api.html +++ b/libstdc++-v3/doc/html/manual/api.html @@ -34,7 +34,7 @@ Removal of <ext/tree>, moved to new anyway, but for the optional pooling allocators the functionality is enabled by setting GLIBCXX_FORCE_NEW in the environment, see - the mt allocator chapter + the mt allocator chapter for details.

Error handling in iostreams cleaned up, made consistent.

3.3

3.4

@@ -391,4 +391,6 @@ now defaults to zero. <experimental/socket>, and <experimental/timer>. +

10

Deprecated features removed: +

  • Profile Mode
  • __gnu_cxx::array_allocator

\ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/appendix.html b/libstdc++-v3/doc/html/manual/appendix.html index 2c7889f42b8..4e67b78fedb 100644 --- a/libstdc++-v3/doc/html/manual/appendix.html +++ b/libstdc++-v3/doc/html/manual/appendix.html @@ -16,7 +16,7 @@ Existing tests
C++11 Requirements Test Sequence Descriptions -
ABI Policy and Guidelines
The C++ Interface
Versioning
Goals
History
Prerequisites
Configuring
Checking Active
Allowed Changes
Prohibited Changes
Implementation
Testing
Single ABI Testing
Multiple ABI Testing
Outstanding Issues
API Evolution and Deprecation History
3.0
3.1
3.2
3.3
3.4
4.0
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
5
5.3
6
7
7.2
7.3
8
9
Backwards Compatibility
First
No ios_base
No cout in <ostream.h>, no cin in <istream.h>
Second
Namespace std:: not supported
Illegal iterator usage
isspace from <cctype> is a macro +
ABI Policy and Guidelines
The C++ Interface
Versioning
Goals
History
Prerequisites
Configuring
Checking Active
Allowed Changes
Prohibited Changes
Implementation
Testing
Single ABI Testing
Multiple ABI Testing
Outstanding Issues
API Evolution and Deprecation History
3.0
3.1
3.2
3.3
3.4
4.0
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
5
5.3
6
7
7.2
7.3
8
9
10
Backwards Compatibility
First
No ios_base
No cout in <ostream.h>, no cin in <istream.h>
Second
Namespace std:: not supported
Illegal iterator usage
isspace from <cctype> is a macro
No vector::at, deque::at, string::at
No std::char_traits<char>::eof
No string::clear
Removal of ostream::form and istream::scan extensions diff --git a/libstdc++-v3/doc/html/manual/appendix_porting.html b/libstdc++-v3/doc/html/manual/appendix_porting.html index 5fbba90f8ec..129eeff3492 100644 --- a/libstdc++-v3/doc/html/manual/appendix_porting.html +++ b/libstdc++-v3/doc/html/manual/appendix_porting.html @@ -14,7 +14,7 @@ Existing tests
C++11 Requirements Test Sequence Descriptions -
ABI Policy and Guidelines
The C++ Interface
Versioning
Goals
History
Prerequisites
Configuring
Checking Active
Allowed Changes
Prohibited Changes
Implementation
Testing
Single ABI Testing
Multiple ABI Testing
Outstanding Issues
API Evolution and Deprecation History
3.0
3.1
3.2
3.3
3.4
4.0
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
5
5.3
6
7
7.2
7.3
8
9
Backwards Compatibility
First
No ios_base
No cout in <ostream.h>, no cin in <istream.h>
Second
Namespace std:: not supported
Illegal iterator usage
isspace from <cctype> is a macro +
ABI Policy and Guidelines
The C++ Interface
Versioning
Goals
History
Prerequisites
Configuring
Checking Active
Allowed Changes
Prohibited Changes
Implementation
Testing
Single ABI Testing
Multiple ABI Testing
Outstanding Issues
API Evolution and Deprecation History
3.0
3.1
3.2
3.3
3.4
4.0
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
5
5.3
6
7
7.2
7.3
8
9
10
Backwards Compatibility
First
No ios_base
No cout in <ostream.h>, no cin in <istream.h>
Second
Namespace std:: not supported
Illegal iterator usage
isspace from <cctype> is a macro
No vector::at, deque::at, string::at
No std::char_traits<char>::eof
No string::clear
Removal of ostream::form and istream::scan extensions diff --git a/libstdc++-v3/doc/html/manual/bitmap_allocator.html b/libstdc++-v3/doc/html/manual/bitmap_allocator.html index 265bba92764..51f52ea9941 100644 --- a/libstdc++-v3/doc/html/manual/bitmap_allocator.html +++ b/libstdc++-v3/doc/html/manual/bitmap_allocator.html @@ -1,8 +1,8 @@ -Chapter 21. The bitmap_allocator

Chapter 20. The bitmap_allocator

Design

As this name suggests, this allocator uses a bit-map to keep track of the used and unused memory locations for its book-keeping diff --git a/libstdc++-v3/doc/html/manual/bitmap_allocator_impl.html b/libstdc++-v3/doc/html/manual/bitmap_allocator_impl.html index 44b5728e808..0c68eea720f 100644 --- a/libstdc++-v3/doc/html/manual/bitmap_allocator_impl.html +++ b/libstdc++-v3/doc/html/manual/bitmap_allocator_impl.html @@ -1,5 +1,5 @@ -Implementation

Implementation

Free List Store

+Implementation

Implementation

Free List Store

The Free List Store (referred to as FLS for the remaining part of this document) is the Global memory pool that is shared by all instances of the bitmapped allocator instantiated for any type. This maintains a @@ -75,7 +75,7 @@ else return false.

Consider a block of size 64 ints. In memory, it would look like this: (assume a 32-bit system where, size_t is a 32-bit entity). -

Table 21.1. Bitmap Allocator Memory Map

268042949672954294967295Data -> Space for 64 ints

+

Table 20.1. Bitmap Allocator Memory Map

268042949672954294967295Data -> Space for 64 ints

The first Column(268) represents the size of the Block in bytes as seen by the Bitmap Allocator. Internally, a global free list is used to keep track of the free blocks used and given back by the @@ -309,4 +309,4 @@ equivalent.

  • And also this would preserve the cac sizeof(size_t) x 8 which is the number of bits in an integer, which can fit exactly in a CPU register. Hence, the term given is exponential growth of the internal pool. -

  • \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/bugs.html b/libstdc++-v3/doc/html/manual/bugs.html index 208ec296743..f72404baedb 100644 --- a/libstdc++-v3/doc/html/manual/bugs.html +++ b/libstdc++-v3/doc/html/manual/bugs.html @@ -458,6 +458,14 @@ should neither be constrained nor explicit

    Remove explicit from the constructor. +

    2408: + SFINAE-friendly + common_type/iterator_traits + is missing in C++14 + +

    Make iterator_traits empty if any of the + types is not present in the iterator. + Make common_type<> empty.

    2415: Inconsistency between unique_ptr and shared_ptr

    Create empty an shared_ptr from an empty @@ -491,6 +499,12 @@ std::polar should require a non-negative rho

    Add debug mode assertion. +

    2465: + SFINAE-friendly common_type is nearly impossible + to specialize correctly and regresses key functionality + +

    Detect whether decay_t changes either type + and use the decayed types if so.

    2466: allocator_traits::max_size() default behavior is incorrect @@ -501,14 +515,14 @@

    Avoid using dynamic_cast when it would be ill-formed.

    2537: - Requirements on the first template parameter of container adaptors - -

    Add static assertions to enforce the requirement. -

    2566: Constructors for priority_queue taking allocators should call make_heap

    Call make_heap. +

    2566: + Requirements on the first template parameter of container adaptors + +

    Add static assertions to enforce the requirement.

    2583: There is no way to supply an allocator for basic_string(str, pos) diff --git a/libstdc++-v3/doc/html/manual/debug.html b/libstdc++-v3/doc/html/manual/debug.html index bce4242cdde..cdf01bd1995 100644 --- a/libstdc++-v3/doc/html/manual/debug.html +++ b/libstdc++-v3/doc/html/manual/debug.html @@ -129,7 +129,7 @@ GLIBCXX_FORCE_NEW to keep extraneous pool allocation noise from cluttering debug information. For more details, see the - mt allocator + mt allocator documentation and look specifically for GLIBCXX_FORCE_NEW.

    Data Race Hunting

    All synchronization primitives used in the library internals need to be @@ -233,9 +233,6 @@ has compile and run-time checks for many containers.

    Compile Time Checking

    The Compile-Time Checks extension has compile-time checks for many algorithms. -

    Profile-based Performance Analysis

    The Profile-based - Performance Analysis extension has performance checks for many - algorithms.

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/ext_algorithms.html b/libstdc++-v3/doc/html/manual/ext_algorithms.html index 805734fefbe..b7511c49848 100644 --- a/libstdc++-v3/doc/html/manual/ext_algorithms.html +++ b/libstdc++-v3/doc/html/manual/ext_algorithms.html @@ -1,8 +1,8 @@ -Chapter 25. Algorithms

    Chapter 24. Algorithms

    25.1.6 (count, count_if) is extended with two more versions of count and count_if. The standard versions return their results. The additional signatures return void, but take a final parameter by reference to which they assign their results, e.g., @@ -19,4 +19,4 @@

        lexicographical_compare_3way(_InputIter1 first1, _InputIter1 last1,
     				 _InputIter2 first2, _InputIter2 last2)

    which does... what? -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/ext_concurrency.html b/libstdc++-v3/doc/html/manual/ext_concurrency.html index 5d9b33204c2..ed7a3ea9f4d 100644 --- a/libstdc++-v3/doc/html/manual/ext_concurrency.html +++ b/libstdc++-v3/doc/html/manual/ext_concurrency.html @@ -1,8 +1,8 @@ -Chapter 30. Concurrency

    Chapter 29. Concurrency

    Design

    Interface to Locks and Mutexes

    The file <ext/concurrence.h> contains all the higher-level constructs for playing with threads. In contrast to the atomics layer, the concurrence layer consists largely of types. All types are defined within namespace __gnu_cxx. @@ -90,4 +90,4 @@ _GLIBCXX_WRITE_MEM_BARRIER

    Which expand to the appropriate write and read barrier required by the host hardware and operating system. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/ext_concurrency_impl.html b/libstdc++-v3/doc/html/manual/ext_concurrency_impl.html index 509c620087b..23b90f34572 100644 --- a/libstdc++-v3/doc/html/manual/ext_concurrency_impl.html +++ b/libstdc++-v3/doc/html/manual/ext_concurrency_impl.html @@ -1,5 +1,5 @@ -Implementation

    Implementation

    Using Built-in Atomic Functions

    The functions for atomic operations described above are either +Implementation

    Implementation

    Using Built-in Atomic Functions

    The functions for atomic operations described above are either implemented via compiler intrinsics (if the underlying host is capable) or by library fallbacks.

    Compiler intrinsics (builtins) are always preferred. However, as the compiler builtins for atomics are not universally implemented, @@ -49,4 +49,4 @@ use this layer. More detail as to the specific interface can be found in the sou functions, and usage found in the usual <pthread.h> file, including pthread_t, pthread_once_t, pthread_create, etc. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/ext_concurrency_use.html b/libstdc++-v3/doc/html/manual/ext_concurrency_use.html index 85c85b4a7b2..6a0d345a910 100644 --- a/libstdc++-v3/doc/html/manual/ext_concurrency_use.html +++ b/libstdc++-v3/doc/html/manual/ext_concurrency_use.html @@ -1,5 +1,5 @@ -Use

    Use

    Typical usage of the last two constructs is demonstrated as follows: +Use

    Use

    Typical usage of the last two constructs is demonstrated as follows:

     #include <ext/concurrence.h>
     
    diff --git a/libstdc++-v3/doc/html/manual/ext_containers.html b/libstdc++-v3/doc/html/manual/ext_containers.html
    index a75b7939116..cba81484f5b 100644
    --- a/libstdc++-v3/doc/html/manual/ext_containers.html
    +++ b/libstdc++-v3/doc/html/manual/ext_containers.html
    @@ -1,8 +1,8 @@
     
    -Chapter 23. HP/SGI Extensions

    Chapter 22. HP/SGI Extensions

    Backwards Compatibility

    A few extensions and nods to backwards-compatibility have been made with containers. Those dealing with older SGI-style allocators are dealt with elsewhere. The remaining ones all deal with bits: diff --git a/libstdc++-v3/doc/html/manual/ext_demangling.html b/libstdc++-v3/doc/html/manual/ext_demangling.html index cbca6c0ee64..879497f7d08 100644 --- a/libstdc++-v3/doc/html/manual/ext_demangling.html +++ b/libstdc++-v3/doc/html/manual/ext_demangling.html @@ -1,8 +1,8 @@ -Chapter 29. Demangling

    Chapter 28. Demangling

    Transforming C++ ABI identifiers (like RTTI symbols) into the original C++ source identifiers is called demangling. @@ -70,4 +70,4 @@ int main() be writing C++ in order to demangle C++. (That also means we have to use crummy memory management facilities, so don't forget to free() the returned char array.) -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/ext_io.html b/libstdc++-v3/doc/html/manual/ext_io.html index 2959d5d554f..7bf81dfa860 100644 --- a/libstdc++-v3/doc/html/manual/ext_io.html +++ b/libstdc++-v3/doc/html/manual/ext_io.html @@ -1,8 +1,8 @@ -Chapter 28. Input and Output

    Chapter 27. Input and Output

    Table of Contents

    Derived filebufs

    Extensions allowing filebufs to be constructed from "C" types like FILE*s and file descriptors.

    Derived filebufs

    The v2 library included non-standard extensions to construct @@ -43,4 +43,4 @@ __gnu_cxx::stdio_filebuf. This class can be constructed from a C FILE* or a file descriptor, and provides the fd() function. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/ext_iterators.html b/libstdc++-v3/doc/html/manual/ext_iterators.html index b349aab81ad..952f1b5bb62 100644 --- a/libstdc++-v3/doc/html/manual/ext_iterators.html +++ b/libstdc++-v3/doc/html/manual/ext_iterators.html @@ -1,8 +1,8 @@ -Chapter 27. Iterators

    Chapter 26. Iterators

    24.3.2 describes struct iterator, which didn't exist in the original HP STL implementation (the language wasn't rich enough at the time). For backwards compatibility, base classes are provided which declare the same nested typedefs: @@ -10,4 +10,4 @@ two iterators and returns a result. It is extended by another signature which takes two iterators and a reference to a result. The result is modified, and the function returns nothing. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/ext_numerics.html b/libstdc++-v3/doc/html/manual/ext_numerics.html index 57b14ee56eb..9b864e1dcf4 100644 --- a/libstdc++-v3/doc/html/manual/ext_numerics.html +++ b/libstdc++-v3/doc/html/manual/ext_numerics.html @@ -1,8 +1,8 @@ -Chapter 26. Numerics

    Chapter 25. Numerics

    26.4, the generalized numeric operations such as accumulate, are extended with the following functions:

        power (x, n);
    @@ -20,4 +20,4 @@
        value + 1 to *(first + 1) and so on."
     

        void iota(_ForwardIter first, _ForwardIter last, _Tp value);

    The iota function is included in the ISO C++ 2011 standard. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/ext_sgi.html b/libstdc++-v3/doc/html/manual/ext_sgi.html index da0f85f8d81..ae2062954f4 100644 --- a/libstdc++-v3/doc/html/manual/ext_sgi.html +++ b/libstdc++-v3/doc/html/manual/ext_sgi.html @@ -1,5 +1,5 @@ -Deprecated

    Deprecated

    +Deprecated

    Deprecated

    The SGI hashing classes hash_set and hash_set have been deprecated by the unordered_set, unordered_multiset, unordered_map, @@ -55,4 +55,4 @@ associative containers defined in the ISO C++ 2011 standard in the headers <unordered_map> and <unordered_set>. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/ext_utilities.html b/libstdc++-v3/doc/html/manual/ext_utilities.html index 6200b01e30c..9caf65f89eb 100644 --- a/libstdc++-v3/doc/html/manual/ext_utilities.html +++ b/libstdc++-v3/doc/html/manual/ext_utilities.html @@ -1,8 +1,8 @@ -Chapter 24. Utilities

    Chapter 23. Utilities

    The <functional> header contains many additional functors and helper functions, extending section 20.3. They are @@ -38,4 +38,4 @@ get_temporary_buffer(5, (int*)0);

    The specialized algorithms of section 20.4.4 are extended with uninitialized_copy_n. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/extensions.html b/libstdc++-v3/doc/html/manual/extensions.html index 57dd1132c1d..e5836efa85d 100644 --- a/libstdc++-v3/doc/html/manual/extensions.html +++ b/libstdc++-v3/doc/html/manual/extensions.html @@ -6,7 +6,7 @@ Extensions

    Table of Contents

    16. Compile Time Checks
    17. Debug Mode
    Intro
    Semantics
    Using
    Using the Debug Mode
    Using a Specific Debug Container
    Design
    Goals
    Methods
    The Wrapper Model
    Safe Iterators
    Safe Sequences (Containers)
    Precondition Checking
    Release- and debug-mode coexistence
    Compile-time coexistence of release- and debug-mode components
    Link- and run-time coexistence of release- and - debug-mode components
    Alternatives for Coexistence
    Other Implementations
    18. Parallel Mode
    Intro
    Semantics
    Using
    Prerequisite Compiler Flags
    Using Parallel Mode
    Using Specific Parallel Components
    Design
    Interface Basics
    Configuration and Tuning
    Setting up the OpenMP Environment
    Compile Time Switches
    Run Time Settings and Defaults
    Implementation Namespaces
    Testing
    Bibliography
    19. Profile Mode
    Intro
    Using the Profile Mode
    Tuning the Profile Mode
    Design
    Wrapper Model
    Instrumentation
    Run Time Behavior
    Analysis and Diagnostics
    Cost Model
    Reports
    Testing
    Extensions for Custom Containers
    Empirical Cost Model
    Implementation Issues
    Stack Traces
    Symbolization of Instruction Addresses
    Concurrency
    Using the Standard Library in the Instrumentation Implementation
    Malloc Hooks
    Construction and Destruction of Global Objects
    Developer Information
    Big Picture
    How To Add A Diagnostic
    Diagnostics
    Diagnostic Template
    Containers
    Hashtable Too Small
    Hashtable Too Large
    Inefficient Hash
    Vector Too Small
    Vector Too Large
    Vector to Hashtable
    Hashtable to Vector
    Vector to List
    List to Vector
    List to Forward List (Slist)
    Ordered to Unordered Associative Container
    Algorithms
    Sort Algorithm Performance
    Data Locality
    Need Software Prefetch
    Linked Structure Locality
    Multithreaded Data Access
    Data Dependence Violations at Container Level
    False Sharing
    Statistics
    Bibliography
    20. The mt_allocator
    Intro
    Design Issues
    Overview
    Implementation
    Tunable Parameters
    Initialization
    Deallocation Notes
    Single Thread Example
    Multiple Thread Example
    21. The bitmap_allocator
    Design
    Implementation
    Free List Store
    Super Block
    Super Block Data Layout
    Maximum Wasted Percentage
    allocate
    deallocate
    Questions
    1
    2
    3
    Locality
    Overhead and Grow Policy
    22. Policy-Based Data Structures
    Intro
    Performance Issues
    Associative
    Priority Que
    Goals
    Associative
    Policy Choices
    Underlying Data Structures
    Iterators
    Functional
    Priority Queues
    Policy Choices
    Underlying Data Structures
    Binary Heaps
    Using
    Prerequisites
    Organization
    Tutorial
    Basic Use
    + debug-mode components
    Alternatives for Coexistence
    Other Implementations
    18. Parallel Mode
    Intro
    Semantics
    Using
    Prerequisite Compiler Flags
    Using Parallel Mode
    Using Specific Parallel Components
    Design
    Interface Basics
    Configuration and Tuning
    Setting up the OpenMP Environment
    Compile Time Switches
    Run Time Settings and Defaults
    Implementation Namespaces
    Testing
    Bibliography
    19. The mt_allocator
    Intro
    Design Issues
    Overview
    Implementation
    Tunable Parameters
    Initialization
    Deallocation Notes
    Single Thread Example
    Multiple Thread Example
    20. The bitmap_allocator
    Design
    Implementation
    Free List Store
    Super Block
    Super Block Data Layout
    Maximum Wasted Percentage
    allocate
    deallocate
    Questions
    1
    2
    3
    Locality
    Overhead and Grow Policy
    21. Policy-Based Data Structures
    Intro
    Performance Issues
    Associative
    Priority Que
    Goals
    Associative
    Policy Choices
    Underlying Data Structures
    Iterators
    Functional
    Priority Queues
    Policy Choices
    Underlying Data Structures
    Binary Heaps
    Using
    Prerequisites
    Organization
    Tutorial
    Basic Use
    Configuring via Template Parameters
    Querying Container Attributes @@ -68,4 +68,4 @@ Text modify Up
    Text modify Down -
    Observations
    Associative
    Priority_Queue
    Acknowledgments
    Bibliography
    23. HP/SGI Extensions
    Backwards Compatibility
    Deprecated
    24. Utilities
    25. Algorithms
    26. Numerics
    27. Iterators
    28. Input and Output
    Derived filebufs
    29. Demangling
    30. Concurrency
    Design
    Interface to Locks and Mutexes
    Interface to Atomic Functions
    Implementation
    Using Built-in Atomic Functions
    Thread Abstraction
    Use
    \ No newline at end of file +
    Observations
    Associative
    Priority_Queue
    Acknowledgments
    Bibliography
    22. HP/SGI Extensions
    Backwards Compatibility
    Deprecated
    23. Utilities
    24. Algorithms
    25. Numerics
    26. Iterators
    27. Input and Output
    Derived filebufs
    28. Demangling
    29. Concurrency
    Design
    Interface to Locks and Mutexes
    Interface to Atomic Functions
    Implementation
    Using Built-in Atomic Functions
    Thread Abstraction
    Use
    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/index.html b/libstdc++-v3/doc/html/manual/index.html index f493b275632..69b56420978 100644 --- a/libstdc++-v3/doc/html/manual/index.html +++ b/libstdc++-v3/doc/html/manual/index.html @@ -1,10 +1,10 @@ -The GNU C++ Library Manual

    The GNU C++ Library Manual

    Paolo Carlini

    Phil Edwards

    Doug Gregor

    Benjamin Kosnik

    Dhruv Matani

    Jason Merrill

    Mark Mitchell

    Nathan Myers

    Felix Natter

    Stefan Olsson

    Silvius Rus

    Johannes Singler

    Ami Tavory

    Jonathan Wakely

    The GNU C++ Library Manual

    Paolo Carlini

    Phil Edwards

    Doug Gregor

    Benjamin Kosnik

    Dhruv Matani

    Jason Merrill

    Mark Mitchell

    Nathan Myers

    Felix Natter

    Stefan Olsson

    Johannes Singler

    Ami Tavory

    Jonathan Wakely


    Table of Contents

    I. Introduction -
    1. Status
    Implementation Status
    C++ 1998/2003
    Implementation Status
    Implementation Specific Behavior
    C++ 2011
    Implementation Specific Behavior
    C++ 2014
    C++ 2017
    Implementation Specific Behavior
    C++ 202a
    Implementation Specific Behavior
    C++ TR1
    Implementation Specific Behavior
    C++ TR 24733
    C++ IS 29124
    Implementation Specific Behavior
    License
    The Code: GPL
    The Documentation: GPL, FDL
    Bugs
    Implementation Bugs
    Standard Bugs
    2. Setup
    Prerequisites
    Configure
    Make
    3. Using
    Command Options
    Headers
    Header Files
    Mixing Headers
    The C Headers and namespace std
    Precompiled Headers
    Macros
    Dual ABI
    Troubleshooting
    Namespaces
    Available Namespaces
    namespace std
    Using Namespace Composition
    Linking
    Almost Nothing
    Finding Dynamic or Shared Libraries
    Experimental Library Extensions
    Concurrency
    Prerequisites
    Thread Safety
    Atomics
    IO
    Structure
    Defaults
    Future
    Alternatives
    Containers
    Exceptions
    Exception Safety
    Exception Neutrality
    Doing without
    Compatibility
    With C
    With POSIX thread cancellation
    Debugging Support
    Using g++
    Debug Versions of Library Binary Files
    Memory Leak Hunting
    Non-memory leaks in Pool and MT allocators
    Data Race Hunting
    Using gdb
    Tracking uncaught exceptions
    Debug Mode
    Compile Time Checking
    Profile-based Performance Analysis
    II. +
    1. Status
    Implementation Status
    C++ 1998/2003
    Implementation Status
    Implementation Specific Behavior
    C++ 2011
    Implementation Specific Behavior
    C++ 2014
    C++ 2017
    Implementation Specific Behavior
    C++ 202a
    Implementation Specific Behavior
    C++ TR1
    Implementation Specific Behavior
    C++ TR 24733
    C++ IS 29124
    Implementation Specific Behavior
    License
    The Code: GPL
    The Documentation: GPL, FDL
    Bugs
    Implementation Bugs
    Standard Bugs
    2. Setup
    Prerequisites
    Configure
    Make
    3. Using
    Command Options
    Headers
    Header Files
    Mixing Headers
    The C Headers and namespace std
    Precompiled Headers
    Macros
    Dual ABI
    Troubleshooting
    Namespaces
    Available Namespaces
    namespace std
    Using Namespace Composition
    Linking
    Almost Nothing
    Finding Dynamic or Shared Libraries
    Experimental Library Extensions
    Concurrency
    Prerequisites
    Thread Safety
    Atomics
    IO
    Structure
    Defaults
    Future
    Alternatives
    Containers
    Exceptions
    Exception Safety
    Exception Neutrality
    Doing without
    Compatibility
    With C
    With POSIX thread cancellation
    Debugging Support
    Using g++
    Debug Versions of Library Binary Files
    Memory Leak Hunting
    Non-memory leaks in Pool and MT allocators
    Data Race Hunting
    Using gdb
    Tracking uncaught exceptions
    Debug Mode
    Compile Time Checking
    II. Standard Contents
    4. Support @@ -46,7 +46,7 @@ Extensions
    16. Compile Time Checks
    17. Debug Mode
    Intro
    Semantics
    Using
    Using the Debug Mode
    Using a Specific Debug Container
    Design
    Goals
    Methods
    The Wrapper Model
    Safe Iterators
    Safe Sequences (Containers)
    Precondition Checking
    Release- and debug-mode coexistence
    Compile-time coexistence of release- and debug-mode components
    Link- and run-time coexistence of release- and - debug-mode components
    Alternatives for Coexistence
    Other Implementations
    18. Parallel Mode
    Intro
    Semantics
    Using
    Prerequisite Compiler Flags
    Using Parallel Mode
    Using Specific Parallel Components
    Design
    Interface Basics
    Configuration and Tuning
    Setting up the OpenMP Environment
    Compile Time Switches
    Run Time Settings and Defaults
    Implementation Namespaces
    Testing
    Bibliography
    19. Profile Mode
    Intro
    Using the Profile Mode
    Tuning the Profile Mode
    Design
    Wrapper Model
    Instrumentation
    Run Time Behavior
    Analysis and Diagnostics
    Cost Model
    Reports
    Testing
    Extensions for Custom Containers
    Empirical Cost Model
    Implementation Issues
    Stack Traces
    Symbolization of Instruction Addresses
    Concurrency
    Using the Standard Library in the Instrumentation Implementation
    Malloc Hooks
    Construction and Destruction of Global Objects
    Developer Information
    Big Picture
    How To Add A Diagnostic
    Diagnostics
    Diagnostic Template
    Containers
    Hashtable Too Small
    Hashtable Too Large
    Inefficient Hash
    Vector Too Small
    Vector Too Large
    Vector to Hashtable
    Hashtable to Vector
    Vector to List
    List to Vector
    List to Forward List (Slist)
    Ordered to Unordered Associative Container
    Algorithms
    Sort Algorithm Performance
    Data Locality
    Need Software Prefetch
    Linked Structure Locality
    Multithreaded Data Access
    Data Dependence Violations at Container Level
    False Sharing
    Statistics
    Bibliography
    20. The mt_allocator
    Intro
    Design Issues
    Overview
    Implementation
    Tunable Parameters
    Initialization
    Deallocation Notes
    Single Thread Example
    Multiple Thread Example
    21. The bitmap_allocator
    Design
    Implementation
    Free List Store
    Super Block
    Super Block Data Layout
    Maximum Wasted Percentage
    allocate
    deallocate
    Questions
    1
    2
    3
    Locality
    Overhead and Grow Policy
    22. Policy-Based Data Structures
    Intro
    Performance Issues
    Associative
    Priority Que
    Goals
    Associative
    Policy Choices
    Underlying Data Structures
    Iterators
    Functional
    Priority Queues
    Policy Choices
    Underlying Data Structures
    Binary Heaps
    Using
    Prerequisites
    Organization
    Tutorial
    Basic Use
    + debug-mode components
    Alternatives for Coexistence
    Other Implementations
    18. Parallel Mode
    Intro
    Semantics
    Using
    Prerequisite Compiler Flags
    Using Parallel Mode
    Using Specific Parallel Components
    Design
    Interface Basics
    Configuration and Tuning
    Setting up the OpenMP Environment
    Compile Time Switches
    Run Time Settings and Defaults
    Implementation Namespaces
    Testing
    Bibliography
    19. The mt_allocator
    Intro
    Design Issues
    Overview
    Implementation
    Tunable Parameters
    Initialization
    Deallocation Notes
    Single Thread Example
    Multiple Thread Example
    20. The bitmap_allocator
    Design
    Implementation
    Free List Store
    Super Block
    Super Block Data Layout
    Maximum Wasted Percentage
    allocate
    deallocate
    Questions
    1
    2
    3
    Locality
    Overhead and Grow Policy
    21. Policy-Based Data Structures
    Intro
    Performance Issues
    Associative
    Priority Que
    Goals
    Associative
    Policy Choices
    Underlying Data Structures
    Iterators
    Functional
    Priority Queues
    Policy Choices
    Underlying Data Structures
    Binary Heaps
    Using
    Prerequisites
    Organization
    Tutorial
    Basic Use
    Configuring via Template Parameters
    Querying Container Attributes @@ -108,7 +108,7 @@ Text modify Up
    Text modify Down -
    Observations
    Associative
    Priority_Queue
    Acknowledgments
    Bibliography
    23. HP/SGI Extensions
    Backwards Compatibility
    Deprecated
    24. Utilities
    25. Algorithms
    26. Numerics
    27. Iterators
    28. Input and Output
    Derived filebufs
    29. Demangling
    30. Concurrency
    Design
    Interface to Locks and Mutexes
    Interface to Atomic Functions
    Implementation
    Using Built-in Atomic Functions
    Thread Abstraction
    Use
    IV. +
    Observations
    Associative
    Priority_Queue
    Acknowledgments
    Bibliography
    22. HP/SGI Extensions
    Backwards Compatibility
    Deprecated
    23. Utilities
    24. Algorithms
    25. Numerics
    26. Iterators
    27. Input and Output
    Derived filebufs
    28. Demangling
    29. Concurrency
    Design
    Interface to Locks and Mutexes
    Interface to Atomic Functions
    Implementation
    Using Built-in Atomic Functions
    Thread Abstraction
    Use
    IV. Appendices
    A. Contributing @@ -123,7 +123,7 @@ Existing tests
    C++11 Requirements Test Sequence Descriptions -
    ABI Policy and Guidelines
    The C++ Interface
    Versioning
    Goals
    History
    Prerequisites
    Configuring
    Checking Active
    Allowed Changes
    Prohibited Changes
    Implementation
    Testing
    Single ABI Testing
    Multiple ABI Testing
    Outstanding Issues
    API Evolution and Deprecation History
    3.0
    3.1
    3.2
    3.3
    3.4
    4.0
    4.1
    4.2
    4.3
    4.4
    4.5
    4.6
    4.7
    4.8
    4.9
    5
    5.3
    6
    7
    7.2
    7.3
    8
    9
    Backwards Compatibility
    First
    No ios_base
    No cout in <ostream.h>, no cin in <istream.h>
    Second
    Namespace std:: not supported
    Illegal iterator usage
    isspace from <cctype> is a macro +
    ABI Policy and Guidelines
    The C++ Interface
    Versioning
    Goals
    History
    Prerequisites
    Configuring
    Checking Active
    Allowed Changes
    Prohibited Changes
    Implementation
    Testing
    Single ABI Testing
    Multiple ABI Testing
    Outstanding Issues
    API Evolution and Deprecation History
    3.0
    3.1
    3.2
    3.3
    3.4
    4.0
    4.1
    4.2
    4.3
    4.4
    4.5
    4.6
    4.7
    4.8
    4.9
    5
    5.3
    6
    7
    7.2
    7.3
    8
    9
    10
    Backwards Compatibility
    First
    No ios_base
    No cout in <ostream.h>, no cin in <istream.h>
    Second
    Namespace std:: not supported
    Illegal iterator usage
    isspace from <cctype> is a macro
    No vector::at, deque::at, string::at
    No std::char_traits<char>::eof
    No string::clear
    Removal of ostream::form and istream::scan extensions @@ -143,19 +143,19 @@ Support for C++11 dialect.
    D. GNU General Public License version 3 -
    E. GNU Free Documentation License
    \ No newline at end of file +
    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/io_and_c.html b/libstdc++-v3/doc/html/manual/io_and_c.html index 71aafa2f71e..dae1b739e56 100644 --- a/libstdc++-v3/doc/html/manual/io_and_c.html +++ b/libstdc++-v3/doc/html/manual/io_and_c.html @@ -3,7 +3,7 @@ Input and Output  Next

    Interacting with C

    Using FILE* and file descriptors

    - See the extensions for using + See the extensions for using FILE and file descriptors with ofstream and ifstream. diff --git a/libstdc++-v3/doc/html/manual/memory.html b/libstdc++-v3/doc/html/manual/memory.html index 11d13a9dd91..b373c31c84c 100644 --- a/libstdc++-v3/doc/html/manual/memory.html +++ b/libstdc++-v3/doc/html/manual/memory.html @@ -222,19 +222,6 @@ new/delete this is taken care of elsewhere).

  • - array_allocator -

    - Allows allocations of known and fixed sizes using existing - global or external storage allocated via construction of - std::tr1::array objects. By using this - allocator, fixed size containers (including - std::string) can be used without - instances calling ::operator new and - ::operator delete. This capability - allows the use of STL abstractions without runtime - complications or overhead, even in situations such as program - startup. For usage examples, please consult the testsuite. -

  • debug_allocator

    A wrapper around an arbitrary allocator A. It passes on @@ -300,14 +287,14 @@

    A high-performance fixed-size allocator with exponentially-increasing allocations. It has its own - chapter + chapter in the documentation.

  • bitmap_allocator

    A high-performance allocator that uses a bit-map to keep track of the used and unused memory locations. It has its own - chapter + chapter in the documentation.

  • Bibliography

    ISO/IEC 14882:1998 Programming languages - C++ diff --git a/libstdc++-v3/doc/html/manual/mt_allocator.html b/libstdc++-v3/doc/html/manual/mt_allocator.html index 42a0125692e..c7786f02844 100644 --- a/libstdc++-v3/doc/html/manual/mt_allocator.html +++ b/libstdc++-v3/doc/html/manual/mt_allocator.html @@ -1,8 +1,8 @@ -Chapter 20. The mt_allocator

    Chapter 19. The mt_allocator

    Intro

    The mt allocator [hereinafter referred to simply as "the allocator"] is a fixed size (power of two) allocator that was initially @@ -19,4 +19,4 @@

    The aim of this document is to describe - from an application point of view - the "inner workings" of the allocator. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/mt_allocator_design.html b/libstdc++-v3/doc/html/manual/mt_allocator_design.html index b08c0b7641a..7541c3a8f4b 100644 --- a/libstdc++-v3/doc/html/manual/mt_allocator_design.html +++ b/libstdc++-v3/doc/html/manual/mt_allocator_design.html @@ -1,5 +1,5 @@ -Design Issues

    Design Issues

    Overview

    There are three general components to the allocator: a datum +Design Issues

    Design Issues

    Overview

    There are three general components to the allocator: a datum describing the characteristics of the memory pool, a policy class containing this pool that links instantiation types to common or individual pools, and a class inheriting from the policy class that is @@ -35,4 +35,4 @@ tuning, for instance.

    This class has the interface required for standard library allocator classes, namely member functions allocate and deallocate, plus others. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/mt_allocator_ex_multi.html b/libstdc++-v3/doc/html/manual/mt_allocator_ex_multi.html index 1cd1749d911..67a1154164b 100644 --- a/libstdc++-v3/doc/html/manual/mt_allocator_ex_multi.html +++ b/libstdc++-v3/doc/html/manual/mt_allocator_ex_multi.html @@ -1,5 +1,5 @@ -Multiple Thread Example

    Multiple Thread Example

    +Multiple Thread Example

    Multiple Thread Example

    In the ST example we never used the thread_id variable present in each block. Let's start by explaining the purpose of this in a MT application.

    @@ -103,4 +103,4 @@ mutex to be locked) this operation is also made in chunks of blocks a threads freelist mentioned above). The "formula" used can probably be improved to further reduce the risk of blocks being "bounced back and forth" between freelists. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/mt_allocator_ex_single.html b/libstdc++-v3/doc/html/manual/mt_allocator_ex_single.html index 7e30f72b953..6934ec3aca9 100644 --- a/libstdc++-v3/doc/html/manual/mt_allocator_ex_single.html +++ b/libstdc++-v3/doc/html/manual/mt_allocator_ex_single.html @@ -1,5 +1,5 @@ -Single Thread Example

    Single Thread Example

    +Single Thread Example

    Single Thread Example

    Let's start by describing how the data on a freelist is laid out in memory. This is the first two blocks in freelist for thread id 3 in bin 3 (8 bytes):

    diff --git a/libstdc++-v3/doc/html/manual/mt_allocator_impl.html b/libstdc++-v3/doc/html/manual/mt_allocator_impl.html
    index b5539e2da9b..2e5926add00 100644
    --- a/libstdc++-v3/doc/html/manual/mt_allocator_impl.html
    +++ b/libstdc++-v3/doc/html/manual/mt_allocator_impl.html
    @@ -1,5 +1,5 @@
     
    -Implementation

    Implementation

    Tunable Parameters

    Certain allocation parameters can be modified, or tuned. There +Implementation

    Implementation

    Tunable Parameters

    Certain allocation parameters can be modified, or tuned. There exists a nested struct __pool_base::_Tune that contains all these parameters, which include settings for

    • Alignment

    • Maximum bytes before calling ::operator new directly

    • Minimum bytes

    • Size of underlying global allocations

    • Maximum number of supported threads

    • Migration of deallocations to the global free list

    • Shunt for global new and delete

    Adjusting parameters for a given instance of an allocator can only diff --git a/libstdc++-v3/doc/html/manual/parallel_mode_test.html b/libstdc++-v3/doc/html/manual/parallel_mode_test.html index a542c196554..912c6ef2e81 100644 --- a/libstdc++-v3/doc/html/manual/parallel_mode_test.html +++ b/libstdc++-v3/doc/html/manual/parallel_mode_test.html @@ -1,5 +1,5 @@ -Testing

    Testing

    +Testing

    Testing

    Both the normal conformance and regression tests and the supplemental performance tests work.

    @@ -22,4 +22,4 @@ additional software dependencies than the usual bare-boned text file, and can be generated by using the make doc-performance rule in the testsuite's Makefile. -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/policy_based_data_structures_test.html b/libstdc++-v3/doc/html/manual/policy_based_data_structures_test.html index 1be7c2056a2..6e454bd7f52 100644 --- a/libstdc++-v3/doc/html/manual/policy_based_data_structures_test.html +++ b/libstdc++-v3/doc/html/manual/policy_based_data_structures_test.html @@ -1,5 +1,5 @@ -Testing

    Testing

    Regression

    The library contains a single comprehensive regression test. +Testing

    Testing

    Regression

    The library contains a single comprehensive regression test. For a given container type in this library, the test creates an object of the container type and an object of the corresponding standard type (e.g., std::set). It diff --git a/libstdc++-v3/doc/html/manual/policy_data_structures.html b/libstdc++-v3/doc/html/manual/policy_data_structures.html index 6104eff9fd7..5744ffee37a 100644 --- a/libstdc++-v3/doc/html/manual/policy_data_structures.html +++ b/libstdc++-v3/doc/html/manual/policy_data_structures.html @@ -1,8 +1,8 @@ -Chapter 22. Policy-Based Data Structures

    Underlying Data Structures

    +

    Figure 21.1. Node Invariants

    Node Invariants

    Underlying Data Structures

    The standard C++ library contains associative containers based on red-black trees and collision-chaining hash tables. These are very useful, but they are not ideal for all types of @@ -256,7 +256,7 @@

    The figure below shows the different underlying data structures currently supported in this library. -

    Figure 22.2. Underlying Associative Data Structures

    Underlying Associative Data Structures

    +

    Figure 21.2. Underlying Associative Data Structures

    Underlying Associative Data Structures

    A shows a collision-chaining hash-table, B shows a probing hash-table, C shows a red-black tree, D shows a splay tree, E shows a tree based on an ordered vector(implicit in the order of the @@ -375,7 +375,7 @@ no guarantee that the elements traversed will coincide with the logical elements between 1 and 5, as in label B. -

    Figure 22.3. Range Iteration in Different Data Structures

    Node Invariants

    +

    Figure 21.3. Range Iteration in Different Data Structures

    Node Invariants

    In our opinion, this problem is not caused just because red-black trees are order preserving while collision-chaining hash tables are (generally) not - it @@ -426,7 +426,7 @@ list, as in the graphic below, label B. Here the iterators are as light as can be, but the hash-table's operations are more complicated. -

    Figure 22.4. Point Iteration in Hash Data Structures

    Point Iteration in Hash Data Structures

    +

    Figure 21.4. Point Iteration in Hash Data Structures

    Point Iteration in Hash Data Structures

    It should be noted that containers based on collision-chaining hash-tables are not the only ones with this type of behavior; many other self-organizing data structures display it as well. @@ -442,7 +442,7 @@ container. The graphic below shows three cases: A1 and A2 show a red-black tree; B1 and B2 show a probing hash-table; C1 and C2 show a collision-chaining hash table. -

    Figure 22.5. Effect of erase in different underlying data structures

    Effect of erase in different underlying data structures

    1. +

      Figure 21.5. Effect of erase in different underlying data structures

      Effect of erase in different underlying data structures

      1. Erasing 5 from A1 yields A2. Clearly, an iterator to 3 can be de-referenced and incremented. The sequence of iterators changed, but in a way that is well-defined by the interface. @@ -678,7 +678,7 @@ typically less structured than an associative container's tree; the third simply uses an associative container. These are shown in the figure below with labels A1 and A2, B, and C. -

        Figure 22.6. Underlying Priority Queue Data Structures

        Underlying Priority Queue Data Structures

        +

        Figure 21.6. Underlying Priority Queue Data Structures

        Underlying Priority Queue Data Structures

        No single implementation can completely replace any of the others. Some have better push and pop amortized performance, some have diff --git a/libstdc++-v3/doc/html/manual/policy_data_structures_ack.html b/libstdc++-v3/doc/html/manual/policy_data_structures_ack.html index 55fbb4d2c92..e8a8dceaa7a 100644 --- a/libstdc++-v3/doc/html/manual/policy_data_structures_ack.html +++ b/libstdc++-v3/doc/html/manual/policy_data_structures_ack.html @@ -1,5 +1,5 @@ -Acknowledgments

        Acknowledgments

        +Acknowledgments

        Acknowledgments

        Written by Ami Tavory and Vladimir Dreizin (IBM Haifa Research Laboratories), and Benjamin Kosnik (Red Hat).

        @@ -24,4 +24,4 @@ attributing to him any flaws in the design or implementation of the library).

        We would like to thank Matt Austern for the suggestion to - include tries.

        \ No newline at end of file + include tries.

        \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/policy_data_structures_design.html b/libstdc++-v3/doc/html/manual/policy_data_structures_design.html index c6d6a3a4dfc..611b2e76ee9 100644 --- a/libstdc++-v3/doc/html/manual/policy_data_structures_design.html +++ b/libstdc++-v3/doc/html/manual/policy_data_structures_design.html @@ -1,5 +1,5 @@ -Design

        Design

        Concepts

        Null Policy Classes

        +Design

        Design

        Concepts

        Null Policy Classes

        Associative containers are typically parametrized by various policies. For example, a hash-based associative container is parametrized by a hash-functor, transforming each key into an @@ -170,7 +170,7 @@ naturally; collision-chaining hash tables (label B) store equivalent-key values in the same bucket, the bucket can be arranged so that equivalent-key values are consecutive. -

        Figure 22.8. Non-unique Mapping Standard Containers

        Non-unique Mapping Standard Containers

        +

        Figure 21.8. Non-unique Mapping Standard Containers

        Non-unique Mapping Standard Containers

        Put differently, the standards' non-unique mapping associative-containers are associative containers that map primary keys to linked lists that are embedded into the @@ -178,7 +178,7 @@ containers from the first graphic above, this time with the embedded linked lists of the grayed nodes marked explicitly. -

        Figure 22.9.  +

        Figure 21.9.  Effect of embedded lists in std::multimap

        Effect of embedded lists in std::multimap

        @@ -252,7 +252,7 @@ first graphic above. Labels A and B, respectively. Each shaded box represents some size-type or secondary associative-container. -

        Figure 22.10. Non-unique Mapping Containers

        Non-unique Mapping Containers

        +

        Figure 21.10. Non-unique Mapping Containers

        Non-unique Mapping Containers

        In the first example above, then, one would use an associative container mapping each user to an associative container which maps each application id to a start time (see @@ -305,7 +305,7 @@ shows invariants for order-preserving containers: point-type iterators are synonymous with range-type iterators. Orthogonally, Cshows invariants for "set" - containers: iterators are synonymous with const iterators.

        Figure 22.11. Point Iterator Hierarchy

        Point Iterator Hierarchy

        Note that point-type iterators in self-organizing containers + containers: iterators are synonymous with const iterators.

        Figure 21.11. Point Iterator Hierarchy

        Point Iterator Hierarchy

        Note that point-type iterators in self-organizing containers (hash-based associative containers) lack movement operators, such as operator++ - in fact, this is the reason why this library differentiates from the standard C++ librarys @@ -344,7 +344,7 @@ to the question of whether point-type iterators and range-type iterators are valid. The graphic below shows tags corresponding to different types of invalidation guarantees. -

        Figure 22.12. Invalidation Guarantee Tags Hierarchy

        Invalidation Guarantee Tags Hierarchy

        • +

          Figure 21.12. Invalidation Guarantee Tags Hierarchy

          Invalidation Guarantee Tags Hierarchy

          • basic_invalidation_guarantee corresponds to a basic guarantee that a point-type iterator, a found pointer, or a found reference, remains valid as long @@ -428,7 +428,7 @@

            This library contains a container tag hierarchy corresponding to the diagram below. -

            Figure 22.13. Container Tag Hierarchy

            Container Tag Hierarchy

            +

            Figure 21.13. Container Tag Hierarchy

            Container Tag Hierarchy

            Given any container Cntnr, the tag of the underlying data structure can be found via typename Cntnr::container_category. @@ -487,7 +487,7 @@ collision-chaining container, except for the following.

            1. Comb_Probe_Fn describes how to transform a probe sequence into a sequence of positions within the table.

            2. Probe_Fn describes a probe sequence policy.

            Some of the default template values depend on the values of other parameters, and are explained below.

          Details
          Hash Policies
          General

          Following is an explanation of some functions which hashing - involves. The graphic below illustrates the discussion.

          Figure 22.14. Hash functions, ranged-hash functions, and + involves. The graphic below illustrates the discussion.

          Figure 21.14. Hash functions, ranged-hash functions, and range-hashing functions

          Hash functions, ranged-hash functions, and range-hashing functions

          Let U be a domain (e.g., the integers, or the strings of 3 characters). A hash-table algorithm needs to map elements of U "uniformly" into the range [0,..., m - @@ -504,7 +504,7 @@ Z+,

          which maps a non-negative hash value, and a non-negative range upper-bound into a non-negative integral in the range between 0 (inclusive) and the range upper bound (exclusive), - i.e., for any r in Z+,

          0 ≤ g(r, m) ≤ m - 1

          The resulting ranged-hash function, is

          Equation 22.1. Ranged Hash Function

          + i.e., for any r in Z+,

          0 ≤ g(r, m) ≤ m - 1

          The resulting ranged-hash function, is

          Equation 21.1. Ranged Hash Function

          f(u , m) = g(h(u), m)

          From the above, it is obvious that given g and h, f can always be composed (however the converse @@ -524,7 +524,7 @@ transforming the sequence of hash values into a sequence of positions.

          Range Hashing

          Some common choices for range-hashing functions are the division, multiplication, and middle-square methods ([biblio.knuth98sorting]), defined - as

          Equation 22.2. Range-Hashing, Division Method

          + as

          Equation 21.2. Range-Hashing, Division Method

          g(r, m) = r mod m

          g(r, m) = ⌈ u/v ( a r mod v ) ⌉

          and

          g(r, m) = ⌈ u/v ( r2 mod v ) ⌉

          respectively, for some positive integrals u and v (typically powers of 2), and some a. Each of @@ -535,9 +535,9 @@ implement using the low level % (modulo) operation (for any m), or the low level & (bit-mask) operation (for the case where - m is a power of 2), i.e.,

          Equation 22.3. Division via Prime Modulo

          + m is a power of 2), i.e.,

          Equation 21.3. Division via Prime Modulo

          g(r, m) = r % m -

          and

          Equation 22.4. Division via Bit Mask

          +

          and

          Equation 21.4. Division via Bit Mask

          g(r, m) = r & m - 1, (with m = 2k for some k)

          respectively.

          The % (modulo) implementation has the advantage that for @@ -563,7 +563,7 @@ s = [ s0,..., st - 1]

          be a string of t characters, each of which is from domain S. Consider the following ranged-hash - function:

          Equation 22.5.  + function:

          Equation 21.5.  A Standard String Hash Function

          f1(s, m) = ∑ i = @@ -575,7 +575,7 @@ of a long DNA sequence (and so S = {'A', 'C', 'G', 'T'}). In this case, scanning the entire string might be prohibitively expensive. A possible alternative might be to use - only the first k characters of the string, where

          |S|k ≥ m ,

          i.e., using the hash function

          Equation 22.6.  + only the first k characters of the string, where

          |S|k ≥ m ,

          i.e., using the hash function

          Equation 21.6.  Only k String DNA Hash

          f2(s, m) = ∑ i @@ -606,12 +606,12 @@ the container transforms the key into a non-negative integral using the hash functor (points B and C), and transforms the result into a position using the combining functor (points D - and E).

          Figure 22.15. Insert hash sequence diagram

          Insert hash sequence diagram

          If cc_hash_table's + and E).

          Figure 21.15. Insert hash sequence diagram

          Insert hash sequence diagram

          If cc_hash_table's hash-functor, Hash_Fn is instantiated by null_type , then Comb_Hash_Fn is taken to be a ranged-hash function. The graphic below shows an insert sequence diagram. The user inserts an element (point A), the container transforms the key into a position using the combining functor - (points B and C).

          Figure 22.16. Insert hash sequence diagram with a null policy

          Insert hash sequence diagram with a null policy

          + (points B and C).

          Figure 21.16. Insert hash sequence diagram with a null policy

          Insert hash sequence diagram with a null policy

          Probing tables

          gp_hash_table is parametrized by Hash_Fn, Probe_Fn, @@ -634,7 +634,7 @@ a linear probe and a quadratic probe function, respectively.

      The graphic below shows the relationships. -

      Figure 22.17. Hash policy class diagram

      Hash policy class diagram

    Resize Policies
    General

    Hash-tables, as opposed to trees, do not naturally grow or +

    Figure 21.17. Hash policy class diagram

    Hash policy class diagram

    Resize Policies
    General

    Hash-tables, as opposed to trees, do not naturally grow or shrink. It is necessary to specify policies to determine how and when a hash table should change its size. Usually, resize policies can be decomposed into orthogonal policies:

    1. A size policy indicating how a hash table @@ -667,10 +667,10 @@ and some load factor be denoted by Α. We would like to calculate the minimal length of k, such that if there were Α m elements in the hash table, a probe sequence of length k would - be found with probability at most 1/m.

      Figure 22.18. Balls and bins

      Balls and bins

      Denote the probability that a probe sequence of length + be found with probability at most 1/m.

      Figure 21.18. Balls and bins

      Balls and bins

      Denote the probability that a probe sequence of length k appears in bin i by pi, the length of the probe sequence of bin i by - li, and assume uniform distribution. Then

      Equation 22.7.  + li, and assume uniform distribution. Then

      Equation 21.7.  Probability of Probe Sequence of Length k

      p1 = @@ -684,7 +684,7 @@ li are negatively-dependent ([biblio.dubhashi98neg]) . Let - I(.) denote the indicator function. Then

      Equation 22.8.  + I(.) denote the indicator function. Then

      Equation 21.8.  Probability Probe Sequence in Some Bin

      P( existsi li ≥ k ) = @@ -723,7 +723,7 @@ a resize is needed, and if so, what is the new size (points D to G); following the resize, it notifies the policy that a resize has completed (point H); finally, the element is - inserted, and the policy notified (point I).

      Figure 22.19. Insert resize sequence diagram

      Insert resize sequence diagram

      In practice, a resize policy can be usually orthogonally + inserted, and the policy notified (point I).

      Figure 21.19. Insert resize sequence diagram

      Insert resize sequence diagram

      In practice, a resize policy can be usually orthogonally decomposed to a size policy and a trigger policy. Consequently, the library contains a single class for instantiating a resize policy: hash_standard_resize_policy @@ -732,8 +732,8 @@ both, and acts as a standard delegate ([biblio.gof]) to these policies.

      The two graphics immediately below show sequence diagrams illustrating the interaction between the standard resize policy - and its trigger and size policies, respectively.

      Figure 22.20. Standard resize policy trigger sequence - diagram

      Standard resize policy trigger sequence diagram

      Figure 22.21. Standard resize policy size sequence + and its trigger and size policies, respectively.

      Figure 21.20. Standard resize policy trigger sequence + diagram

      Standard resize policy trigger sequence diagram

      Figure 21.21. Standard resize policy size sequence diagram

      Standard resize policy size sequence diagram

      Predefined Policies

      The library includes the following instantiations of size and trigger policies:

      1. hash_load_check_resize_trigger implements a load check trigger policy.

      2. cc_hash_max_collision_check_resize_trigger @@ -876,7 +876,7 @@ each node, and maintains node invariants (see [biblio.clrs2001].) The first stores in each node the size of the sub-tree rooted at the node; the second stores at each node the maximal endpoint of the - intervals at the sub-tree rooted at the node.

        Figure 22.22. Tree node invariants

        Tree node invariants

        Supporting such trees is difficult for a number of + intervals at the sub-tree rooted at the node.

        Figure 21.22. Tree node invariants

        Tree node invariants

        Supporting such trees is difficult for a number of reasons:

        1. There must be a way to specify what a node's metadata should be (if any).

        2. Various operations can invalidate node invariants. The graphic below shows how a right rotation, @@ -890,7 +890,7 @@ metadata.

        3. It is not feasible to know in advance which methods trees can support. Besides the usual find method, the first tree can support a find_by_order method, while - the second can support an overlaps method.

        Figure 22.23. Tree node invalidation

        Tree node invalidation

        These problems are solved by a combination of two means: + the second can support an overlaps method.

      Figure 21.23. Tree node invalidation

      Tree node invalidation

      These problems are solved by a combination of two means: node iterators, and template-template node updater parameters.

      Node Iterators

      Each tree-based container defines two additional iterator types, const_node_iterator @@ -919,7 +919,7 @@ node_update class, and publicly subclasses node_update. The graphic below shows this scheme, as well as some predefined policies (which are explained - below).

      Figure 22.24. A tree and its update policy

      A tree and its update policy

      node_update (an instantiation of + below).

      Figure 21.24. A tree and its update policy

      A tree and its update policy

      node_update (an instantiation of Node_Update) must define metadata_type as the type of metadata it requires. For order statistics, e.g., metadata_type might be size_t. @@ -938,7 +938,7 @@ nd_it. For example, say node x in the graphic below label A has an invalid invariant, but its' children, y and z have valid invariants. After the invocation, all three - nodes should have valid invariants, as in label B.

      Figure 22.25. Restoring node invariants

      Restoring node invariants

      When a tree operation might invalidate some node invariant, + nodes should have valid invariants, as in label B.

      Figure 21.25. Restoring node invariants

      Restoring node invariants

      When a tree operation might invalidate some node invariant, it invokes this method in its node_update base to restore the invariant. For example, the graphic below shows an insert operation (point A); the tree performs some @@ -946,7 +946,7 @@ C, and D). (It is well known that any insert, erase, split or join, can restore all node invariants by a small number of node invariant updates ([biblio.clrs2001]) - .

      Figure 22.26. Insert update sequence

      Insert update sequence

      To complete the description of the scheme, three questions + .

      Figure 21.26. Insert update sequence

      Insert update sequence

      To complete the description of the scheme, three questions need to be answered:

      1. How can a tree which supports order statistics define a method such as find_by_order?

      2. How can the node updater base access methods of the tree?

      3. How can the following cyclic dependency be resolved? @@ -988,7 +988,7 @@ node's metadata (this is halting reducible). In the graphic below, assume the shaded node is inserted. The tree would have to traverse the useless path shown to the root, applying - redundant updates all the way.

      Figure 22.27. Useless update path

      Useless update path

      A null policy class, null_node_update + redundant updates all the way.

    Figure 21.27. Useless update path

    Useless update path

    A null policy class, null_node_update solves both these problems. The tree detects that node invariants are irrelevant, and defines all accordingly.

    Split and Join

    Tree-based containers support split and join methods. It is possible to split a tree so that it passes @@ -1071,7 +1071,7 @@ sub-tree with leafs "a" and "as". The maximal common prefix is "a". The internal node contains, consequently, to const iterators, one pointing to 'a', and the other to - 's'.

    Figure 22.28. A PATRICIA trie

    A PATRICIA trie

    Node Invariants

    Trie-based containers support node invariants, as do + 's'.

    Figure 21.28. A PATRICIA trie

    A PATRICIA trie

    Node Invariants

    Trie-based containers support node invariants, as do tree-based containers. There are two minor differences, though, which, unfortunately, thwart sharing them sharing the same node-updating policies:

    1. A trie's Node_Update template-template @@ -1080,7 +1080,7 @@ parametrized by Cmp_Fn.

    2. Tree-based containers store values in all nodes, while trie-based containers (at least in this implementation) store values in leafs.

    The graphic below shows the scheme, as well as some predefined - policies (which are explained below).

    Figure 22.29. A trie and its update policy

    A trie and its update policy

    This library offers the following pre-defined trie node + policies (which are explained below).

    Figure 21.29. A trie and its update policy

    A trie and its update policy

    This library offers the following pre-defined trie node updating policies:

    1. trie_order_statistics_node_update supports order statistics. @@ -1128,7 +1128,7 @@ simple list of integer keys. If we search for the integer 6, we are paying an overhead: the link with key 6 is only the fifth link; if it were the first link, it could be accessed - faster.

      Figure 22.30. A simple list

      A simple list

      List-update algorithms reorder lists as elements are + faster.

      Figure 21.30. A simple list

      A simple list

      List-update algorithms reorder lists as elements are accessed. They try to determine, by the access history, which keys to move to the front of the list. Some of these algorithms require adding some metadata alongside each entry.

      For example, in the graphic below label A shows the counter @@ -1138,7 +1138,7 @@ predetermined value, say 10, as shown in label C, the count is set to 0 and the node is moved to the front of the list, as in label D. -

      Figure 22.31. The counter algorithm

      The counter algorithm

    Policies

    this library allows instantiating lists with policies +

    Figure 21.31. The counter algorithm

    The counter algorithm

    Policies

    this library allows instantiating lists with policies implementing any algorithm moving nodes to the front of the list (policies implementing algorithms interchanging nodes are unsupported).

    Associative containers based on lists are parametrized by a @@ -1310,7 +1310,7 @@ sequence; the second uses a tree (or forest of trees), which is typically less structured than an associative container's tree; the third simply uses an associative container. These are - shown in the graphic below, in labels A1 and A2, label B, and label C.

    Figure 22.32. Underlying Priority-Queue Data-Structures.

    Underlying Priority-Queue Data-Structures.

    Roughly speaking, any value that is both pushed and popped + shown in the graphic below, in labels A1 and A2, label B, and label C.

    Figure 21.32. Underlying Priority-Queue Data-Structures.

    Underlying Priority-Queue Data-Structures.

    Roughly speaking, any value that is both pushed and popped from a priority queue must incur a logarithmic expense (in the amortized sense). Any priority queue implementation that would avoid this, would violate known bounds on comparison-based @@ -1390,7 +1390,7 @@ container Cntnr, the tag of the underlying data structure can be found via typename Cntnr::container_category; this is one of the possible tags shown in the graphic below. -

    Figure 22.33. Priority-Queue Data-Structure Tags.

    Priority-Queue Data-Structure Tags.

    Additionally, a traits mechanism can be used to query a +

    Figure 21.33. Priority-Queue Data-Structure Tags.

    Priority-Queue Data-Structure Tags.

    Additionally, a traits mechanism can be used to query a container type for its attributes. Given any container Cntnr, then

    __gnu_pbds::container_traits<Cntnr>

    is a traits class identifying the properties of the diff --git a/libstdc++-v3/doc/html/manual/policy_data_structures_using.html b/libstdc++-v3/doc/html/manual/policy_data_structures_using.html index a45c64544b0..10c13bedeac 100644 --- a/libstdc++-v3/doc/html/manual/policy_data_structures_using.html +++ b/libstdc++-v3/doc/html/manual/policy_data_structures_using.html @@ -1,5 +1,5 @@ -Using

    Using

    Prerequisites

    The library contains only header files, and does not require any +Using

    Using

    Prerequisites

    The library contains only header files, and does not require any other libraries except the standard C++ library . All classes are defined in namespace __gnu_pbds. The library internally uses macros beginning with PB_DS, but @@ -61,7 +61,7 @@ In addition, there are the following diagnostics classes, used to report errors specific to this library's data structures. -

    Figure 22.7. Exception Hierarchy

    Exception Hierarchy

    Tutorial

    Basic Use

    +

    Figure 21.7. Exception Hierarchy

    Exception Hierarchy

    Tutorial

    Basic Use

    For the most part, the policy-based containers containers in namespace __gnu_pbds have the same interface as the equivalent containers in the standard C++ library, except for @@ -479,4 +479,4 @@ very simple version of Dijkstra's shortest path algorithm: priority_queue_dijkstra.cc -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/source_organization.html b/libstdc++-v3/doc/html/manual/source_organization.html index 92044484f69..102473c47a7 100644 --- a/libstdc++-v3/doc/html/manual/source_organization.html +++ b/libstdc++-v3/doc/html/manual/source_organization.html @@ -45,10 +45,8 @@ It has subdirectories:
    include/debug, include/parallel, and - include/profile
    - Headers that implement the Debug Mode, Parallel Mode, and Profile Mode - extensions. + Headers that implement the Debug Mode and Parallel Mode extensions.
    scripts
    Scripts that are used during the configure, build, make, or test process. diff --git a/libstdc++-v3/doc/html/manual/status.html b/libstdc++-v3/doc/html/manual/status.html index 7e1c1a36dac..97bb38c6674 100644 --- a/libstdc++-v3/doc/html/manual/status.html +++ b/libstdc++-v3/doc/html/manual/status.html @@ -91,7 +91,7 @@ particular release. std::type_info::name() is the mangled type name. You will need to call c++filt and pass the names as command-line parameters to demangle them, or call a - runtime demangler function. + runtime demangler function.

    [20.1.5]/5 "Implementors are encouraged to supply libraries that can accept allocators that encapsulate more general memory models and that support non-equal instances. In such @@ -1238,7 +1238,9 @@ Feature-testing recommendations for C++. P0591R4 - 9.1   P0595R2 std::is_constant_evaluated() + 9.1 + std::scoped_allocator_adaptor changes missing in 9.1.0 + P0595R2 std::is_constant_evaluated() P0595R2 diff --git a/libstdc++-v3/doc/html/manual/test.html b/libstdc++-v3/doc/html/manual/test.html index da801987cbd..ef56a305687 100644 --- a/libstdc++-v3/doc/html/manual/test.html +++ b/libstdc++-v3/doc/html/manual/test.html @@ -533,10 +533,7 @@ with specific options, and additional options for 32-bit x86: (as determined by the _GLIBCXX_DEBUG macro).

    dg-require-parallel-mode ""

    Skip the test if the Parallel Mode is not active (as determined by the _GLIBCXX_PARALLEL macro). -

    dg-require-profile-mode ""

    Skip the test if the Profile Mode is not active - (as determined by the _GLIBCXX_PROFILE macro). -

    dg-require-normal-mode ""

    Skip the test if any of Debug, Parallel or Profile - Mode is active. +

    dg-require-normal-mode ""

    Skip the test if Debug or Parallel Mode is active.

    dg-require-atomic-builtins ""

    Skip the test if atomic operations on bool and int are not lock-free.

    dg-require-gthreads ""

    Skip the test if the C++11 thread library is not diff --git a/libstdc++-v3/doc/html/manual/using.html b/libstdc++-v3/doc/html/manual/using.html index 355790d28de..140896b1f60 100644 --- a/libstdc++-v3/doc/html/manual/using.html +++ b/libstdc++-v3/doc/html/manual/using.html @@ -2,7 +2,7 @@ Chapter 3. Using

    Chapter 3. Using

    Command Options

    Next


    Chapter 3. Using

    Command Options

    The set of features available in the GNU C++ library is shaped by several GCC Command Options. Options that impact libstdc++ are diff --git a/libstdc++-v3/doc/html/manual/using_headers.html b/libstdc++-v3/doc/html/manual/using_headers.html index 9cc1c19bbe5..0d5de91fe31 100644 --- a/libstdc++-v3/doc/html/manual/using_headers.html +++ b/libstdc++-v3/doc/html/manual/using_headers.html @@ -89,7 +89,7 @@ compiler supports scalar decimal floating-point types defined via Also included are files for the C++ ABI interface:

    Table 3.16. C++ ABI Headers

    cxxabi.hcxxabi_forced.h

    And a large variety of extensions. -

    Table 3.17. Extension Headers

    ext/algorithmext/atomicity.hext/array_allocator.hext/bitmap_allocator.hext/cast.h
    ext/codecvt_specializations.hext/concurrence.hext/debug_allocator.hext/enc_filebuf.hext/extptr_allocator.h
    ext/functionalext/iteratorext/malloc_allocator.hext/memoryext/mt_allocator.h
    ext/new_allocator.hext/numericext/numeric_traits.hext/pb_ds/assoc_container.hext/pb_ds/priority_queue.h
    ext/pod_char_traits.hext/pool_allocator.hext/rb_treeext/ropeext/slist
    ext/stdio_filebuf.hext/stdio_sync_filebuf.hext/throw_allocator.hext/typelist.hext/type_traits.h
    ext/vstring.h 

    Table 3.18. Extension Debug Headers

    debug/arraydebug/bitsetdebug/dequedebug/forward_listdebug/list
    debug/mapdebug/setdebug/stringdebug/unordered_mapdebug/unordered_set
    debug/vector 

    Table 3.19. Extension Profile Headers

    profile/bitsetprofile/dequeprofile/listprofile/map
    profile/setprofile/unordered_mapprofile/unordered_setprofile/vector

    Table 3.20. Extension Parallel Headers

    parallel/algorithmparallel/numeric

    Mixing Headers

    A few simple rules. +

    Table 3.17. Extension Headers

    ext/algorithmext/atomicity.hext/bitmap_allocator.hext/cast.h 
    ext/codecvt_specializations.hext/concurrence.hext/debug_allocator.hext/enc_filebuf.hext/extptr_allocator.h
    ext/functionalext/iteratorext/malloc_allocator.hext/memoryext/mt_allocator.h
    ext/new_allocator.hext/numericext/numeric_traits.hext/pb_ds/assoc_container.hext/pb_ds/priority_queue.h
    ext/pod_char_traits.hext/pool_allocator.hext/rb_treeext/ropeext/slist
    ext/stdio_filebuf.hext/stdio_sync_filebuf.hext/throw_allocator.hext/typelist.hext/type_traits.h
    ext/vstring.h 

    Table 3.18. Extension Debug Headers

    debug/arraydebug/bitsetdebug/dequedebug/forward_listdebug/list
    debug/mapdebug/setdebug/stringdebug/unordered_mapdebug/unordered_set
    debug/vector 

    Table 3.19. Extension Parallel Headers

    parallel/algorithmparallel/numeric

    Mixing Headers

    A few simple rules.

    First, mixing different dialects of the standard headers is not possible. It's an all-or-nothing affair. Thus, code like

    diff --git a/libstdc++-v3/doc/html/manual/using_macros.html b/libstdc++-v3/doc/html/manual/using_macros.html
    index f4282c9034b..44afa81f614 100644
    --- a/libstdc++-v3/doc/html/manual/using_macros.html
    +++ b/libstdc++-v3/doc/html/manual/using_macros.html
    @@ -103,9 +103,6 @@
           _GLIBCXX_ASSERTIONS has a non-zero value, otherwise to zero.
           When defined to a non-zero value, it enables extra error checking and
           assertions in the parallel mode.
    -      

    _GLIBCXX_PROFILE

    Undefined by default. When defined, compiles user code - using the profile - mode.

    __STDCPP_WANT_MATH_SPEC_FUNCS__

    Undefined by default. When defined to a non-zero integer constant, enables support for ISO/IEC 29124 Special Math Functions.

    _GLIBCXX_SANITIZE_VECTOR

    diff --git a/libstdc++-v3/doc/xml/authors.xml b/libstdc++-v3/doc/xml/authors.xml index 1f26f63fbc6..0a120b508e9 100644 --- a/libstdc++-v3/doc/xml/authors.xml +++ b/libstdc++-v3/doc/xml/authors.xml @@ -92,12 +92,6 @@ - SilviusRus - - Profile mode - - - JohannesSingler Parallel mode diff --git a/libstdc++-v3/doc/xml/manual/appendix_contributing.xml b/libstdc++-v3/doc/xml/manual/appendix_contributing.xml index 41335475f3b..ff0ba66c6ed 100644 --- a/libstdc++-v3/doc/xml/manual/appendix_contributing.xml +++ b/libstdc++-v3/doc/xml/manual/appendix_contributing.xml @@ -292,11 +292,9 @@ It has subdirectories: include/debug, include/parallel, and - include/profile - Headers that implement the Debug Mode, Parallel Mode, and Profile Mode - extensions. + Headers that implement the Debug Mode and Parallel Mode extensions. diff --git a/libstdc++-v3/doc/xml/manual/debug.xml b/libstdc++-v3/doc/xml/manual/debug.xml index 091e0b6914c..bb018569b39 100644 --- a/libstdc++-v3/doc/xml/manual/debug.xml +++ b/libstdc++-v3/doc/xml/manual/debug.xml @@ -354,12 +354,4 @@ -

    Profile-based Performance Analysis - - The Profile-based - Performance Analysis extension has performance checks for many - algorithms. - -
    - diff --git a/libstdc++-v3/doc/xml/manual/evolution.xml b/libstdc++-v3/doc/xml/manual/evolution.xml index 80288694056..010907a2f6b 100644 --- a/libstdc++-v3/doc/xml/manual/evolution.xml +++ b/libstdc++-v3/doc/xml/manual/evolution.xml @@ -948,7 +948,13 @@ now defaults to zero.
    <constant>10</constant> - __gnu_cxx::array_allocator removed. + Deprecated features removed: + + Profile Mode + __gnu_cxx::array_allocator + + +
    diff --git a/libstdc++-v3/doc/xml/manual/extensions.xml b/libstdc++-v3/doc/xml/manual/extensions.xml index 8912e39557a..86e92beffd3 100644 --- a/libstdc++-v3/doc/xml/manual/extensions.xml +++ b/libstdc++-v3/doc/xml/manual/extensions.xml @@ -107,12 +107,6 @@ extensions, be aware of two things: href="parallel_mode.xml"> - - - - - diff --git a/libstdc++-v3/doc/xml/manual/profile_mode.xml b/libstdc++-v3/doc/xml/manual/profile_mode.xml deleted file mode 100644 index fa1b7c993c3..00000000000 --- a/libstdc++-v3/doc/xml/manual/profile_mode.xml +++ /dev/null @@ -1,1718 +0,0 @@ - - - -Profile Mode - - C++ - library - profile - - - - - - -
    Intro - - - Goal: Give performance improvement advice based on - recognition of suboptimal usage patterns of the standard library. - - - - Method: Wrap the standard library code. Insert - calls to an instrumentation library to record the internal state of - various components at interesting entry/exit points to/from the standard - library. Process trace, recognize suboptimal patterns, give advice. - For details, see the - Perflint - paper presented at CGO 2009. - - - Strengths: - - - Unintrusive solution. The application code does not require any - modification. - - The advice is call context sensitive, thus capable of - identifying precisely interesting dynamic performance behavior. - - - The overhead model is pay-per-view. When you turn off a diagnostic class - at compile time, its overhead disappears. - - - - - Drawbacks: - - - You must recompile the application code with custom options. - - You must run the application on representative input. - The advice is input dependent. - - - The execution time will increase, in some cases by factors. - - - - - -
    Using the Profile Mode - - - - This is the anticipated common workflow for program foo.cc: - -$ cat foo.cc -#include <vector> -int main() { - vector<int> v; - for (int k = 0; k < 1024; ++k) v.insert(v.begin(), k); -} - -$ g++ -D_GLIBCXX_PROFILE foo.cc -$ ./a.out -$ cat libstdcxx-profile.txt -vector-to-list: improvement = 5: call stack = 0x804842c ... - : advice = change std::vector to std::list -vector-size: improvement = 3: call stack = 0x804842c ... - : advice = change initial container size from 0 to 1024 - - - - - Anatomy of a warning: - - - - Warning id. This is a short descriptive string for the class - that this warning belongs to. E.g., "vector-to-list". - - - - - Estimated improvement. This is an approximation of the benefit expected - from implementing the change suggested by the warning. It is given on - a log10 scale. Negative values mean that the alternative would actually - do worse than the current choice. - In the example above, 5 comes from the fact that the overhead of - inserting at the beginning of a vector vs. a list is around 1024 * 1024 / 2, - which is around 10e5. The improvement from setting the initial size to - 1024 is in the range of 10e3, since the overhead of dynamic resizing is - linear in this case. - - - - - Call stack. Currently, the addresses are printed without - symbol name or code location attribution. - Users are expected to postprocess the output using, for instance, addr2line. - - - - - The warning message. For some warnings, this is static text, e.g., - "change vector to list". For other warnings, such as the one above, - the message contains numeric advice, e.g., the suggested initial size - of the vector. - - - - - - Three files are generated. libstdcxx-profile.txt - contains human readable advice. libstdcxx-profile.raw - contains implementation specific data about each diagnostic. - Their format is not documented. They are sufficient to generate - all the advice given in libstdcxx-profile.txt. The advantage - of keeping this raw format is that traces from multiple executions can - be aggregated simply by concatenating the raw traces. We intend to - offer an external utility program that can issue advice from a trace. - libstdcxx-profile.conf.out lists the actual diagnostic - parameters used. To alter parameters, edit this file and rename it to - libstdcxx-profile.conf. - - - Advice is given regardless whether the transformation is valid. - For instance, we advise changing a map to an unordered_map even if the - application semantics require that data be ordered. - We believe such warnings can help users understand the performance - behavior of their application better, which can lead to changes - at a higher abstraction level. - - -
    - -
    Tuning the Profile Mode - - - Compile time switches and environment variables (see also file - profiler.h). Unless specified otherwise, they can be set at compile time - using -D_<name> or by setting variable <name> - in the environment where the program is run, before starting execution. - - - _GLIBCXX_PROFILE_NO_<diagnostic>: - disable specific diagnostics. - See section Diagnostics for possible values. - (Environment variables not supported.) - - - _GLIBCXX_PROFILE_TRACE_PATH_ROOT: set an alternative root - path for the output files. - - _GLIBCXX_PROFILE_MAX_WARN_COUNT: set it to the maximum - number of warnings desired. The default value is 10. - - _GLIBCXX_PROFILE_MAX_STACK_DEPTH: if set to 0, - the advice will - be collected and reported for the program as a whole, and not for each - call context. - This could also be used in continuous regression tests, where you - just need to know whether there is a regression or not. - The default value is 32. - - - _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC: - set a limit on how much memory to use for the accounting tables for each - diagnostic type. When this limit is reached, new events are ignored - until the memory usage decreases under the limit. Generally, this means - that newly created containers will not be instrumented until some - live containers are deleted. The default is 128 MB. - - - _GLIBCXX_PROFILE_NO_THREADS: - Make the library not use threads. If thread local storage (TLS) is not - available, you will get a preprocessor error asking you to set - -D_GLIBCXX_PROFILE_NO_THREADS if your program is single-threaded. - Multithreaded execution without TLS is not supported. - (Environment variable not supported.) - - - _GLIBCXX_HAVE_EXECINFO_H: - This name should be defined automatically at library configuration time. - If your library was configured without execinfo.h, but - you have it in your include path, you can define it explicitly. Without - it, advice is collected for the program as a whole, and not for each - call context. - (Environment variable not supported.) - - - - -
    - -
    - - -
    Design - - - - - - -Profile Code Location - - - - - - - - Code Location - Use - - - - - libstdc++-v3/include/std/* - Preprocessor code to redirect to profile extension headers. - - - libstdc++-v3/include/profile/* - Profile extension public headers (map, vector, ...). - - - libstdc++-v3/include/profile/impl/* - Profile extension internals. Implementation files are - only included from impl/profiler.h, which is the only - file included from the public headers. - - - -
    - - - - -
    Wrapper Model - - - In order to get our instrumented library version included instead of the - release one, - we use the same wrapper model as the debug mode. - We subclass entities from the release version. Wherever - _GLIBCXX_PROFILE is defined, the release namespace is - std::__norm, whereas the profile namespace is - std::__profile. Using plain std translates - into std::__profile. - - - Whenever possible, we try to wrap at the public interface level, e.g., - in unordered_set rather than in hashtable, - in order not to depend on implementation. - - - Mixing object files built with and without the profile mode must - not affect the program execution. However, there are no guarantees to - the accuracy of diagnostics when using even a single object not built with - -D_GLIBCXX_PROFILE. - Currently, mixing the profile mode with debug and parallel extensions is - not allowed. Mixing them at compile time will result in preprocessor errors. - Mixing them at link time is undefined. - -
    - - -
    Instrumentation - - - Instead of instrumenting every public entry and exit point, - we chose to add instrumentation on demand, as needed - by individual diagnostics. - The main reason is that some diagnostics require us to extract bits of - internal state that are particular only to that diagnostic. - We plan to formalize this later, after we learn more about the requirements - of several diagnostics. - - - All the instrumentation points can be switched on and off using - -D[_NO]_GLIBCXX_PROFILE_<diagnostic> options. - With all the instrumentation calls off, there should be negligible - overhead over the release version. This property is needed to support - diagnostics based on timing of internal operations. For such diagnostics, - we anticipate turning most of the instrumentation off in order to prevent - profiling overhead from polluting time measurements, and thus diagnostics. - - - All the instrumentation on/off compile time switches live in - include/profile/profiler.h. - -
    - - -
    Run Time Behavior - - - For practical reasons, the instrumentation library processes the trace - partially - rather than dumping it to disk in raw form. Each event is processed when - it occurs. It is usually attached a cost and it is aggregated into - the database of a specific diagnostic class. The cost model - is based largely on the standard performance guarantees, but in some - cases we use knowledge about GCC's standard library implementation. - - - Information is indexed by (1) call stack and (2) instance id or address - to be able to understand and summarize precise creation-use-destruction - dynamic chains. Although the analysis is sensitive to dynamic instances, - the reports are only sensitive to call context. Whenever a dynamic instance - is destroyed, we accumulate its effect to the corresponding entry for the - call stack of its constructor location. - - - - For details, see - paper presented at - CGO 2009. - -
    - - -
    Analysis and Diagnostics - - - Final analysis takes place offline, and it is based entirely on the - generated trace and debugging info in the application binary. - See section Diagnostics for a list of analysis types that we plan to support. - - - The input to the analysis is a table indexed by profile type and call stack. - The data type for each entry depends on the profile type. - -
    - - -
    Cost Model - - - While it is likely that cost models become complex as we get into - more sophisticated analysis, we will try to follow a simple set of rules - at the beginning. - - - Relative benefit estimation: - The idea is to estimate or measure the cost of all operations - in the original scenario versus the scenario we advise to switch to. - For instance, when advising to change a vector to a list, an occurrence - of the insert method will generally count as a benefit. - Its magnitude depends on (1) the number of elements that get shifted - and (2) whether it triggers a reallocation. - - Synthetic measurements: - We will measure the relative difference between similar operations on - different containers. We plan to write a battery of small tests that - compare the times of the executions of similar methods on different - containers. The idea is to run these tests on the target machine. - If this training phase is very quick, we may decide to perform it at - library initialization time. The results can be cached on disk and reused - across runs. - - Timers: - We plan to use timers for operations of larger granularity, such as sort. - For instance, we can switch between different sort methods on the fly - and report the one that performs best for each call context. - - Show stoppers: - We may decide that the presence of an operation nullifies the advice. - For instance, when considering switching from set to - unordered_set, if we detect use of operator ++, - we will simply not issue the advice, since this could signal that the use - care require a sorted container. - - -
    - - -
    Reports - - -There are two types of reports. First, if we recognize a pattern for which -we have a substitute that is likely to give better performance, we print -the advice and estimated performance gain. The advice is usually associated -to a code position and possibly a call stack. - - -Second, we report performance characteristics for which we do not have -a clear solution for improvement. For instance, we can point to the user -the top 10 multimap locations -which have the worst data locality in actual traversals. -Although this does not offer a solution, -it helps the user focus on the key problems and ignore the uninteresting ones. - -
    - - -
    Testing - - - First, we want to make sure we preserve the behavior of the release mode. - You can just type "make check-profile", which - builds and runs the whole test suite in profile mode. - - - Second, we want to test the correctness of each diagnostic. - We created a profile directory in the test suite. - Each diagnostic must come with at least two tests, one for false positives - and one for false negatives. - -
    - -
    - -
    Extensions for Custom Containers - - - - - Many large projects use their own data structures instead of the ones in the - standard library. If these data structures are similar in functionality - to the standard library, they can be instrumented with the same hooks - that are used to instrument the standard library. - The instrumentation API is exposed in file - profiler.h (look for "Instrumentation hooks"). - - -
    - - -
    Empirical Cost Model - - - - - Currently, the cost model uses formulas with predefined relative weights - for alternative containers or container implementations. For instance, - iterating through a vector is X times faster than iterating through a list. - - - (Under development.) - We are working on customizing this to a particular machine by providing - an automated way to compute the actual relative weights for operations - on the given machine. - - - (Under development.) - We plan to provide a performance parameter database format that can be - filled in either by hand or by an automated training mechanism. - The analysis module will then use this database instead of the built in. - generic parameters. - - -
    - - -
    Implementation Issues - - - - -
    Stack Traces - - - Accurate stack traces are needed during profiling since we group events by - call context and dynamic instance. Without accurate traces, diagnostics - may be hard to interpret. For instance, when giving advice to the user - it is imperative to reference application code, not library code. - - - Currently we are using the libc backtrace routine to get - stack traces. - _GLIBCXX_PROFILE_STACK_DEPTH can be set - to 0 if you are willing to give up call context information, or to a small - positive value to reduce run time overhead. - -
    - - -
    Symbolization of Instruction Addresses - - - The profiling and analysis phases use only instruction addresses. - An external utility such as addr2line is needed to postprocess the result. - We do not plan to add symbolization support in the profile extension. - This would require access to symbol tables, debug information tables, - external programs or libraries and other system dependent information. - -
    - - -
    Concurrency - - - Our current model is simplistic, but precise. - We cannot afford to approximate because some of our diagnostics require - precise matching of operations to container instance and call context. - During profiling, we keep a single information table per diagnostic. - There is a single lock per information table. - -
    - - -
    Using the Standard Library in the Instrumentation Implementation - - - As much as we would like to avoid uses of libstdc++ within our - instrumentation library, containers such as unordered_map are very - appealing. We plan to use them as long as they are named properly - to avoid ambiguity. - -
    - - -
    Malloc Hooks - - - User applications/libraries can provide malloc hooks. - When the implementation of the malloc hooks uses stdlibc++, there can - be an infinite cycle between the profile mode instrumentation and the - malloc hook code. - - - We protect against reentrance to the profile mode instrumentation code, - which should avoid this problem in most cases. - The protection mechanism is thread safe and exception safe. - This mechanism does not prevent reentrance to the malloc hook itself, - which could still result in deadlock, if, for instance, the malloc hook - uses non-recursive locks. - XXX: A definitive solution to this problem would be for the profile extension - to use a custom allocator internally, and perhaps not to use libstdc++. - -
    - - -
    Construction and Destruction of Global Objects - - - The profiling library state is initialized at the first call to a profiling - method. This allows us to record the construction of all global objects. - However, we cannot do the same at destruction time. The trace is written - by a function registered by atexit, thus invoked by - exit. - -
    - -
    - - -
    Developer Information - - - -
    Big Picture - - - The profile mode headers are included with - -D_GLIBCXX_PROFILE through preprocessor directives in - include/std/*. - - - Instrumented implementations are provided in - include/profile/*. All instrumentation hooks are macros - defined in include/profile/profiler.h. - - - All the implementation of the instrumentation hooks is in - include/profile/impl/*. Although all the code gets included, - thus is publicly visible, only a small number of functions are called from - outside this directory. All calls to hook implementations must be - done through macros defined in profiler.h. The macro - must ensure (1) that the call is guarded against reentrance and - (2) that the call can be turned off at compile time using a - -D_GLIBCXX_PROFILE_... compiler option. - - -
    - -
    How To Add A Diagnostic - - - Let's say the diagnostic name is "magic". - - - If you need to instrument a header not already under - include/profile/*, first edit the corresponding header - under include/std/ and add a preprocessor directive such - as the one in include/std/vector: - -#ifdef _GLIBCXX_PROFILE -# include <profile/vector> -#endif - - - - If the file you need to instrument is not yet under - include/profile/, make a copy of the one in - include/debug, or the main implementation. - You'll need to include the main implementation and inherit the classes - you want to instrument. Then define the methods you want to instrument, - define the instrumentation hooks and add calls to them. - Look at include/profile/vector for an example. - - - Add macros for the instrumentation hooks in - include/profile/impl/profiler.h. - Hook names must start with __profcxx_. - Make sure they transform - in no code with -D_NO_GLIBCXX_PROFILE_MAGIC. - Make sure all calls to any method in namespace __gnu_profile - is protected against reentrance using macro - _GLIBCXX_PROFILE_REENTRANCE_GUARD. - All names of methods in namespace __gnu_profile called from - profiler.h must start with __trace_magic_. - - - Add the implementation of the diagnostic. - - - Create new file include/profile/impl/profiler_magic.h. - - - Define class __magic_info: public __object_info_base. - This is the representation of a line in the object table. - The __merge method is used to aggregate information - across all dynamic instances created at the same call context. - The __magnitude must return the estimation of the benefit - as a number of small operations, e.g., number of words copied. - The __write method is used to produce the raw trace. - The __advice method is used to produce the advice string. - - - Define class __magic_stack_info: public __magic_info. - This defines the content of a line in the stack table. - - - Define class __trace_magic: public __trace_base<__magic_info, - __magic_stack_info>. - It defines the content of the trace associated with this diagnostic. - - - - - Add initialization and reporting calls in - include/profile/impl/profiler_trace.h. Use - __trace_vector_to_list as an example. - - - Add documentation in file doc/xml/manual/profile_mode.xml. - -
    -
    - -
    Diagnostics - - - - - The table below presents all the diagnostics we intend to implement. - Each diagnostic has a corresponding compile time switch - -D_GLIBCXX_PROFILE_<diagnostic>. - Groups of related diagnostics can be turned on with a single switch. - For instance, -D_GLIBCXX_PROFILE_LOCALITY is equivalent to - -D_GLIBCXX_PROFILE_SOFTWARE_PREFETCH - -D_GLIBCXX_PROFILE_RBTREE_LOCALITY. - - - - The benefit, cost, expected frequency and accuracy of each diagnostic - was given a grade from 1 to 10, where 10 is highest. - A high benefit means that, if the diagnostic is accurate, the expected - performance improvement is high. - A high cost means that turning this diagnostic on leads to high slowdown. - A high frequency means that we expect this to occur relatively often. - A high accuracy means that the diagnostic is unlikely to be wrong. - These grades are not perfect. They are just meant to guide users with - specific needs or time budgets. - - - -Profile Diagnostics - - - - - - - - - - - - - Group - Flag - Benefit - Cost - Freq. - Implemented - - - - - - CONTAINERS - - HASHTABLE_TOO_SMALL - 10 - 1 - - 10 - yes - - - - - HASHTABLE_TOO_LARGE - 5 - 1 - - 10 - yes - - - - - INEFFICIENT_HASH - 7 - 3 - - 10 - yes - - - - - VECTOR_TOO_SMALL - 8 - 1 - - 10 - yes - - - - - VECTOR_TOO_LARGE - 5 - 1 - - 10 - yes - - - - - VECTOR_TO_HASHTABLE - 7 - 7 - - 10 - no - - - - - HASHTABLE_TO_VECTOR - 7 - 7 - - 10 - no - - - - - VECTOR_TO_LIST - 8 - 5 - - 10 - yes - - - - - LIST_TO_VECTOR - 10 - 5 - - 10 - no - - - - - ORDERED_TO_UNORDERED - 10 - 5 - - 10 - only map/unordered_map - - - - ALGORITHMS - - SORT - 7 - 8 - - 7 - no - - - - LOCALITY - - SOFTWARE_PREFETCH - 8 - 8 - - 5 - no - - - - - RBTREE_LOCALITY - 4 - 8 - - 5 - no - - - - - FALSE_SHARING - 8 - 10 - - 10 - no - - - -
    - -
    Diagnostic Template - - - Switch: - _GLIBCXX_PROFILE_<diagnostic>. - - Goal: What problem will it diagnose? - - Fundamentals:. - What is the fundamental reason why this is a problem - Sample runtime reduction: - Percentage reduction in execution time. When reduction is more than - a constant factor, describe the reduction rate formula. - - Recommendation: - What would the advise look like? - To instrument: - What stdlibc++ components need to be instrumented? - Analysis: - How do we decide when to issue the advice? - Cost model: - How do we measure benefits? Math goes here. - Example: - -program code -... -advice sample - - - -
    - - -
    Containers - - - -Switch: - _GLIBCXX_PROFILE_CONTAINERS. - - -
    Hashtable Too Small - - - Switch: - _GLIBCXX_PROFILE_HASHTABLE_TOO_SMALL. - - Goal: Detect hashtables with many - rehash operations, small construction size and large destruction size. - - Fundamentals: Rehash is very expensive. - Read content, follow chains within bucket, evaluate hash function, place at - new location in different order. - Sample runtime reduction: 36%. - Code similar to example below. - - Recommendation: - Set initial size to N at construction site S. - - To instrument: - unordered_set, unordered_map constructor, destructor, rehash. - - Analysis: - For each dynamic instance of unordered_[multi]set|map, - record initial size and call context of the constructor. - Record size increase, if any, after each relevant operation such as insert. - Record the estimated rehash cost. - Cost model: - Number of individual rehash operations * cost per rehash. - Example: - -1 unordered_set<int> us; -2 for (int k = 0; k < 1000000; ++k) { -3 us.insert(k); -4 } - -foo.cc:1: advice: Changing initial unordered_set size from 10 to 1000000 saves 1025530 rehash operations. - - - -
    - - -
    Hashtable Too Large - - - Switch: - _GLIBCXX_PROFILE_HASHTABLE_TOO_LARGE. - - Goal: Detect hashtables which are - never filled up because fewer elements than reserved are ever - inserted. - - Fundamentals: Save memory, which - is good in itself and may also improve memory reference performance through - fewer cache and TLB misses. - Sample runtime reduction: unknown. - - Recommendation: - Set initial size to N at construction site S. - - To instrument: - unordered_set, unordered_map constructor, destructor, rehash. - - Analysis: - For each dynamic instance of unordered_[multi]set|map, - record initial size and call context of the constructor, and correlate it - with its size at destruction time. - - Cost model: - Number of iteration operations + memory saved. - Example: - -1 vector<unordered_set<int>> v(100000, unordered_set<int>(100)) ; -2 for (int k = 0; k < 100000; ++k) { -3 for (int j = 0; j < 10; ++j) { -4 v[k].insert(k + j); -5 } -6 } - -foo.cc:1: advice: Changing initial unordered_set size from 100 to 10 saves N -bytes of memory and M iteration steps. - - - -
    - -
    Inefficient Hash - - - Switch: - _GLIBCXX_PROFILE_INEFFICIENT_HASH. - - Goal: Detect hashtables with polarized - distribution. - - Fundamentals: A non-uniform - distribution may lead to long chains, thus possibly increasing complexity - by a factor up to the number of elements. - - Sample runtime reduction: factor up - to container size. - - Recommendation: Change hash function - for container built at site S. Distribution score = N. Access score = S. - Longest chain = C, in bucket B. - - To instrument: - unordered_set, unordered_map constructor, destructor, [], - insert, iterator. - - Analysis: - Count the exact number of link traversals. - - Cost model: - Total number of links traversed. - Example: - -class dumb_hash { - public: - size_t operator() (int i) const { return 0; } -}; -... - unordered_set<int, dumb_hash> hs; - ... - for (int i = 0; i < COUNT; ++i) { - hs.find(i); - } - - - -
    - -
    Vector Too Small - - - Switch: - _GLIBCXX_PROFILE_VECTOR_TOO_SMALL. - - Goal:Detect vectors with many - resize operations, small construction size and large destruction size.. - - Fundamentals:Resizing can be expensive. - Copying large amounts of data takes time. Resizing many small vectors may - have allocation overhead and affect locality. - Sample runtime reduction:%. - - Recommendation: - Set initial size to N at construction site S. - To instrument:vector. - - Analysis: - For each dynamic instance of vector, - record initial size and call context of the constructor. - Record size increase, if any, after each relevant operation such as - push_back. Record the estimated resize cost. - - Cost model: - Total number of words copied * time to copy a word. - Example: - -1 vector<int> v; -2 for (int k = 0; k < 1000000; ++k) { -3 v.push_back(k); -4 } - -foo.cc:1: advice: Changing initial vector size from 10 to 1000000 saves -copying 4000000 bytes and 20 memory allocations and deallocations. - - - -
    - -
    Vector Too Large - - - Switch: - _GLIBCXX_PROFILE_VECTOR_TOO_LARGE - - Goal:Detect vectors which are - never filled up because fewer elements than reserved are ever - inserted. - - Fundamentals:Save memory, which - is good in itself and may also improve memory reference performance through - fewer cache and TLB misses. - Sample runtime reduction:%. - - Recommendation: - Set initial size to N at construction site S. - To instrument:vector. - - Analysis: - For each dynamic instance of vector, - record initial size and call context of the constructor, and correlate it - with its size at destruction time. - Cost model: - Total amount of memory saved. - Example: - -1 vector<vector<int>> v(100000, vector<int>(100)) ; -2 for (int k = 0; k < 100000; ++k) { -3 for (int j = 0; j < 10; ++j) { -4 v[k].insert(k + j); -5 } -6 } - -foo.cc:1: advice: Changing initial vector size from 100 to 10 saves N -bytes of memory and may reduce the number of cache and TLB misses. - - - -
    - -
    Vector to Hashtable - - - Switch: - _GLIBCXX_PROFILE_VECTOR_TO_HASHTABLE. - - Goal: Detect uses of - vector that can be substituted with unordered_set - to reduce execution time. - - Fundamentals: - Linear search in a vector is very expensive, whereas searching in a hashtable - is very quick. - Sample runtime reduction:factor up - to container size. - - Recommendation:Replace - vector with unordered_set at site S. - - To instrument:vector - operations and access methods. - Analysis: - For each dynamic instance of vector, - record call context of the constructor. Issue the advice only if the - only methods called on this vector are push_back, - insert and find. - - Cost model: - Cost(vector::push_back) + cost(vector::insert) + cost(find, vector) - - cost(unordered_set::insert) + cost(unordered_set::find). - - Example: - -1 vector<int> v; -... -2 for (int i = 0; i < 1000; ++i) { -3 find(v.begin(), v.end(), i); -4 } - -foo.cc:1: advice: Changing "vector" to "unordered_set" will save about 500,000 -comparisons. - - - -
    - -
    Hashtable to Vector - - - Switch: - _GLIBCXX_PROFILE_HASHTABLE_TO_VECTOR. - - Goal: Detect uses of - unordered_set that can be substituted with vector - to reduce execution time. - - Fundamentals: - Hashtable iterator is slower than vector iterator. - Sample runtime reduction:95%. - - Recommendation:Replace - unordered_set with vector at site S. - - To instrument:unordered_set - operations and access methods. - Analysis: - For each dynamic instance of unordered_set, - record call context of the constructor. Issue the advice only if the - number of find, insert and [] - operations on this unordered_set are small relative to the - number of elements, and methods begin or end - are invoked (suggesting iteration). - Cost model: - Number of . - Example: - -1 unordered_set<int> us; -... -2 int s = 0; -3 for (unordered_set<int>::iterator it = us.begin(); it != us.end(); ++it) { -4 s += *it; -5 } - -foo.cc:1: advice: Changing "unordered_set" to "vector" will save about N -indirections and may achieve better data locality. - - - -
    - -
    Vector to List - - - Switch: - _GLIBCXX_PROFILE_VECTOR_TO_LIST. - - Goal: Detect cases where - vector could be substituted with list for - better performance. - - Fundamentals: - Inserting in the middle of a vector is expensive compared to inserting in a - list. - - Sample runtime reduction:factor up to - container size. - - Recommendation:Replace vector with list - at site S. - To instrument:vector - operations and access methods. - Analysis: - For each dynamic instance of vector, - record the call context of the constructor. Record the overhead of each - insert operation based on current size and insert position. - Report instance with high insertion overhead. - - Cost model: - (Sum(cost(vector::method)) - Sum(cost(list::method)), for - method in [push_back, insert, erase]) - + (Cost(iterate vector) - Cost(iterate list)) - Example: - -1 vector<int> v; -2 for (int i = 0; i < 10000; ++i) { -3 v.insert(v.begin(), i); -4 } - -foo.cc:1: advice: Changing "vector" to "list" will save about 5,000,000 -operations. - - - -
    - -
    List to Vector - - - Switch: - _GLIBCXX_PROFILE_LIST_TO_VECTOR. - - Goal: Detect cases where - list could be substituted with vector for - better performance. - - Fundamentals: - Iterating through a vector is faster than through a list. - - Sample runtime reduction:64%. - - Recommendation:Replace list with vector - at site S. - To instrument:vector - operations and access methods. - Analysis: - Issue the advice if there are no insert operations. - - Cost model: - (Sum(cost(vector::method)) - Sum(cost(list::method)), for - method in [push_back, insert, erase]) - + (Cost(iterate vector) - Cost(iterate list)) - Example: - -1 list<int> l; -... -2 int sum = 0; -3 for (list<int>::iterator it = l.begin(); it != l.end(); ++it) { -4 sum += *it; -5 } - -foo.cc:1: advice: Changing "list" to "vector" will save about 1000000 indirect -memory references. - - - -
    - -
    List to Forward List (Slist) - - - Switch: - _GLIBCXX_PROFILE_LIST_TO_SLIST. - - Goal: Detect cases where - list could be substituted with forward_list for - better performance. - - Fundamentals: - The memory footprint of a forward_list is smaller than that of a list. - This has beneficial effects on memory subsystem, e.g., fewer cache misses. - - Sample runtime reduction:40%. - Note that the reduction is only noticeable if the size of the forward_list - node is in fact larger than that of the list node. For memory allocators - with size classes, you will only notice an effect when the two node sizes - belong to different allocator size classes. - - Recommendation:Replace list with - forward_list at site S. - To instrument:list - operations and iteration methods. - Analysis: - Issue the advice if there are no backwards traversals - or insertion before a given node. - - Cost model: - Always true. - Example: - -1 list<int> l; -... -2 int sum = 0; -3 for (list<int>::iterator it = l.begin(); it != l.end(); ++it) { -4 sum += *it; -5 } - -foo.cc:1: advice: Change "list" to "forward_list". - - - -
    - -
    Ordered to Unordered Associative Container - - - Switch: - _GLIBCXX_PROFILE_ORDERED_TO_UNORDERED. - - Goal: Detect cases where ordered - associative containers can be replaced with unordered ones. - - Fundamentals: - Insert and search are quicker in a hashtable than in - a red-black tree. - Sample runtime reduction:52%. - - Recommendation: - Replace set with unordered_set at site S. - To instrument: - set, multiset, map, - multimap methods. - Analysis: - Issue the advice only if we are not using operator ++ on any - iterator on a particular [multi]set|map. - - Cost model: - (Sum(cost(hashtable::method)) - Sum(cost(rbtree::method)), for - method in [insert, erase, find]) - + (Cost(iterate hashtable) - Cost(iterate rbtree)) - Example: - -1 set<int> s; -2 for (int i = 0; i < 100000; ++i) { -3 s.insert(i); -4 } -5 int sum = 0; -6 for (int i = 0; i < 100000; ++i) { -7 sum += *s.find(i); -8 } - - - -
    - -
    - - - -
    Algorithms - - - Switch: - _GLIBCXX_PROFILE_ALGORITHMS. - - -
    Sort Algorithm Performance - - - Switch: - _GLIBCXX_PROFILE_SORT. - - Goal: Give measure of sort algorithm - performance based on actual input. For instance, advise Radix Sort over - Quick Sort for a particular call context. - - Fundamentals: - See papers: - - A framework for adaptive algorithm selection in STAPL and - - Optimizing Sorting with Machine Learning Algorithms. - - Sample runtime reduction:60%. - - Recommendation: Change sort algorithm - at site S from X Sort to Y Sort. - To instrument: sort - algorithm. - Analysis: - Issue the advice if the cost model tells us that another sort algorithm - would do better on this input. Requires us to know what algorithm we - are using in our sort implementation in release mode. - Cost model: - Runtime(algo) for algo in [radix, quick, merge, ...] - Example: - - - - -
    - -
    - - -
    Data Locality - - - Switch: - _GLIBCXX_PROFILE_LOCALITY. - - -
    Need Software Prefetch - - - Switch: - _GLIBCXX_PROFILE_SOFTWARE_PREFETCH. - - Goal: Discover sequences of indirect - memory accesses that are not regular, thus cannot be predicted by - hardware prefetchers. - - Fundamentals: - Indirect references are hard to predict and are very expensive when they - miss in caches. - Sample runtime reduction:25%. - - Recommendation: Insert prefetch - instruction. - To instrument: Vector iterator and - access operator []. - - Analysis: - First, get cache line size and page size from system. - Then record iterator dereference sequences for which the value is a pointer. - For each sequence within a container, issue a warning if successive pointer - addresses are not within cache lines and do not form a linear pattern - (otherwise they may be prefetched by hardware). - If they also step across page boundaries, make the warning stronger. - - The same analysis applies to containers other than vector. - However, we cannot give the same advice for linked structures, such as list, - as there is no random access to the n-th element. The user may still be - able to benefit from this information, for instance by employing frays (user - level light weight threads) to hide the latency of chasing pointers. - - - This analysis is a little oversimplified. A better cost model could be - created by understanding the capability of the hardware prefetcher. - This model could be trained automatically by running a set of synthetic - cases. - - - Cost model: - Total distance between pointer values of successive elements in vectors - of pointers. - Example: - -1 int zero = 0; -2 vector<int*> v(10000000, &zero); -3 for (int k = 0; k < 10000000; ++k) { -4 v[random() % 10000000] = new int(k); -5 } -6 for (int j = 0; j < 10000000; ++j) { -7 count += (*v[j] == 0 ? 0 : 1); -8 } - -foo.cc:7: advice: Insert prefetch instruction. - - - -
    - -
    Linked Structure Locality - - - Switch: - _GLIBCXX_PROFILE_RBTREE_LOCALITY. - - Goal: Give measure of locality of - objects stored in linked structures (lists, red-black trees and hashtables) - with respect to their actual traversal patterns. - - Fundamentals:Allocation can be tuned - to a specific traversal pattern, to result in better data locality. - See paper: - - Custom Memory Allocation for Free by Jula and Rauchwerger. - - Sample runtime reduction:30%. - - Recommendation: - High scatter score N for container built at site S. - Consider changing allocation sequence or choosing a structure conscious - allocator. - To instrument: Methods of all - containers using linked structures. - Analysis: - First, get cache line size and page size from system. - Then record the number of successive elements that are on different line - or page, for each traversal method such as find. Give advice - only if the ratio between this number and the number of total node hops - is above a threshold. - Cost model: - Sum(same_cache_line(this,previous)) - Example: - - 1 set<int> s; - 2 for (int i = 0; i < 10000000; ++i) { - 3 s.insert(i); - 4 } - 5 set<int> s1, s2; - 6 for (int i = 0; i < 10000000; ++i) { - 7 s1.insert(i); - 8 s2.insert(i); - 9 } -... - // Fast, better locality. -10 for (set<int>::iterator it = s.begin(); it != s.end(); ++it) { -11 sum += *it; -12 } - // Slow, elements are further apart. -13 for (set<int>::iterator it = s1.begin(); it != s1.end(); ++it) { -14 sum += *it; -15 } - -foo.cc:5: advice: High scatter score NNN for set built here. Consider changing -the allocation sequence or switching to a structure conscious allocator. - - - -
    - -
    - - -
    Multithreaded Data Access - - - - The diagnostics in this group are not meant to be implemented short term. - They require compiler support to know when container elements are written - to. Instrumentation can only tell us when elements are referenced. - - - Switch: - _GLIBCXX_PROFILE_MULTITHREADED. - - -
    Data Dependence Violations at Container Level - - - Switch: - _GLIBCXX_PROFILE_DDTEST. - - Goal: Detect container elements - that are referenced from multiple threads in the parallel region or - across parallel regions. - - Fundamentals: - Sharing data between threads requires communication and perhaps locking, - which may be expensive. - - Sample runtime reduction:?%. - - Recommendation: Change data - distribution or parallel algorithm. - To instrument: Container access methods - and iterators. - - Analysis: - Keep a shadow for each container. Record iterator dereferences and - container member accesses. Issue advice for elements referenced by - multiple threads. - See paper: - The LRPD test: speculative run-time parallelization of loops with - privatization and reduction parallelization. - - Cost model: - Number of accesses to elements referenced from multiple threads - - Example: - - - - -
    - -
    False Sharing - - - Switch: - _GLIBCXX_PROFILE_FALSE_SHARING. - - Goal: Detect elements in the - same container which share a cache line, are written by at least one - thread, and accessed by different threads. - - Fundamentals: Under these assumptions, - cache protocols require - communication to invalidate lines, which may be expensive. - - Sample runtime reduction:68%. - - Recommendation: Reorganize container - or use padding to avoid false sharing. - To instrument: Container access methods - and iterators. - - Analysis: - First, get the cache line size. - For each shared container, record all the associated iterator dereferences - and member access methods with the thread id. Compare the address lists - across threads to detect references in two different threads to the same - cache line. Issue a warning only if the ratio to total references is - significant. Do the same for iterator dereference values if they are - pointers. - Cost model: - Number of accesses to same cache line from different threads. - - Example: - -1 vector<int> v(2, 0); -2 #pragma omp parallel for shared(v, SIZE) schedule(static, 1) -3 for (i = 0; i < SIZE; ++i) { -4 v[i % 2] += i; -5 } - -OMP_NUM_THREADS=2 ./a.out -foo.cc:1: advice: Change container structure or padding to avoid false -sharing in multithreaded access at foo.cc:4. Detected N shared cache lines. - - - -
    - -
    - - -
    Statistics - - - -Switch: - _GLIBCXX_PROFILE_STATISTICS. - - - - In some cases the cost model may not tell us anything because the costs - appear to offset the benefits. Consider the choice between a vector and - a list. When there are both inserts and iteration, an automatic advice - may not be issued. However, the programmer may still be able to make use - of this information in a different way. - - - This diagnostic will not issue any advice, but it will print statistics for - each container construction site. The statistics will contain the cost - of each operation actually performed on the container. - - -
    - - -
    - - -Bibliography - - - - - Perflint: A Context Sensitive Performance Advisor for C++ Programs - - - LixiaLiu - SilviusRus - - - 2009 - - - - - - Proceedings of the 2009 International Symposium on Code Generation - and Optimization - - - - - - -
    diff --git a/libstdc++-v3/doc/xml/manual/spine.xml b/libstdc++-v3/doc/xml/manual/spine.xml index 2b6973ba0ae..a2cc1294e73 100644 --- a/libstdc++-v3/doc/xml/manual/spine.xml +++ b/libstdc++-v3/doc/xml/manual/spine.xml @@ -126,12 +126,6 @@ - SilviusRus - - Profile mode - - - JohannesSingler Parallel mode diff --git a/libstdc++-v3/doc/xml/manual/test.xml b/libstdc++-v3/doc/xml/manual/test.xml index 1725cdb69f3..19bc9e81ff3 100644 --- a/libstdc++-v3/doc/xml/manual/test.xml +++ b/libstdc++-v3/doc/xml/manual/test.xml @@ -857,14 +857,8 @@ with specific options, and additional options for 32-bit x86: (as determined by the _GLIBCXX_PARALLEL macro). - dg-require-profile-mode "" - Skip the test if the Profile Mode is not active - (as determined by the _GLIBCXX_PROFILE macro). - - dg-require-normal-mode "" - Skip the test if any of Debug, Parallel or Profile - Mode is active. + Skip the test if Debug or Parallel Mode is active. dg-require-atomic-builtins "" diff --git a/libstdc++-v3/doc/xml/manual/using.xml b/libstdc++-v3/doc/xml/manual/using.xml index a97099989a1..d7fbfe9584d 100644 --- a/libstdc++-v3/doc/xml/manual/using.xml +++ b/libstdc++-v3/doc/xml/manual/using.xml @@ -804,36 +804,6 @@ compiler supports scalar decimal floating-point types defined via - -Extension Profile Headers - - - - - - - - - -profile/bitset -profile/deque -profile/list -profile/map - - - -profile/set -profile/unordered_map -profile/unordered_set -profile/vector - - - - -
    - - - Extension Parallel Headers @@ -1175,14 +1145,6 @@ g++ -Winvalid-pch -I. -include stdc++.h -H -g -O2 hello.cc -o test.exe - _GLIBCXX_PROFILE - - Undefined by default. When defined, compiles user code - using the profile - mode. - - - __STDCPP_WANT_MATH_SPEC_FUNCS__ Undefined by default. When defined to a non-zero integer constant, diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index f8f126fbc7d..0880dc43e1f 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -919,45 +919,6 @@ parallel_headers = \ ${parallel_srcdir}/unique_copy.h \ ${parallel_srcdir}/workstealing.h -# Profile mode headers -profile_srcdir = ${glibcxx_srcdir}/include/profile -profile_builddir = ./profile -profile_headers = \ - ${profile_srcdir}/array \ - ${profile_srcdir}/base.h \ - ${profile_srcdir}/unordered_base.h \ - ${profile_srcdir}/unordered_map \ - ${profile_srcdir}/unordered_set \ - ${profile_srcdir}/vector \ - ${profile_srcdir}/bitset \ - ${profile_srcdir}/deque \ - ${profile_srcdir}/forward_list \ - ${profile_srcdir}/list \ - ${profile_srcdir}/map \ - ${profile_srcdir}/map.h \ - ${profile_srcdir}/multimap.h \ - ${profile_srcdir}/multiset.h \ - ${profile_srcdir}/ordered_base.h \ - ${profile_srcdir}/set \ - ${profile_srcdir}/set.h \ - ${profile_srcdir}/iterator_tracker.h -profile_impl_srcdir = ${glibcxx_srcdir}/include/profile/impl -profile_impl_builddir = ./profile/impl -profile_impl_headers = \ - ${profile_impl_srcdir}/profiler.h \ - ${profile_impl_srcdir}/profiler_algos.h \ - ${profile_impl_srcdir}/profiler_container_size.h \ - ${profile_impl_srcdir}/profiler_hash_func.h \ - ${profile_impl_srcdir}/profiler_hashtable_size.h \ - ${profile_impl_srcdir}/profiler_map_to_unordered_map.h \ - ${profile_impl_srcdir}/profiler_node.h \ - ${profile_impl_srcdir}/profiler_state.h \ - ${profile_impl_srcdir}/profiler_trace.h \ - ${profile_impl_srcdir}/profiler_vector_size.h \ - ${profile_impl_srcdir}/profiler_vector_to_list.h \ - ${profile_impl_srcdir}/profiler_list_to_vector.h \ - ${profile_impl_srcdir}/profiler_list_to_slist.h - # Some "C" header schemes require the "C" compatibility headers. # For --enable-cheaders=c_std if GLIBCXX_C_HEADERS_COMPATIBILITY @@ -1043,7 +1004,7 @@ allstamped = \ stamp-std stamp-bits stamp-bits-sup stamp-pstl stamp-c_base stamp-c_compatibility \ stamp-backward stamp-ext stamp-pb stamp-tr1 stamp-tr2 stamp-decimal \ stamp-experimental stamp-experimental-bits stamp-debug stamp-parallel \ - stamp-profile stamp-profile-impl stamp-host + stamp-host # List of all files that are created by explicit building, editing, or # catenation. @@ -1191,16 +1152,6 @@ stamp-parallel: ${parallel_headers} @-cd ${parallel_builddir} && $(LN_S) $? . 2>/dev/null @$(STAMP) stamp-parallel -stamp-profile: ${profile_headers} - @-mkdir -p ${profile_builddir} - @-cd ${profile_builddir} && $(LN_S) $? . 2>/dev/null - @$(STAMP) stamp-profile - -stamp-profile-impl: ${profile_impl_headers} - @-mkdir -p ${profile_impl_builddir} - @-cd ${profile_impl_builddir} && $(LN_S) $? . 2>/dev/null - @$(STAMP) stamp-profile-impl - stamp-${host_alias}: @-mkdir -p ${host_builddir} @-mkdir -p ${host_builddir}/../ext @@ -1498,12 +1449,6 @@ install-headers: $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${parallel_builddir} for file in ${parallel_headers}; do \ $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${parallel_builddir}; done - $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${profile_builddir} - for file in ${profile_headers}; do \ - $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${profile_builddir}; done - $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${profile_impl_builddir} - for file in ${profile_impl_headers}; do \ - $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${profile_impl_builddir}; done $(mkinstalldirs) $(DESTDIR)${host_installdir} for file in ${host_headers} ${bits_host_headers} ${host_headers_extra} \ ${thread_host_headers}; do \ diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in index 31e83eab7ec..04a2dc8a629 100644 --- a/libstdc++-v3/include/Makefile.in +++ b/libstdc++-v3/include/Makefile.in @@ -1257,47 +1257,6 @@ parallel_headers = \ ${parallel_srcdir}/unique_copy.h \ ${parallel_srcdir}/workstealing.h - -# Profile mode headers -profile_srcdir = ${glibcxx_srcdir}/include/profile -profile_builddir = ./profile -profile_headers = \ - ${profile_srcdir}/array \ - ${profile_srcdir}/base.h \ - ${profile_srcdir}/unordered_base.h \ - ${profile_srcdir}/unordered_map \ - ${profile_srcdir}/unordered_set \ - ${profile_srcdir}/vector \ - ${profile_srcdir}/bitset \ - ${profile_srcdir}/deque \ - ${profile_srcdir}/forward_list \ - ${profile_srcdir}/list \ - ${profile_srcdir}/map \ - ${profile_srcdir}/map.h \ - ${profile_srcdir}/multimap.h \ - ${profile_srcdir}/multiset.h \ - ${profile_srcdir}/ordered_base.h \ - ${profile_srcdir}/set \ - ${profile_srcdir}/set.h \ - ${profile_srcdir}/iterator_tracker.h - -profile_impl_srcdir = ${glibcxx_srcdir}/include/profile/impl -profile_impl_builddir = ./profile/impl -profile_impl_headers = \ - ${profile_impl_srcdir}/profiler.h \ - ${profile_impl_srcdir}/profiler_algos.h \ - ${profile_impl_srcdir}/profiler_container_size.h \ - ${profile_impl_srcdir}/profiler_hash_func.h \ - ${profile_impl_srcdir}/profiler_hashtable_size.h \ - ${profile_impl_srcdir}/profiler_map_to_unordered_map.h \ - ${profile_impl_srcdir}/profiler_node.h \ - ${profile_impl_srcdir}/profiler_state.h \ - ${profile_impl_srcdir}/profiler_trace.h \ - ${profile_impl_srcdir}/profiler_vector_size.h \ - ${profile_impl_srcdir}/profiler_vector_to_list.h \ - ${profile_impl_srcdir}/profiler_list_to_vector.h \ - ${profile_impl_srcdir}/profiler_list_to_slist.h - @GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE@c_compatibility_headers_extra = # Some "C" header schemes require the "C" compatibility headers. @@ -1376,7 +1335,7 @@ allstamped = \ stamp-std stamp-bits stamp-bits-sup stamp-pstl stamp-c_base stamp-c_compatibility \ stamp-backward stamp-ext stamp-pb stamp-tr1 stamp-tr2 stamp-decimal \ stamp-experimental stamp-experimental-bits stamp-debug stamp-parallel \ - stamp-profile stamp-profile-impl stamp-host + stamp-host # List of all files that are created by explicit building, editing, or @@ -1694,16 +1653,6 @@ stamp-parallel: ${parallel_headers} @-cd ${parallel_builddir} && $(LN_S) $? . 2>/dev/null @$(STAMP) stamp-parallel -stamp-profile: ${profile_headers} - @-mkdir -p ${profile_builddir} - @-cd ${profile_builddir} && $(LN_S) $? . 2>/dev/null - @$(STAMP) stamp-profile - -stamp-profile-impl: ${profile_impl_headers} - @-mkdir -p ${profile_impl_builddir} - @-cd ${profile_impl_builddir} && $(LN_S) $? . 2>/dev/null - @$(STAMP) stamp-profile-impl - stamp-${host_alias}: @-mkdir -p ${host_builddir} @-mkdir -p ${host_builddir}/../ext @@ -1974,12 +1923,6 @@ install-headers: $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${parallel_builddir} for file in ${parallel_headers}; do \ $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${parallel_builddir}; done - $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${profile_builddir} - for file in ${profile_headers}; do \ - $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${profile_builddir}; done - $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${profile_impl_builddir} - for file in ${profile_impl_headers}; do \ - $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${profile_impl_builddir}; done $(mkinstalldirs) $(DESTDIR)${host_installdir} for file in ${host_headers} ${bits_host_headers} ${host_headers_extra} \ ${thread_host_headers}; do \ diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index ca1557af564..6b7d54ed1f4 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -207,7 +207,6 @@ { namespace __debug { } namespace __parallel { } - namespace __profile { } namespace __cxx1998 { } namespace __detail { @@ -325,9 +324,8 @@ _GLIBCXX_END_NAMESPACE_VERSION # define _GLIBCXX_END_NAMESPACE_VERSION #endif -// Inline namespaces for special modes: debug, parallel, profile. -#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PARALLEL) \ - || defined(_GLIBCXX_PROFILE) +// Inline namespaces for special modes: debug, parallel. +#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PARALLEL) namespace std { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -351,23 +349,12 @@ _GLIBCXX_END_NAMESPACE_VERSION # ifdef _GLIBCXX_PARALLEL inline namespace __parallel { } # endif - - // Inline namespaces for profile mode -# ifdef _GLIBCXX_PROFILE - inline namespace __profile { } -# endif } // Check for invalid usage and unsupported mixed-mode use. # if defined(_GLIBCXX_DEBUG) && defined(_GLIBCXX_PARALLEL) # error illegal use of multiple inlined namespaces # endif -# if defined(_GLIBCXX_PROFILE) && defined(_GLIBCXX_DEBUG) -# error illegal use of multiple inlined namespaces -# endif -# if defined(_GLIBCXX_PROFILE) && defined(_GLIBCXX_PARALLEL) -# error illegal use of multiple inlined namespaces -# endif // Check for invalid use due to lack for weak symbols. # if __NO_INLINE__ && !__GXX_WEAK__ @@ -386,7 +373,7 @@ _GLIBCXX_END_NAMESPACE_VERSION // _GLIBCXX_END_NAMESPACE_ALGO // _GLIBCXX_BEGIN_NAMESPACE_CONTAINER // _GLIBCXX_END_NAMESPACE_CONTAINER -#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PROFILE) +#if defined(_GLIBCXX_DEBUG) # define _GLIBCXX_STD_C __cxx1998 # define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER \ namespace _GLIBCXX_STD_C { diff --git a/libstdc++-v3/include/profile/array b/libstdc++-v3/include/profile/array deleted file mode 100644 index 8f80e2a067f..00000000000 --- a/libstdc++-v3/include/profile/array +++ /dev/null @@ -1,281 +0,0 @@ -// Profile array implementation -*- C++ -*- - -// Copyright (C) 2012-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file profile/array - * This is a Standard C++ Library header. - */ - -#ifndef _GLIBCXX_PROFILE_ARRAY -#define _GLIBCXX_PROFILE_ARRAY 1 - -#pragma GCC system_header - -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - template - struct array - { - typedef _Tp value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef value_type* iterator; - typedef const value_type* const_iterator; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - // Support for zero-sized arrays mandatory. - typedef _GLIBCXX_STD_C::__array_traits<_Tp, _Nm> _AT_Type; - typename _AT_Type::_Type _M_elems; - - // No explicit construct/copy/destroy for aggregate type. - - // DR 776. - void - fill(const value_type& __u) - { std::fill_n(begin(), size(), __u); } - - void - swap(array& __other) - noexcept(_AT_Type::_Is_nothrow_swappable::value) - { std::swap_ranges(begin(), end(), __other.begin()); } - - // Iterators. - _GLIBCXX17_CONSTEXPR iterator - begin() noexcept - { return iterator(data()); } - - _GLIBCXX17_CONSTEXPR const_iterator - begin() const noexcept - { return const_iterator(data()); } - - _GLIBCXX17_CONSTEXPR iterator - end() noexcept - { return iterator(data() + _Nm); } - - _GLIBCXX17_CONSTEXPR const_iterator - end() const noexcept - { return const_iterator(data() + _Nm); } - - _GLIBCXX17_CONSTEXPR reverse_iterator - rbegin() noexcept - { return reverse_iterator(end()); } - - _GLIBCXX17_CONSTEXPR const_reverse_iterator - rbegin() const noexcept - { return const_reverse_iterator(end()); } - - _GLIBCXX17_CONSTEXPR reverse_iterator - rend() noexcept - { return reverse_iterator(begin()); } - - _GLIBCXX17_CONSTEXPR const_reverse_iterator - rend() const noexcept - { return const_reverse_iterator(begin()); } - - _GLIBCXX17_CONSTEXPR const_iterator - cbegin() const noexcept - { return const_iterator(data()); } - - _GLIBCXX17_CONSTEXPR const_iterator - cend() const noexcept - { return const_iterator(data() + _Nm); } - - _GLIBCXX17_CONSTEXPR const_reverse_iterator - crbegin() const noexcept - { return const_reverse_iterator(end()); } - - _GLIBCXX17_CONSTEXPR const_reverse_iterator - crend() const noexcept - { return const_reverse_iterator(begin()); } - - // Capacity. - constexpr size_type - size() const noexcept { return _Nm; } - - constexpr size_type - max_size() const noexcept { return _Nm; } - - _GLIBCXX_NODISCARD constexpr bool - empty() const noexcept { return size() == 0; } - - // Element access. - reference - operator[](size_type __n) noexcept - { return _AT_Type::_S_ref(_M_elems, __n); } - - constexpr const_reference - operator[](size_type __n) const noexcept - { return _AT_Type::_S_ref(_M_elems, __n); } - - _GLIBCXX17_CONSTEXPR reference - at(size_type __n) - { - if (__n >= _Nm) - std::__throw_out_of_range_fmt(__N("array::at: __n " - "(which is %zu) >= _Nm " - "(which is %zu)"), - __n, _Nm); - return _AT_Type::_S_ref(_M_elems, __n); - } - - constexpr const_reference - at(size_type __n) const - { - // Result of conditional expression must be an lvalue so use - // boolean ? lvalue : (throw-expr, lvalue) - return __n < _Nm ? _AT_Type::_S_ref(_M_elems, __n) - : (std::__throw_out_of_range_fmt(__N("array::at: __n (which is %zu) " - ">= _Nm (which is %zu)"), - __n, _Nm), - _AT_Type::_S_ref(_M_elems, 0)); - } - - _GLIBCXX17_CONSTEXPR reference - front() noexcept - { return *begin(); } - - constexpr const_reference - front() const noexcept - { return _AT_Type::_S_ref(_M_elems, 0); } - - _GLIBCXX17_CONSTEXPR reference - back() noexcept - { return _Nm ? *(end() - 1) : *end(); } - - constexpr const_reference - back() const noexcept - { - return _Nm ? _AT_Type::_S_ref(_M_elems, _Nm - 1) - : _AT_Type::_S_ref(_M_elems, 0); - } - - _GLIBCXX17_CONSTEXPR pointer - data() noexcept - { return _AT_Type::_S_ptr(_M_elems); } - - _GLIBCXX17_CONSTEXPR const_pointer - data() const noexcept - { return _AT_Type::_S_ptr(_M_elems); } - }; - - // Array comparisons. - template - inline bool - operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return std::equal(__one.begin(), __one.end(), __two.begin()); } - - template - inline bool - operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return !(__one == __two); } - - template - inline bool - operator<(const array<_Tp, _Nm>& __a, const array<_Tp, _Nm>& __b) - { - return std::lexicographical_compare(__a.begin(), __a.end(), - __b.begin(), __b.end()); - } - - template - inline bool - operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return __two < __one; } - - template - inline bool - operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return !(__one > __two); } - - template - inline bool - operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return !(__one < __two); } - - // Specialized algorithms. - template - inline void - swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two) - noexcept(noexcept(__one.swap(__two))) - { __one.swap(__two); } - - template - constexpr _Tp& - get(array<_Tp, _Nm>& __arr) noexcept - { - static_assert(_Int < _Nm, "index is out of bounds"); - return _GLIBCXX_STD_C::__array_traits<_Tp, _Nm>:: - _S_ref(__arr._M_elems, _Int); - } - - template - constexpr _Tp&& - get(array<_Tp, _Nm>&& __arr) noexcept - { - static_assert(_Int < _Nm, "index is out of bounds"); - return std::move(__profile::get<_Int>(__arr)); - } - - template - constexpr const _Tp& - get(const array<_Tp, _Nm>& __arr) noexcept - { - static_assert(_Int < _Nm, "index is out of bounds"); - return _GLIBCXX_STD_C::__array_traits<_Tp, _Nm>:: - _S_ref(__arr._M_elems, _Int); - } -} // namespace __profile - -_GLIBCXX_BEGIN_NAMESPACE_VERSION - // Tuple interface to class template array. - - /// tuple_size - template - struct tuple_size> - : public integral_constant { }; - - /// tuple_element - template - struct tuple_element<_Int, std::__profile::array<_Tp, _Nm>> - { - static_assert(_Int < _Nm, "index is out of bounds"); - typedef _Tp type; - }; - - template - struct __is_tuple_like_impl> : true_type - { }; - -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace std - -#endif // _GLIBCXX_PROFILE_ARRAY diff --git a/libstdc++-v3/include/profile/base.h b/libstdc++-v3/include/profile/base.h deleted file mode 100644 index 692db3fae35..00000000000 --- a/libstdc++-v3/include/profile/base.h +++ /dev/null @@ -1,58 +0,0 @@ -// -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/base.h - * @brief Sequential helper functions. - * This file is a GNU profile extension to the Standard C++ Library. - */ - -// Written by Lixia Liu - -#ifndef _GLIBCXX_PROFILE_BASE_H -#define _GLIBCXX_PROFILE_BASE_H 1 - -#include - -// Profiling mode namespaces. - -/** - * @namespace std::__profile - * @brief GNU profile code, replaces standard behavior with profile behavior. - */ -namespace std _GLIBCXX_VISIBILITY(default) -{ - namespace __profile { } -} - -/** - * @namespace __gnu_profile - * @brief GNU profile code for public use. - */ -namespace __gnu_profile -{ - // Import all the profile versions of components in namespace std. - using namespace std::__profile; -} - - -#endif /* _GLIBCXX_PROFILE_BASE_H */ diff --git a/libstdc++-v3/include/profile/bitset b/libstdc++-v3/include/profile/bitset deleted file mode 100644 index 5887707b660..00000000000 --- a/libstdc++-v3/include/profile/bitset +++ /dev/null @@ -1,245 +0,0 @@ -// Profiling bitset implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file profile/bitset - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_BITSET -#define _GLIBCXX_PROFILE_BITSET - -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - /// Class std::bitset wrapper with performance instrumentation, none at the - /// moment. - template - class bitset - : public _GLIBCXX_STD_C::bitset<_Nb> - { - typedef _GLIBCXX_STD_C::bitset<_Nb> _Base; - - public: - // 23.3.5.1 constructors: -#if __cplusplus < 201103L - bitset() - : _Base() { } -#else - constexpr bitset() = default; -#endif - -#if __cplusplus >= 201103L - constexpr bitset(unsigned long long __val) noexcept -#else - bitset(unsigned long __val) -#endif - : _Base(__val) { } - - template - explicit - bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str, - typename std::basic_string<_CharT, _Traits, _Alloc>::size_type - __pos = 0, - typename std::basic_string<_CharT, _Traits, _Alloc>::size_type - __n = (std::basic_string<_CharT, _Traits, _Alloc>::npos)) - : _Base(__str, __pos, __n) { } - - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 396. what are characters zero and one. - template - bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str, - typename std::basic_string<_CharT, _Traits, _Alloc>::size_type - __pos, - typename std::basic_string<_CharT, _Traits, _Alloc>::size_type - __n, - _CharT __zero, _CharT __one = _CharT('1')) - : _Base(__str, __pos, __n, __zero, __one) { } - - bitset(const _Base& __x) : _Base(__x) { } - -#if __cplusplus >= 201103L - template - explicit - bitset(const _CharT* __str, - typename std::basic_string<_CharT>::size_type __n - = std::basic_string<_CharT>::npos, - _CharT __zero = _CharT('0'), _CharT __one = _CharT('1')) - : _Base(__str, __n, __zero, __one) { } -#endif - - // 23.3.5.2 bitset operations: - bitset<_Nb>& - operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT - { - _M_base() &= __rhs; - return *this; - } - - bitset<_Nb>& - operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT - { - _M_base() |= __rhs; - return *this; - } - - bitset<_Nb>& - operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT - { - _M_base() ^= __rhs; - return *this; - } - - bitset<_Nb>& - operator<<=(size_t __pos) _GLIBCXX_NOEXCEPT - { - _M_base() <<= __pos; - return *this; - } - - bitset<_Nb>& - operator>>=(size_t __pos) _GLIBCXX_NOEXCEPT - { - _M_base() >>= __pos; - return *this; - } - - bitset<_Nb>& - set() _GLIBCXX_NOEXCEPT - { - _Base::set(); - return *this; - } - - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 186. bitset::set() second parameter should be bool - bitset<_Nb>& - set(size_t __pos, bool __val = true) - { - _Base::set(__pos, __val); - return *this; - } - - bitset<_Nb>& - reset() _GLIBCXX_NOEXCEPT - { - _Base::reset(); - return *this; - } - - bitset<_Nb>& - reset(size_t __pos) - { - _Base::reset(__pos); - return *this; - } - - bitset<_Nb> - operator~() const _GLIBCXX_NOEXCEPT - { return bitset(~_M_base()); } - - bitset<_Nb>& - flip() _GLIBCXX_NOEXCEPT - { - _Base::flip(); - return *this; - } - - bitset<_Nb>& - flip(size_t __pos) - { - _Base::flip(__pos); - return *this; - } - - bool - operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT - { return _M_base() == __rhs; } - - bool - operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT - { return _M_base() != __rhs; } - - bitset<_Nb> - operator<<(size_t __pos) const _GLIBCXX_NOEXCEPT - { return bitset<_Nb>(_M_base() << __pos); } - - bitset<_Nb> - operator>>(size_t __pos) const _GLIBCXX_NOEXCEPT - { return bitset<_Nb>(_M_base() >> __pos); } - - _Base& - _M_base() _GLIBCXX_NOEXCEPT - { return *this; } - - const _Base& - _M_base() const _GLIBCXX_NOEXCEPT - { return *this; } - }; - - template - bitset<_Nb> - operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT - { return bitset<_Nb>(__x) &= __y; } - - template - bitset<_Nb> - operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT - { return bitset<_Nb>(__x) |= __y; } - - template - bitset<_Nb> - operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT - { return bitset<_Nb>(__x) ^= __y; } - - template - std::basic_istream<_CharT, _Traits>& - operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x) - { return __is >> __x._M_base(); } - - template - std::basic_ostream<_CharT, _Traits>& - operator<<(std::basic_ostream<_CharT, _Traits>& __os, - const bitset<_Nb>& __x) - { return __os << __x._M_base(); } -} // namespace __profile - -#if __cplusplus >= 201103L - // DR 1182. - /// std::hash specialization for bitset. - template - struct hash<__profile::bitset<_Nb>> - : public __hash_base> - { - size_t - operator()(const __profile::bitset<_Nb>& __b) const noexcept - { return std::hash<_GLIBCXX_STD_C::bitset<_Nb>>()(__b._M_base()); } - }; -#endif - -} // namespace std - -#endif diff --git a/libstdc++-v3/include/profile/deque b/libstdc++-v3/include/profile/deque deleted file mode 100644 index 4fd526a824d..00000000000 --- a/libstdc++-v3/include/profile/deque +++ /dev/null @@ -1,188 +0,0 @@ -// Profiling deque implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file profile/deque - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_DEQUE -#define _GLIBCXX_PROFILE_DEQUE 1 - -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - /// Class std::deque wrapper with performance instrumentation. - template > - class deque - : public _GLIBCXX_STD_C::deque<_Tp, _Allocator> - { - typedef _GLIBCXX_STD_C::deque<_Tp, _Allocator> _Base; - - public: - typedef typename _Base::size_type size_type; - typedef typename _Base::value_type value_type; - - // 23.2.1.1 construct/copy/destroy: - -#if __cplusplus < 201103L - deque() - : _Base() { } - deque(const deque& __x) - : _Base(__x) { } - - ~deque() { } -#else - deque() = default; - deque(const deque&) = default; - deque(deque&&) = default; - - deque(const deque& __d, const _Allocator& __a) - : _Base(__d, __a) { } - - deque(deque&& __d, const _Allocator& __a) - : _Base(std::move(__d), __a) { } - - ~deque() = default; - - deque(initializer_list __l, - const _Allocator& __a = _Allocator()) - : _Base(__l, __a) { } -#endif - - explicit - deque(const _Allocator& __a) - : _Base(__a) { } - -#if __cplusplus >= 201103L - explicit - deque(size_type __n, const _Allocator& __a = _Allocator()) - : _Base(__n, __a) { } - - deque(size_type __n, const _Tp& __value, - const _Allocator& __a = _Allocator()) - : _Base(__n, __value, __a) { } -#else - explicit - deque(size_type __n, const _Tp& __value = _Tp(), - const _Allocator& __a = _Allocator()) - : _Base(__n, __value, __a) { } -#endif - -#if __cplusplus >= 201103L - template> -#else - template -#endif - deque(_InputIterator __first, _InputIterator __last, - const _Allocator& __a = _Allocator()) - : _Base(__first, __last, __a) - { } - - deque(const _Base& __x) - : _Base(__x) { } - -#if __cplusplus < 201103L - deque& - operator=(const deque& __x) - { - _M_base() = __x; - return *this; - } -#else - deque& - operator=(const deque&) = default; - - deque& - operator=(deque&&) = default; - - deque& - operator=(initializer_list __l) - { - _M_base() = __l; - return *this; - } -#endif - - void - swap(deque& __x) - _GLIBCXX_NOEXCEPT_IF( noexcept(declval<_Base&>().swap(__x)) ) - { _Base::swap(__x); } - - _Base& - _M_base() _GLIBCXX_NOEXCEPT { return *this; } - - const _Base& - _M_base() const _GLIBCXX_NOEXCEPT { return *this; } - }; - - template - inline bool - operator==(const deque<_Tp, _Alloc>& __lhs, - const deque<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() == __rhs._M_base(); } - - template - inline bool - operator!=(const deque<_Tp, _Alloc>& __lhs, - const deque<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() != __rhs._M_base(); } - - template - inline bool - operator<(const deque<_Tp, _Alloc>& __lhs, - const deque<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() < __rhs._M_base(); } - - template - inline bool - operator<=(const deque<_Tp, _Alloc>& __lhs, - const deque<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() <= __rhs._M_base(); } - - template - inline bool - operator>=(const deque<_Tp, _Alloc>& __lhs, - const deque<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() >= __rhs._M_base(); } - - template - inline bool - operator>(const deque<_Tp, _Alloc>& __lhs, - const deque<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() > __rhs._M_base(); } - - template - inline void - swap(deque<_Tp, _Alloc>& __lhs, deque<_Tp, _Alloc>& __rhs) - _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs))) - { __lhs.swap(__rhs); } - -} // namespace __profile -} // namespace std - -#endif diff --git a/libstdc++-v3/include/profile/forward_list b/libstdc++-v3/include/profile/forward_list deleted file mode 100644 index 6ac33bead84..00000000000 --- a/libstdc++-v3/include/profile/forward_list +++ /dev/null @@ -1,219 +0,0 @@ -// -*- C++ -*- - -// Copyright (C) 2010-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file profile/forward_list - * This file is a GNU debug extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_FORWARD_LIST -#define _GLIBCXX_PROFILE_FORWARD_LIST 1 - -#if __cplusplus < 201103L -# include -#else - -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - /// Class std::forward_list wrapper with performance instrumentation. - template > - class forward_list - : public _GLIBCXX_STD_C::forward_list<_Tp, _Alloc> - { - typedef _GLIBCXX_STD_C::forward_list<_Tp, _Alloc> _Base; - - public: - typedef typename _Base::size_type size_type; - typedef typename _Base::const_iterator const_iterator; - - // 23.2.3.1 construct/copy/destroy: - - forward_list() = default; - - explicit - forward_list(const _Alloc& __al) noexcept - : _Base(__al) { } - - forward_list(const forward_list& __list, const _Alloc& __al) - : _Base(__list, __al) - { } - - forward_list(forward_list&& __list, const _Alloc& __al) - : _Base(std::move(__list), __al) - { } - - explicit - forward_list(size_type __n, const _Alloc& __al = _Alloc()) - : _Base(__n, __al) - { } - - forward_list(size_type __n, const _Tp& __value, - const _Alloc& __al = _Alloc()) - : _Base(__n, __value, __al) - { } - - template> - forward_list(_InputIterator __first, _InputIterator __last, - const _Alloc& __al = _Alloc()) - : _Base(__first, __last, __al) - { } - - forward_list(const forward_list&) = default; - forward_list(forward_list&&) = default; - - forward_list(std::initializer_list<_Tp> __il, - const _Alloc& __al = _Alloc()) - : _Base(__il, __al) - { } - - ~forward_list() = default; - - forward_list& - operator=(const forward_list&) = default; - - forward_list& - operator=(forward_list&&) = default; - - forward_list& - operator=(std::initializer_list<_Tp> __il) - { - _M_base() = __il; - return *this; - } - - void - swap(forward_list& __fl) - noexcept( noexcept(declval<_Base&>().swap(__fl)) ) - { _Base::swap(__fl); } - - void - splice_after(const_iterator __pos, forward_list&& __fl) - { _Base::splice_after(__pos, std::move(__fl)); } - - void - splice_after(const_iterator __pos, forward_list& __list) - { _Base::splice_after(__pos, __list); } - - void - splice_after(const_iterator __pos, forward_list&& __list, - const_iterator __i) - { _Base::splice_after(__pos, std::move(__list), __i); } - - void - splice_after(const_iterator __pos, forward_list& __list, - const_iterator __i) - { _Base::splice_after(__pos, __list, __i); } - - void - splice_after(const_iterator __pos, forward_list&& __list, - const_iterator __before, const_iterator __last) - { _Base::splice_after(__pos, std::move(__list), __before, __last); } - - void - splice_after(const_iterator __pos, forward_list& __list, - const_iterator __before, const_iterator __last) - { _Base::splice_after(__pos, __list, __before, __last); } - - void - merge(forward_list&& __list) - { _Base::merge(std::move(__list)); } - - void - merge(forward_list& __list) - { _Base::merge(__list); } - - template - void - merge(forward_list&& __list, _Comp __comp) - { _Base::merge(std::move(__list), __comp); } - - template - void - merge(forward_list& __list, _Comp __comp) - { _Base::merge(__list, __comp); } - - _Base& - _M_base() noexcept { return *this; } - - const _Base& - _M_base() const noexcept { return *this; } - }; - - template - inline bool - operator==(const forward_list<_Tp, _Alloc>& __lx, - const forward_list<_Tp, _Alloc>& __ly) - { return __lx._M_base() == __ly._M_base(); } - - template - inline bool - operator<(const forward_list<_Tp, _Alloc>& __lx, - const forward_list<_Tp, _Alloc>& __ly) - { return __lx._M_base() < __ly._M_base(); } - - template - inline bool - operator!=(const forward_list<_Tp, _Alloc>& __lx, - const forward_list<_Tp, _Alloc>& __ly) - { return !(__lx == __ly); } - - /// Based on operator< - template - inline bool - operator>(const forward_list<_Tp, _Alloc>& __lx, - const forward_list<_Tp, _Alloc>& __ly) - { return (__ly < __lx); } - - /// Based on operator< - template - inline bool - operator>=(const forward_list<_Tp, _Alloc>& __lx, - const forward_list<_Tp, _Alloc>& __ly) - { return !(__lx < __ly); } - - /// Based on operator< - template - inline bool - operator<=(const forward_list<_Tp, _Alloc>& __lx, - const forward_list<_Tp, _Alloc>& __ly) - { return !(__ly < __lx); } - - /// See std::forward_list::swap(). - template - inline void - swap(forward_list<_Tp, _Alloc>& __lx, - forward_list<_Tp, _Alloc>& __ly) - noexcept(noexcept(__lx.swap(__ly))) - { __lx.swap(__ly); } - -} // namespace __profile -} // namespace std - -#endif // C++11 - -#endif diff --git a/libstdc++-v3/include/profile/impl/profiler.h b/libstdc++-v3/include/profile/impl/profiler.h deleted file mode 100644 index 6d4e0644422..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler.h +++ /dev/null @@ -1,370 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler.h - * @brief Interface of the profiling runtime library. - */ - -// Written by Lixia Liu and Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_H -#define _GLIBCXX_PROFILE_PROFILER_H 1 - -#include - -// Mechanism to define data with inline linkage. -#define _GLIBCXX_PROFILE_DEFINE_UNINIT_DATA(__type, __name) \ - inline __type& \ - __get_##__name() \ - { \ - static __type __name; \ - return __name; \ - } -#define _GLIBCXX_PROFILE_DEFINE_DATA(__type, __name, __initial_value...) \ - inline __type& __get_##__name() { \ - static __type __name(__initial_value); \ - return __name; \ - } -#define _GLIBCXX_PROFILE_DATA(__name) \ - __get_##__name() - -namespace __gnu_profile -{ - /** @brief Reentrance guard. - * - * Mechanism to protect all __gnu_profile operations against recursion, - * multithreaded and exception reentrance. - */ - struct __reentrance_guard - { - static bool - __get_in() - { - if (__inside() == true) - return false; - else - { - __inside() = true; - return true; - } - } - - static bool& - __inside() - { - static __thread bool _S_inside(false); - return _S_inside; - } - - __reentrance_guard() { } - ~__reentrance_guard() { __inside() = false; } - }; - - // Forward declarations of implementation functions. - // Don't use any __gnu_profile:: in user code. - // Instead, use the __profcxx... macros, which offer guarded access. - class __container_size_info; - class __hashfunc_info; - class __map2umap_info; - class __vector2list_info; - class __list2slist_info; - class __list2vector_info; - - bool __turn_on(); - bool __turn_off(); - bool __is_invalid(); - bool __is_on(); - bool __is_off(); - void __report(); - - __container_size_info* - __trace_hashtable_size_construct(std::size_t); - void __trace_hashtable_size_resize(__container_size_info*, - std::size_t, std::size_t); - void __trace_hashtable_size_destruct(__container_size_info*, - std::size_t, std::size_t); - - __hashfunc_info* - __trace_hash_func_construct(); - void __trace_hash_func_destruct(__hashfunc_info*, - std::size_t, std::size_t, std::size_t); - - __container_size_info* - __trace_vector_size_construct(std::size_t); - void __trace_vector_size_resize(__container_size_info*, - std::size_t, std::size_t); - void __trace_vector_size_destruct(__container_size_info*, - std::size_t, std::size_t); - - __vector2list_info* - __trace_vector_to_list_construct(); - void __trace_vector_to_list_insert(__vector2list_info*, - std::size_t, std::size_t); - void __trace_vector_to_list_iterate(__vector2list_info*, int); - void __trace_vector_to_list_invalid_operator(__vector2list_info*); - void __trace_vector_to_list_resize(__vector2list_info*, - std::size_t, std::size_t); - void __trace_vector_to_list_destruct(__vector2list_info*); - - __list2slist_info* - __trace_list_to_slist_construct(); - void __trace_list_to_slist_rewind(__list2slist_info*); - void __trace_list_to_slist_operation(__list2slist_info*); - void __trace_list_to_slist_destruct(__list2slist_info*); - - __list2vector_info* - __trace_list_to_vector_construct(); - void __trace_list_to_vector_insert(__list2vector_info*, - std::size_t, std::size_t); - void __trace_list_to_vector_iterate(__list2vector_info*, int); - void __trace_list_to_vector_invalid_operator(__list2vector_info*); - void __trace_list_to_vector_resize(__list2vector_info*, - std::size_t, std::size_t); - void __trace_list_to_vector_destruct(__list2vector_info*); - - __map2umap_info* - __trace_map_to_unordered_map_construct(); - void __trace_map_to_unordered_map_invalidate(__map2umap_info*); - void __trace_map_to_unordered_map_insert(__map2umap_info*, std::size_t, - std::size_t); - void __trace_map_to_unordered_map_erase(__map2umap_info*, std::size_t, - std::size_t); - void __trace_map_to_unordered_map_iterate(__map2umap_info*, std::size_t); - void __trace_map_to_unordered_map_find(__map2umap_info*, std::size_t); - void __trace_map_to_unordered_map_destruct(__map2umap_info*); -} // namespace __gnu_profile - -// Master switch turns on all diagnostics that are not explicitly turned off. -#ifdef _GLIBCXX_PROFILE -#ifndef _GLIBCXX_PROFILE_NO_HASHTABLE_TOO_SMALL -#define _GLIBCXX_PROFILE_HASHTABLE_TOO_SMALL -#endif -#ifndef _GLIBCXX_PROFILE_NO_HASHTABLE_TOO_LARGE -#define _GLIBCXX_PROFILE_HASHTABLE_TOO_LARGE -#endif -#ifndef _GLIBCXX_PROFILE_NO_VECTOR_TOO_SMALL -#define _GLIBCXX_PROFILE_VECTOR_TOO_SMALL -#endif -#ifndef _GLIBCXX_PROFILE_NO_VECTOR_TOO_LARGE -#define _GLIBCXX_PROFILE_VECTOR_TOO_LARGE -#endif -#ifndef _GLIBCXX_PROFILE_NO_INEFFICIENT_HASH -#define _GLIBCXX_PROFILE_INEFFICIENT_HASH -#endif -#ifndef _GLIBCXX_PROFILE_NO_VECTOR_TO_LIST -#define _GLIBCXX_PROFILE_VECTOR_TO_LIST -#endif -#ifndef _GLIBCXX_PROFILE_NO_LIST_TO_SLIST -#define _GLIBCXX_PROFILE_LIST_TO_SLIST -#endif -#ifndef _GLIBCXX_PROFILE_NO_LIST_TO_VECTOR -#define _GLIBCXX_PROFILE_LIST_TO_VECTOR -#endif -#ifndef _GLIBCXX_PROFILE_NO_MAP_TO_UNORDERED_MAP -#define _GLIBCXX_PROFILE_MAP_TO_UNORDERED_MAP -#endif -#endif - -// Expose global management routines to user code. -#ifdef _GLIBCXX_PROFILE -#define __profcxx_report() __gnu_profile::__report() -#define __profcxx_turn_on() __gnu_profile::__turn_on() -#define __profcxx_turn_off() __gnu_profile::__turn_off() -#define __profcxx_is_invalid() __gnu_profile::__is_invalid() -#define __profcxx_is_on() __gnu_profile::__is_on() -#define __profcxx_is_off() __gnu_profile::__is_off() -#else -#define __profcxx_report() -#define __profcxx_turn_on() -#define __profcxx_turn_off() -#define __profcxx_is_invalid() -#define __profcxx_is_on() -#define __profcxx_is_off() -#endif - -// Turn on/off instrumentation for HASHTABLE_TOO_SMALL and HASHTABLE_TOO_LARGE. -#if (defined(_GLIBCXX_PROFILE_HASHTABLE_TOO_SMALL) \ - || defined(_GLIBCXX_PROFILE_HASHTABLE_TOO_LARGE)) -#define __profcxx_hashtable_size_construct(__x...) \ - __gnu_profile::__trace_hashtable_size_construct(__x) -#define __profcxx_hashtable_size_resize(__x...) \ - __gnu_profile::__trace_hashtable_size_resize(__x) -#define __profcxx_hashtable_size_destruct(__x...) \ - __gnu_profile::__trace_hashtable_size_destruct(__x) -#else -#define __profcxx_hashtable_size_construct(__x...) 0 -#define __profcxx_hashtable_size_resize(__x...) -#define __profcxx_hashtable_size_destruct(__x...) -#endif - -// Turn on/off instrumentation for VECTOR_TOO_SMALL and VECTOR_TOO_LARGE. -#if (defined(_GLIBCXX_PROFILE_VECTOR_TOO_SMALL) \ - || defined(_GLIBCXX_PROFILE_VECTOR_TOO_LARGE)) -#define __profcxx_vector_size_construct(__x...) \ - __gnu_profile::__trace_vector_size_construct(__x) -#define __profcxx_vector_size_resize(__x...) \ - __gnu_profile::__trace_vector_size_resize(__x) -#define __profcxx_vector_size_destruct(__x...) \ - __gnu_profile::__trace_vector_size_destruct(__x) -#else -#define __profcxx_vector_size_construct(__x...) 0 -#define __profcxx_vector_size_resize(__x...) -#define __profcxx_vector_size_destruct(__x...) -#endif - -// Turn on/off instrumentation for INEFFICIENT_HASH. -#if defined(_GLIBCXX_PROFILE_INEFFICIENT_HASH) -#define __profcxx_hash_func_construct(__x...) \ - __gnu_profile::__trace_hash_func_construct(__x) -#define __profcxx_hash_func_destruct(__x...) \ - __gnu_profile::__trace_hash_func_destruct(__x) -#else -#define __profcxx_hash_func_construct(__x...) 0 -#define __profcxx_hash_func_destruct(__x...) -#endif - -// Turn on/off instrumentation for VECTOR_TO_LIST. -#if defined(_GLIBCXX_PROFILE_VECTOR_TO_LIST) -#define __profcxx_vector2list_construct(__x...) \ - __gnu_profile::__trace_vector_to_list_construct(__x) -#define __profcxx_vector2list_insert(__x...) \ - __gnu_profile::__trace_vector_to_list_insert(__x) -#define __profcxx_vector2list_iterate(__x...) \ - __gnu_profile::__trace_vector_to_list_iterate(__x) -#define __profcxx_vector2list_invalid_operator(__x...) \ - __gnu_profile::__trace_vector_to_list_invalid_operator(__x) -#define __profcxx_vector2list_resize(__x...) \ - __gnu_profile::__trace_vector_to_list_resize(__x) -#define __profcxx_vector2list_destruct(__x...) \ - __gnu_profile::__trace_vector_to_list_destruct(__x) -#else -#define __profcxx_vector2list_construct(__x...) 0 -#define __profcxx_vector2list_insert(__x...) -#define __profcxx_vector2list_iterate(__x...) -#define __profcxx_vector2list_invalid_operator(__x...) -#define __profcxx_vector2list_resize(__x...) -#define __profcxx_vector2list_destruct(__x...) -#endif - -// Turn on/off instrumentation for LIST_TO_VECTOR. -#if defined(_GLIBCXX_PROFILE_LIST_TO_VECTOR) -#define __profcxx_list2vector_construct(__x...) \ - __gnu_profile::__trace_list_to_vector_construct(__x) -#define __profcxx_list2vector_insert(__x...) \ - __gnu_profile::__trace_list_to_vector_insert(__x) -#define __profcxx_list2vector_iterate(__x...) \ - __gnu_profile::__trace_list_to_vector_iterate(__x) -#define __profcxx_list2vector_invalid_operator(__x...) \ - __gnu_profile::__trace_list_to_vector_invalid_operator(__x) -#define __profcxx_list2vector_destruct(__x...) \ - __gnu_profile::__trace_list_to_vector_destruct(__x) -#else -#define __profcxx_list2vector_construct(__x...) 0 -#define __profcxx_list2vector_insert(__x...) -#define __profcxx_list2vector_iterate(__x...) -#define __profcxx_list2vector_invalid_operator(__x...) -#define __profcxx_list2vector_destruct(__x...) -#endif - -// Turn on/off instrumentation for LIST_TO_SLIST. -#if defined(_GLIBCXX_PROFILE_LIST_TO_SLIST) -#define __profcxx_list2slist_construct(__x...) \ - __gnu_profile::__trace_list_to_slist_construct(__x) -#define __profcxx_list2slist_rewind(__x...) \ - __gnu_profile::__trace_list_to_slist_rewind(__x) -#define __profcxx_list2slist_operation(__x...) \ - __gnu_profile::__trace_list_to_slist_operation(__x) -#define __profcxx_list2slist_destruct(__x...) \ - __gnu_profile::__trace_list_to_slist_destruct(__x) -#else -#define __profcxx_list2slist_construct(__x...) 0 -#define __profcxx_list2slist_rewind(__x...) -#define __profcxx_list2slist_operation(__x...) -#define __profcxx_list2slist_destruct(__x...) -#endif - -// Turn on/off instrumentation for MAP_TO_UNORDERED_MAP. -#if defined(_GLIBCXX_PROFILE_MAP_TO_UNORDERED_MAP) -#define __profcxx_map2umap_construct(__x...) \ - __gnu_profile::__trace_map_to_unordered_map_construct(__x) -#define __profcxx_map2umap_insert(__x...) \ - __gnu_profile::__trace_map_to_unordered_map_insert(__x) -#define __profcxx_map2umap_erase(__x...) \ - __gnu_profile::__trace_map_to_unordered_map_erase(__x) -#define __profcxx_map2umap_iterate(__x...) \ - __gnu_profile::__trace_map_to_unordered_map_iterate(__x) -#define __profcxx_map2umap_invalidate(__x...) \ - __gnu_profile::__trace_map_to_unordered_map_invalidate(__x) -#define __profcxx_map2umap_find(__x...) \ - __gnu_profile::__trace_map_to_unordered_map_find(__x) -#define __profcxx_map2umap_destruct(__x...) \ - __gnu_profile::__trace_map_to_unordered_map_destruct(__x) -#else -#define __profcxx_map2umap_construct(__x...) 0 -#define __profcxx_map2umap_insert(__x...) -#define __profcxx_map2umap_erase(__x...) -#define __profcxx_map2umap_iterate(__x...) -#define __profcxx_map2umap_invalidate(__x...) -#define __profcxx_map2umap_find(__x...) -#define __profcxx_map2umap_destruct(__x...) -#endif - -// Set default values for compile-time customizable variables. -#ifndef _GLIBCXX_PROFILE_TRACE_PATH_ROOT -#define _GLIBCXX_PROFILE_TRACE_PATH_ROOT "libstdcxx-profile" -#endif -#ifndef _GLIBCXX_PROFILE_TRACE_ENV_VAR -#define _GLIBCXX_PROFILE_TRACE_ENV_VAR "_GLIBCXX_PROFILE_TRACE_PATH_ROOT" -#endif -#ifndef _GLIBCXX_PROFILE_MAX_WARN_COUNT_ENV_VAR -#define _GLIBCXX_PROFILE_MAX_WARN_COUNT_ENV_VAR \ - "_GLIBCXX_PROFILE_MAX_WARN_COUNT" -#endif -#ifndef _GLIBCXX_PROFILE_MAX_WARN_COUNT -#define _GLIBCXX_PROFILE_MAX_WARN_COUNT 10 -#endif -#ifndef _GLIBCXX_PROFILE_MAX_STACK_DEPTH -#define _GLIBCXX_PROFILE_MAX_STACK_DEPTH 32 -#endif -#ifndef _GLIBCXX_PROFILE_MAX_STACK_DEPTH_ENV_VAR -#define _GLIBCXX_PROFILE_MAX_STACK_DEPTH_ENV_VAR \ - "_GLIBCXX_PROFILE_MAX_STACK_DEPTH" -#endif -#ifndef _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC -#define _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC (1 << 28) -#endif -#ifndef _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC_ENV_VAR -#define _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC_ENV_VAR \ - "_GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC" -#endif - -// Instrumentation hook implementations. -#include "profile/impl/profiler_hash_func.h" -#include "profile/impl/profiler_hashtable_size.h" -#include "profile/impl/profiler_map_to_unordered_map.h" -#include "profile/impl/profiler_vector_size.h" -#include "profile/impl/profiler_vector_to_list.h" -#include "profile/impl/profiler_list_to_slist.h" -#include "profile/impl/profiler_list_to_vector.h" - -#endif // _GLIBCXX_PROFILE_PROFILER_H diff --git a/libstdc++-v3/include/profile/impl/profiler_algos.h b/libstdc++-v3/include/profile/impl/profiler_algos.h deleted file mode 100644 index 839d7476197..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_algos.h +++ /dev/null @@ -1,111 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2010-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_algos.h - * @brief Algorithms used by the profile extension. - * - * This file is needed to avoid including \ or \. - * Including those files would result in recursive includes. - * These implementations are oversimplified. In general, efficiency may be - * sacrificed to minimize maintenance overhead. - */ - -#ifndef _GLIBCXX_PROFILE_PROFILER_ALGOS_H -#define _GLIBCXX_PROFILE_PROFILER_ALGOS_H 1 - -namespace __gnu_profile -{ - /* Helper for __top_n. Insert in sorted vector, but not beyond Nth elem. */ - template - void - __insert_top_n(_Container& __output, - const typename _Container::value_type& __value, - typename _Container::size_type __n) - { - typename _Container::iterator __it = __output.begin(); - typename _Container::size_type __count = 0; - - // Skip up to N - 1 elements larger than VALUE. - // XXX: Could do binary search for random iterators. - while (true) - { - if (__count >= __n) - // VALUE is not in top N. - return; - - if (__it == __output.end()) - break; - - if (*__it < __value) - break; - - ++__it; - ++__count; - } - - __output.insert(__it, __value); - } - - /* Copy the top N elements in INPUT, sorted in reverse order, to OUTPUT. */ - template - void - __top_n(const _Container& __input, _Container& __output, - typename _Container::size_type __n) - { - __output.clear(); - typename _Container::const_iterator __it; - for (__it = __input.begin(); __it != __input.end(); ++__it) - __insert_top_n(__output, *__it, __n); - } - - /* Simplified clone of std::for_each. */ - template - _Function - __for_each(_InputIterator __first, _InputIterator __last, _Function __f) - { - for (; __first != __last; ++__first) - __f(*__first); - return __f; - } - - /* Simplified clone of std::remove. */ - template - _ForwardIterator - __remove(_ForwardIterator __first, _ForwardIterator __last, - const _Tp& __value) - { - if(__first == __last) - return __first; - _ForwardIterator __result = __first; - ++__first; - for(; __first != __last; ++__first) - if(!(*__first == __value)) - { - *__result = *__first; - ++__result; - } - return __result; - } -} // namespace __gnu_profile - -#endif /* _GLIBCXX_PROFILE_PROFILER_ALGOS_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_container_size.h b/libstdc++-v3/include/profile/impl/profiler_container_size.h deleted file mode 100644 index 1fabdc4ee7f..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_container_size.h +++ /dev/null @@ -1,186 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_container_size.h - * @brief Diagnostics for container sizes. - */ - -// Written by Lixia Liu and Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_CONTAINER_SIZE_H -#define _GLIBCXX_PROFILE_PROFILER_CONTAINER_SIZE_H 1 - -#include - -#include "profile/impl/profiler.h" -#include "profile/impl/profiler_node.h" -#include "profile/impl/profiler_trace.h" - -namespace __gnu_profile -{ - /** @brief A container size instrumentation line in the object table. */ - class __container_size_info - : public __object_info_base - { - public: - __container_size_info(__stack_t __stack) - : __object_info_base(__stack), _M_init(0), _M_max(0), - _M_min(0), _M_total(0), _M_item_min(0), _M_item_max(0), - _M_item_total(0), _M_count(0), _M_resize(0), _M_cost(0) - { } - - void - __write(FILE* __f) const - { - std::fprintf(__f, "%Zu %Zu %Zu %Zu %Zu %Zu %Zu %Zu %Zu %Zu\n", - _M_init, _M_count, _M_cost, _M_resize, _M_min, _M_max, - _M_total, _M_item_min, _M_item_max, _M_item_total); - } - - float - __magnitude() const - { return static_cast(_M_cost); } - - std::string - __advice() const - { - std::stringstream __message; - if (_M_init < _M_item_max) - __message << "change initial container size from " << _M_init - << " to " << _M_item_max; - return __message.str(); - } - - void - __init(std::size_t __num) - { - _M_init = __num; - _M_max = __num; - } - - void - __merge(const __container_size_info& __o) - { - __object_info_base::__merge(__o); - _M_init = std::max(_M_init, __o._M_init); - _M_max = std::max(_M_max, __o._M_max); - _M_item_max = std::max(_M_item_max, __o._M_item_max); - _M_min = std::min(_M_min, __o._M_min); - _M_item_min = std::min(_M_item_min, __o._M_item_min); - _M_total += __o._M_total; - _M_item_total += __o._M_item_total; - _M_count += __o._M_count; - _M_cost += __o._M_cost; - _M_resize += __o._M_resize; - } - - // Call if a container is destructed or cleaned. - void - __destruct(std::size_t __num, std::size_t __inum) - { - _M_max = std::max(_M_max, __num); - _M_item_max = std::max(_M_item_max, __inum); - if (_M_min == 0) - { - _M_min = __num; - _M_item_min = __inum; - } - else - { - _M_min = std::min(_M_min, __num); - _M_item_min = std::min(_M_item_min, __inum); - } - - _M_total += __num; - _M_item_total += __inum; - _M_count += 1; - } - - // Estimate the cost of resize/rehash. - float - __resize_cost(std::size_t __from, std::size_t) - { return __from; } - - // Call if container is resized. - void - __resize(std::size_t __from, std::size_t __to) - { - _M_cost += this->__resize_cost(__from, __to); - _M_resize += 1; - _M_max = std::max(_M_max, __to); - } - - private: - std::size_t _M_init; - std::size_t _M_max; // range of # buckets - std::size_t _M_min; - std::size_t _M_total; - std::size_t _M_item_min; // range of # items - std::size_t _M_item_max; - std::size_t _M_item_total; - std::size_t _M_count; - std::size_t _M_resize; - std::size_t _M_cost; - }; - - /** @brief A container size instrumentation line in the stack table. */ - class __container_size_stack_info - : public __container_size_info - { - public: - __container_size_stack_info(const __container_size_info& __o) - : __container_size_info(__o) { } - }; - - /** @brief Container size instrumentation trace producer. */ - class __trace_container_size - : public __trace_base<__container_size_info, __container_size_stack_info> - { - public: - ~__trace_container_size() { } - - __trace_container_size() - : __trace_base<__container_size_info, __container_size_stack_info>() { }; - - // Insert a new node at construct with object, callstack and initial size. - __container_size_info* - __insert(__stack_t __stack, std::size_t __num) - { - __container_size_info* __ret = __add_object(__stack); - if (__ret) - __ret->__init(__num); - return __ret; - } - - // Call at destruction/clean to set container final size. - void - __destruct(__container_size_info* __obj_info, - std::size_t __num, std::size_t __inum) - { - __obj_info->__destruct(__num, __inum); - __retire_object(__obj_info); - } - }; - -} // namespace __gnu_profile -#endif /* _GLIBCXX_PROFILE_PROFILER_CONTAINER_SIZE_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_hash_func.h b/libstdc++-v3/include/profile/impl/profiler_hash_func.h deleted file mode 100644 index f60f8cc4695..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_hash_func.h +++ /dev/null @@ -1,153 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_hash_func.h - * @brief Data structures to represent profiling traces. - */ - -// Written by Lixia Liu and Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_HASH_FUNC_H -#define _GLIBCXX_PROFILE_PROFILER_HASH_FUNC_H 1 - -#include "profile/impl/profiler.h" -#include "profile/impl/profiler_node.h" -#include "profile/impl/profiler_trace.h" - -namespace __gnu_profile -{ - /** @brief A hash performance instrumentation line in the object table. */ - class __hashfunc_info - : public __object_info_base - { - public: - __hashfunc_info(__stack_t __stack) - : __object_info_base(__stack), _M_longest_chain(0), - _M_accesses(0), _M_hops(0) { } - - void - __merge(const __hashfunc_info& __o) - { - __object_info_base::__merge(__o); - _M_longest_chain = std::max(_M_longest_chain, __o._M_longest_chain); - _M_accesses += __o._M_accesses; - _M_hops += __o._M_hops; - } - - void - __destruct(std::size_t __chain, std::size_t __accesses, - std::size_t __hops) - { - _M_longest_chain = std::max(_M_longest_chain, __chain); - _M_accesses += __accesses; - _M_hops += __hops; - } - - void - __write(FILE* __f) const - { std::fprintf(__f, "%Zu %Zu %Zu\n", _M_hops, - _M_accesses, _M_longest_chain); } - - float - __magnitude() const - { return static_cast(_M_hops); } - - std::string - __advice() const - { return "change hash function"; } - - private: - std::size_t _M_longest_chain; - std::size_t _M_accesses; - std::size_t _M_hops; - }; - - /** @brief A hash performance instrumentation line in the stack table. */ - class __hashfunc_stack_info - : public __hashfunc_info - { - public: - __hashfunc_stack_info(const __hashfunc_info& __o) - : __hashfunc_info(__o) { } - }; - - /** @brief Hash performance instrumentation producer. */ - class __trace_hash_func - : public __trace_base<__hashfunc_info, __hashfunc_stack_info> - { - public: - __trace_hash_func() - : __trace_base<__hashfunc_info, __hashfunc_stack_info>() - { __id = "hash-distr"; } - - ~__trace_hash_func() {} - - // Call at destruction/clean to set container final size. - void - __destruct(__hashfunc_info* __obj_info, - std::size_t __chain, std::size_t __accesses, std::size_t __hops) - { - if (!__obj_info) - return; - - __obj_info->__destruct(__chain, __accesses, __hops); - __retire_object(__obj_info); - } - }; - - inline void - __trace_hash_func_init() - { _GLIBCXX_PROFILE_DATA(_S_hash_func) = new __trace_hash_func(); } - - inline void - __trace_hash_func_free() - { delete _GLIBCXX_PROFILE_DATA(_S_hash_func); } - - inline void - __trace_hash_func_report(FILE* __f, __warning_vector_t& __warnings) - { __trace_report(_GLIBCXX_PROFILE_DATA(_S_hash_func), __f, __warnings); } - - inline __hashfunc_info* - __trace_hash_func_construct() - { - if (!__profcxx_init()) - return 0; - - if (!__reentrance_guard::__get_in()) - return 0; - - __reentrance_guard __get_out; - return _GLIBCXX_PROFILE_DATA(_S_hash_func)->__add_object(__get_stack()); - } - - inline void - __trace_hash_func_destruct(__hashfunc_info* __obj_info, - std::size_t __chain, std::size_t __accesses, - std::size_t __hops) - { - _GLIBCXX_PROFILE_DATA(_S_hash_func)->__destruct(__obj_info, __chain, - __accesses, __hops); - } - -} // namespace __gnu_profile -#endif /* _GLIBCXX_PROFILE_PROFILER_HASH_FUNC_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_hashtable_size.h b/libstdc++-v3/include/profile/impl/profiler_hashtable_size.h deleted file mode 100644 index 3ba60ab37fd..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_hashtable_size.h +++ /dev/null @@ -1,100 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_hashtable_size.h - * @brief Collection of hashtable size traces. - */ - -// Written by Lixia Liu and Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_HASHTABLE_SIZE_H -#define _GLIBCXX_PROFILE_PROFILER_HASHTABLE_SIZE_H 1 - -#include "profile/impl/profiler.h" -#include "profile/impl/profiler_node.h" -#include "profile/impl/profiler_trace.h" -#include "profile/impl/profiler_state.h" -#include "profile/impl/profiler_container_size.h" - -namespace __gnu_profile -{ - /** @brief Hashtable size instrumentation trace producer. */ - class __trace_hashtable_size - : public __trace_container_size - { - public: - __trace_hashtable_size() - : __trace_container_size() - { __id = "hashtable-size"; } - }; - - inline void - __trace_hashtable_size_init() - { _GLIBCXX_PROFILE_DATA(_S_hashtable_size) = new __trace_hashtable_size(); } - - inline void - __trace_hashtable_size_free() - { delete _GLIBCXX_PROFILE_DATA(_S_hashtable_size); } - - inline void - __trace_hashtable_size_report(FILE* __f, __warning_vector_t& __warnings) - { __trace_report(_GLIBCXX_PROFILE_DATA(_S_hashtable_size), __f, __warnings); } - - inline __container_size_info* - __trace_hashtable_size_construct(std::size_t __num) - { - if (!__profcxx_init()) - return 0; - - if (!__reentrance_guard::__get_in()) - return 0; - - __reentrance_guard __get_out; - return _GLIBCXX_PROFILE_DATA(_S_hashtable_size)-> - __insert(__get_stack(), __num); - } - - inline void - __trace_hashtable_size_resize(__container_size_info* __obj_info, - std::size_t __from, std::size_t __to) - { - if (!__obj_info) - return; - - __obj_info->__resize(__from, __to); - } - - inline void - __trace_hashtable_size_destruct(__container_size_info* __obj_info, - std::size_t __num, std::size_t __inum) - { - if (!__obj_info) - return; - - _GLIBCXX_PROFILE_DATA(_S_hashtable_size)-> - __destruct(__obj_info, __num, __inum); - } - -} // namespace __gnu_profile - -#endif /* _GLIBCXX_PROFILE_PROFILER_HASHTABLE_SIZE_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_list_to_slist.h b/libstdc++-v3/include/profile/impl/profiler_list_to_slist.h deleted file mode 100644 index ae760278a5b..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_list_to_slist.h +++ /dev/null @@ -1,168 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_list_to_slist.h - * @brief Diagnostics for list to slist. - */ - -// Written by Changhee Jung. - -#ifndef _GLIBCXX_PROFILE_PROFILER_LIST_TO_SLIST_H -#define _GLIBCXX_PROFILE_PROFILER_LIST_TO_SLIST_H 1 - -#include "profile/impl/profiler.h" -#include "profile/impl/profiler_node.h" -#include "profile/impl/profiler_trace.h" - -namespace __gnu_profile -{ - class __list2slist_info - : public __object_info_base - { - public: - __list2slist_info(__stack_t __stack) - : __object_info_base(__stack), _M_rewind(false), _M_operations(0) { } - - // XXX: the magnitude should be multiplied with a constant factor F, - // where F is 1 when the malloc size class of list nodes is different - // from the malloc size class of slist nodes. When they fall into the same - // class, the only slist benefit is from having to set fewer links, so - // the factor F should be much smaller, closer to 0 than to 1. - // This could be implemented by passing the size classes in the config - // file. For now, we always assume F to be 1. - - float - __magnitude() const - { - if (!_M_rewind) - return _M_operations; - else - return 0; - } - - void - __write(FILE* __f) const - { std::fprintf(__f, "%s\n", _M_rewind ? "invalid" : "valid"); } - - std::string - __advice() const - { return "change std::list to std::forward_list"; } - - void - __opr_rewind() - { - _M_rewind = true; - __set_invalid(); - } - - void - __record_operation() - { ++_M_operations; } - - bool - __has_rewind() - { return _M_rewind; } - - private: - bool _M_rewind; - std::size_t _M_operations; - }; - - class __list2slist_stack_info - : public __list2slist_info - { - public: - __list2slist_stack_info(const __list2slist_info& __o) - : __list2slist_info(__o) { } - }; - - class __trace_list_to_slist - : public __trace_base<__list2slist_info, __list2slist_stack_info> - { - public: - ~__trace_list_to_slist() { } - - __trace_list_to_slist() - : __trace_base<__list2slist_info, __list2slist_stack_info>() - { __id = "list-to-slist"; } - - void - __destruct(__list2slist_info* __obj_info) - { __retire_object(__obj_info); } - }; - - - inline void - __trace_list_to_slist_init() - { _GLIBCXX_PROFILE_DATA(_S_list_to_slist) = new __trace_list_to_slist(); } - - inline void - __trace_list_to_slist_free() - { delete _GLIBCXX_PROFILE_DATA(_S_list_to_slist); } - - inline void - __trace_list_to_slist_report(FILE* __f, __warning_vector_t& __warnings) - { __trace_report(_GLIBCXX_PROFILE_DATA(_S_list_to_slist), __f, __warnings); } - - inline __list2slist_info* - __trace_list_to_slist_construct() - { - if (!__profcxx_init()) - return 0; - - if (!__reentrance_guard::__get_in()) - return 0; - - __reentrance_guard __get_out; - return _GLIBCXX_PROFILE_DATA(_S_list_to_slist)->__add_object(__get_stack()); - } - - inline void - __trace_list_to_slist_rewind(__list2slist_info* __obj_info) - { - if (!__obj_info) - return; - - __obj_info->__opr_rewind(); - } - - inline void - __trace_list_to_slist_operation(__list2slist_info* __obj_info) - { - if (!__obj_info) - return; - - __obj_info->__record_operation(); - } - - inline void - __trace_list_to_slist_destruct(__list2slist_info* __obj_info) - { - if (!__obj_info) - return; - - _GLIBCXX_PROFILE_DATA(_S_list_to_slist)->__destruct(__obj_info); - } - -} // namespace __gnu_profile -#endif /* _GLIBCXX_PROFILE_PROFILER_LIST_TO_SLIST_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_list_to_vector.h b/libstdc++-v3/include/profile/impl/profiler_list_to_vector.h deleted file mode 100644 index c755c4c9735..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_list_to_vector.h +++ /dev/null @@ -1,261 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_list_to_vector.h - * @brief diagnostics for list to vector. - */ - -// Written by Changhee Jung. - -#ifndef _GLIBCXX_PROFILE_PROFILER_LIST_TO_VECTOR_H -#define _GLIBCXX_PROFILE_PROFILER_LIST_TO_VECTOR_H 1 - -#include - -#include "profile/impl/profiler.h" -#include "profile/impl/profiler_node.h" -#include "profile/impl/profiler_trace.h" - -namespace __gnu_profile -{ - /** @brief A list-to-vector instrumentation line in the object table. */ - class __list2vector_info - : public __object_info_base - { - public: - __list2vector_info(__stack_t __stack) - : __object_info_base(__stack), _M_shift_count(0), _M_iterate(0), - _M_resize(0), _M_list_cost(0), _M_vector_cost(0), - _M_max_size(0) { } - - void - __merge(const __list2vector_info& __o) - { - __object_info_base::__merge(__o); - _M_shift_count += __o._M_shift_count; - _M_iterate += __o._M_iterate; - _M_vector_cost += __o._M_vector_cost; - _M_list_cost += __o._M_list_cost; - _M_resize += __o._M_resize; - _M_max_size = std::max( _M_max_size, __o._M_max_size); - } - - void - __write(FILE* __f) const - { - std::fprintf(__f, "%Zu %Zu %Zu %.0f %.0f\n", _M_shift_count, - _M_resize, _M_iterate, _M_vector_cost, _M_list_cost); - } - - float - __magnitude() const - { return _M_list_cost - _M_vector_cost; } - - std::string - __advice() const - { - std::stringstream __sstream; - __sstream - << "change std::list to std::vector and its initial size from 0 to " - << _M_max_size; - return __sstream.str(); - } - - std::size_t - __shift_count() - { return _M_shift_count; } - - std::size_t - __iterate() - { return _M_iterate; } - - float - __list_cost() - { return _M_list_cost; } - - std::size_t - __resize() - { return _M_resize; } - - void - __set_list_cost(float __lc) - { _M_list_cost = __lc; } - - void - __set_vector_cost(float __vc) - { _M_vector_cost = __vc; } - - void - __opr_insert(std::size_t __shift, std::size_t __size) - { - _M_shift_count += __shift; - _M_max_size = std::max(_M_max_size, __size); - } - - void - __opr_iterate(int __num) - { __gnu_cxx::__atomic_add(&_M_iterate, __num); } - - void - __resize(std::size_t __from, std::size_t) - { _M_resize += __from; } - - private: - std::size_t _M_shift_count; - mutable _Atomic_word _M_iterate; - std::size_t _M_resize; - float _M_list_cost; - float _M_vector_cost; - std::size_t _M_max_size; - }; - - class __list2vector_stack_info - : public __list2vector_info - { - public: - __list2vector_stack_info(const __list2vector_info& __o) - : __list2vector_info(__o) {} - }; - - class __trace_list_to_vector - : public __trace_base<__list2vector_info, __list2vector_stack_info> - { - public: - __trace_list_to_vector() - : __trace_base<__list2vector_info, __list2vector_stack_info>() - { __id = "list-to-vector"; } - - ~__trace_list_to_vector() { } - - // Call at destruction/clean to set container final size. - void - __destruct(__list2vector_info* __obj_info) - { - float __vc = __vector_cost(__obj_info->__shift_count(), - __obj_info->__iterate()); - float __lc = __list_cost(__obj_info->__shift_count(), - __obj_info->__iterate()); - __obj_info->__set_vector_cost(__vc); - __obj_info->__set_list_cost(__lc); - __retire_object(__obj_info); - } - - // Collect cost of operations. - float - __vector_cost(std::size_t __shift, std::size_t __iterate) - { - // The resulting vector will use a 'reserve' method. - return (__shift - * _GLIBCXX_PROFILE_DATA(__vector_shift_cost_factor).__value - + __iterate - * _GLIBCXX_PROFILE_DATA(__vector_iterate_cost_factor).__value); - } - - float - __list_cost(std::size_t __shift, std::size_t __iterate) - { - return (__shift - * _GLIBCXX_PROFILE_DATA(__list_shift_cost_factor).__value - + __iterate - * _GLIBCXX_PROFILE_DATA(__list_iterate_cost_factor).__value); - } - }; - - - inline void - __trace_list_to_vector_init() - { _GLIBCXX_PROFILE_DATA(_S_list_to_vector) = new __trace_list_to_vector(); } - - inline void - __trace_list_to_vector_free() - { delete _GLIBCXX_PROFILE_DATA(_S_list_to_vector); } - - inline void - __trace_list_to_vector_report(FILE* __f, __warning_vector_t& __warnings) - { __trace_report(_GLIBCXX_PROFILE_DATA(_S_list_to_vector), __f, __warnings); } - - inline __list2vector_info* - __trace_list_to_vector_construct() - { - if (!__profcxx_init()) - return 0; - - if (!__reentrance_guard::__get_in()) - return 0; - - __reentrance_guard __get_out; - return _GLIBCXX_PROFILE_DATA(_S_list_to_vector) - ->__add_object(__get_stack()); - } - - inline void - __trace_list_to_vector_insert(__list2vector_info* __obj_info, - std::size_t __shift, std::size_t __size) - { - if (!__obj_info) - return; - - __obj_info->__opr_insert(__shift, __size); - } - - inline void - __trace_list_to_vector_iterate(__list2vector_info* __obj_info, - int) - { - if (!__obj_info) - return; - - // We only collect if an iteration took place no matter in what side. - __obj_info->__opr_iterate(1); - } - - inline void - __trace_list_to_vector_invalid_operator(__list2vector_info* __obj_info) - { - if (!__obj_info) - return; - - __obj_info->__set_invalid(); - } - - inline void - __trace_list_to_vector_resize(__list2vector_info* __obj_info, - std::size_t __from, std::size_t __to) - { - if (!__obj_info) - return; - - __obj_info->__resize(__from, __to); - } - - inline void - __trace_list_to_vector_destruct(__list2vector_info* __obj_info) - { - if (!__obj_info) - return; - - _GLIBCXX_PROFILE_DATA(_S_list_to_vector)->__destruct(__obj_info); - } - -} // namespace __gnu_profile -#endif /* _GLIBCXX_PROFILE_PROFILER_LIST_TO_VECTOR_H__ */ diff --git a/libstdc++-v3/include/profile/impl/profiler_map_to_unordered_map.h b/libstdc++-v3/include/profile/impl/profiler_map_to_unordered_map.h deleted file mode 100644 index a81b1bd3be6..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_map_to_unordered_map.h +++ /dev/null @@ -1,275 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_map_to_unordered_map.h - * @brief Diagnostics for map to unordered_map. - */ - -// Written by Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_MAP_TO_UNORDERED_MAP_H -#define _GLIBCXX_PROFILE_PROFILER_MAP_TO_UNORDERED_MAP_H 1 - -#include "profile/impl/profiler.h" -#include "profile/impl/profiler_node.h" -#include "profile/impl/profiler_trace.h" - -namespace __gnu_profile -{ - inline int - __log2(std::size_t __size) - { - for (int __bit_count = sizeof(std::size_t) - 1; __bit_count >= 0; - -- __bit_count) - if ((2 << __bit_count) & __size) - return __bit_count; - return 0; - } - - inline float - __map_insert_cost(std::size_t __size) - { return (_GLIBCXX_PROFILE_DATA(__map_insert_cost_factor).__value - * static_cast(__log2(__size))); } - - inline float - __map_erase_cost(std::size_t __size) - { return (_GLIBCXX_PROFILE_DATA(__map_erase_cost_factor).__value - * static_cast(__log2(__size))); } - - inline float - __map_find_cost(std::size_t __size) - { return (_GLIBCXX_PROFILE_DATA(__map_find_cost_factor).__value - * static_cast(__log2(__size))); } - - /** @brief A map-to-unordered_map instrumentation line in the - object table. */ - class __map2umap_info - : public __object_info_base - { - public: - __map2umap_info(__stack_t __stack) - : __object_info_base(__stack), _M_insert(0), _M_erase(0), _M_find(0), - _M_iterate(0), _M_umap_cost(0.0), _M_map_cost(0.0) - { } - - void - __merge(const __map2umap_info& __o) - { - __object_info_base::__merge(__o); - _M_insert += __o._M_insert; - _M_erase += __o._M_erase; - _M_find += __o._M_find; - _M_iterate += __o._M_iterate; - _M_umap_cost += __o._M_umap_cost; - _M_map_cost += __o._M_map_cost; - } - - void - __write(FILE* __f) const - { - std::fprintf(__f, "%Zu %Zu %Zu %Zu %.0f %.0f\n", - _M_insert, _M_erase, _M_find, _M_iterate, _M_map_cost, - _M_umap_cost); - } - - float - __magnitude() const - { return _M_map_cost - _M_umap_cost; } - - std::string - __advice() const - { return "prefer an unordered container"; } - - void - __record_insert(std::size_t __size, std::size_t __count) - { - ++_M_insert; - if (__count) - { - _M_map_cost += __count * __map_insert_cost(__size); - _M_umap_cost - += (__count - * _GLIBCXX_PROFILE_DATA(__umap_insert_cost_factor).__value); - } - } - - void - __record_erase(std::size_t __size, std::size_t __count) - { - ++_M_erase; - if (__count) - { - _M_map_cost += __count * __map_erase_cost(__size); - _M_umap_cost - += (__count - * _GLIBCXX_PROFILE_DATA(__umap_erase_cost_factor).__value); - } - } - - void - __record_find(std::size_t __size) - { - ++_M_find; - _M_map_cost += __map_find_cost(__size); - _M_umap_cost += _GLIBCXX_PROFILE_DATA(__umap_find_cost_factor).__value; - } - - void - __record_iterate(int __count) - { __gnu_cxx::__atomic_add(&_M_iterate, __count); } - - void - __set_iterate_costs() - { - _M_umap_cost - += (_M_iterate - * _GLIBCXX_PROFILE_DATA(__umap_iterate_cost_factor).__value); - _M_map_cost - += (_M_iterate - * _GLIBCXX_PROFILE_DATA(__map_iterate_cost_factor).__value); - } - - private: - std::size_t _M_insert; - std::size_t _M_erase; - std::size_t _M_find; - mutable _Atomic_word _M_iterate; - float _M_umap_cost; - float _M_map_cost; - }; - - - /** @brief A map-to-unordered_map instrumentation line in the - stack table. */ - class __map2umap_stack_info - : public __map2umap_info - { - public: - __map2umap_stack_info(const __map2umap_info& __o) - : __map2umap_info(__o) { } - }; - - /** @brief Map-to-unordered_map instrumentation producer. */ - class __trace_map2umap - : public __trace_base<__map2umap_info, __map2umap_stack_info> - { - public: - __trace_map2umap() - : __trace_base<__map2umap_info, __map2umap_stack_info>() - { __id = "ordered-to-unordered"; } - - // Call at destruction/clean to set container final size. - void - __destruct(__map2umap_info* __obj_info) - { - __obj_info->__set_iterate_costs(); - __retire_object(__obj_info); - } - }; - - inline void - __trace_map_to_unordered_map_init() - { _GLIBCXX_PROFILE_DATA(_S_map2umap) = new __trace_map2umap(); } - - inline void - __trace_map_to_unordered_map_free() - { delete _GLIBCXX_PROFILE_DATA(_S_map2umap); } - - inline void - __trace_map_to_unordered_map_report(FILE* __f, - __warning_vector_t& __warnings) - { __trace_report(_GLIBCXX_PROFILE_DATA(_S_map2umap), __f, __warnings); } - - inline __map2umap_info* - __trace_map_to_unordered_map_construct() - { - if (!__profcxx_init()) - return 0; - - if (!__reentrance_guard::__get_in()) - return 0; - - __reentrance_guard __get_out; - return _GLIBCXX_PROFILE_DATA(_S_map2umap)->__add_object(__get_stack()); - } - - inline void - __trace_map_to_unordered_map_insert(__map2umap_info* __info, - std::size_t __size, std::size_t __count) - { - if (!__info) - return; - - __info->__record_insert(__size, __count); - } - - inline void - __trace_map_to_unordered_map_erase(__map2umap_info* __info, - std::size_t __size, std::size_t __count) - { - if (!__info) - return; - - __info->__record_erase(__size, __count); - } - - inline void - __trace_map_to_unordered_map_find(__map2umap_info* __info, - std::size_t __size) - { - if (!__info) - return; - - __info->__record_find(__size); - } - - inline void - __trace_map_to_unordered_map_iterate(__map2umap_info* __info, - int) - { - if (!__info) - return; - - // We only collect if an iteration took place no matter in what side. - __info->__record_iterate(1); - } - - inline void - __trace_map_to_unordered_map_invalidate(__map2umap_info* __info) - { - if (!__info) - return; - - __info->__set_invalid(); - } - - inline void - __trace_map_to_unordered_map_destruct(__map2umap_info* __info) - { - if (!__info) - return; - - _GLIBCXX_PROFILE_DATA(_S_map2umap)->__destruct(__info); - } -} // namespace __gnu_profile -#endif /* _GLIBCXX_PROFILE_PROFILER_MAP_TO_UNORDERED_MAP_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_node.h b/libstdc++-v3/include/profile/impl/profiler_node.h deleted file mode 100644 index af523c0e5a7..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_node.h +++ /dev/null @@ -1,155 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_node.h - * @brief Data structures to represent a single profiling event. - */ - -// Written by Lixia Liu and Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_NODE_H -#define _GLIBCXX_PROFILE_PROFILER_NODE_H 1 - -#include // FILE, fprintf - -#include -#if defined _GLIBCXX_HAVE_EXECINFO_H -#include -#endif - -namespace __gnu_profile -{ - typedef void* __instruction_address_t; - typedef std::_GLIBCXX_STD_C::vector<__instruction_address_t> __stack_npt; - typedef __stack_npt* __stack_t; - - std::size_t __stack_max_depth(); - - inline __stack_t - __get_stack() - { -#if defined _GLIBCXX_HAVE_EXECINFO_H - __try - { - std::size_t __max_depth = __stack_max_depth(); - if (__max_depth == 0) - return 0; - __stack_npt __buffer(__max_depth); - int __depth = backtrace(&__buffer[0], __max_depth); - return new(std::nothrow) __stack_npt(__buffer.begin(), - __buffer.begin() + __depth); - } - __catch(...) - { - return 0; - } -#else - return 0; -#endif - } - - inline std::size_t - __size(__stack_t __stack) - { - if (!__stack) - return 0; - else - return __stack->size(); - } - - // XXX - inline void - __write(FILE* __f, __stack_t __stack) - { - if (!__stack) - return; - - __stack_npt::const_iterator __it; - for (__it = __stack->begin(); __it != __stack->end(); ++__it) - std::fprintf(__f, "%p ", *__it); - } - - /** @brief Hash function for summary trace using call stack as index. */ - class __stack_hash - { - public: - std::size_t - operator()(__stack_t __s) const - { - if (!__s) - return 0; - - std::size_t __index = 0; - __stack_npt::const_iterator __it; - for (__it = __s->begin(); __it != __s->end(); ++__it) - __index += reinterpret_cast(*__it); - return __index; - } - - bool operator() (__stack_t __stack1, __stack_t __stack2) const - { - if (!__stack1 && !__stack2) - return true; - if (!__stack1 || !__stack2) - return false; - if (__stack1->size() != __stack2->size()) - return false; - - std::size_t __byte_size - = __stack1->size() * sizeof(__stack_npt::value_type); - return __builtin_memcmp(&(*__stack1)[0], &(*__stack2)[0], - __byte_size) == 0; - } - }; - - - /** @brief Base class for a line in the object table. */ - class __object_info_base - { - public: - __object_info_base(__stack_t __stack) - : _M_stack(__stack), _M_valid(true) { } - - bool - __is_valid() const - { return _M_valid; } - - void - __set_invalid() - { _M_valid = false; } - - void - __merge(const __object_info_base& __o) - { _M_valid &= __o._M_valid; } - - __stack_t - __stack() const - { return _M_stack; } - - protected: - __stack_t _M_stack; - bool _M_valid; - }; - -} // namespace __gnu_profile -#endif /* _GLIBCXX_PROFILE_PROFILER_NODE_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_state.h b/libstdc++-v3/include/profile/impl/profiler_state.h deleted file mode 100644 index ddeaad6037a..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_state.h +++ /dev/null @@ -1,69 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_state.h - * @brief Global profiler state. - */ - -// Written by Lixia Liu and Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_STATE_H -#define _GLIBCXX_PROFILE_PROFILER_STATE_H 1 - -namespace __gnu_profile -{ - enum __state_type { __ON, __OFF, __INVALID }; - - _GLIBCXX_PROFILE_DEFINE_DATA(__state_type, __state, __INVALID); - - inline bool - __turn(__state_type __s) - { - __state_type inv(__INVALID); - return __atomic_compare_exchange_n(&_GLIBCXX_PROFILE_DATA(__state), - &inv, __s, false, __ATOMIC_ACQ_REL, - __ATOMIC_RELAXED); - } - - inline bool - __turn_on() - { return __turn(__ON); } - - inline bool - __turn_off() - { return __turn(__OFF); } - - inline bool - __is_on() - { return _GLIBCXX_PROFILE_DATA(__state) == __ON; } - - inline bool - __is_off() - { return _GLIBCXX_PROFILE_DATA(__state) == __OFF; } - - inline bool - __is_invalid() - { return _GLIBCXX_PROFILE_DATA(__state) == __INVALID; } - -} // end namespace __gnu_profile -#endif /* _GLIBCXX_PROFILE_PROFILER_STATE_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_trace.h b/libstdc++-v3/include/profile/impl/profiler_trace.h deleted file mode 100644 index 261f3b3cc72..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_trace.h +++ /dev/null @@ -1,663 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_trace.h - * @brief Data structures to represent profiling traces. - */ - -// Written by Lixia Liu and Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_TRACE_H -#define _GLIBCXX_PROFILE_PROFILER_TRACE_H 1 - -#include // fopen, fclose, fprintf, FILE -#include -#include // atof, atoi, strtol, getenv, atexit, abort - -#if __cplusplus >= 201103L -#include -#define _GLIBCXX_IMPL_UNORDERED_MAP std::_GLIBCXX_STD_C::unordered_map -#else -#include -#define _GLIBCXX_IMPL_UNORDERED_MAP std::tr1::unordered_map -#endif - -#include -#include -#include -#include -#include - -#include "profile/impl/profiler_algos.h" -#include "profile/impl/profiler_state.h" -#include "profile/impl/profiler_node.h" - -namespace __gnu_profile -{ - /** @brief Internal environment. Values can be set one of two ways: - 1. In config file "var = value". The default config file path is - libstdcxx-profile.conf. - 2. By setting process environment variables. For instance, in a Bash - shell you can set the unit cost of iterating through a map like this: - export __map_iterate_cost_factor=5.0. - If a value is set both in the input file and through an environment - variable, the environment value takes precedence. */ - typedef _GLIBCXX_IMPL_UNORDERED_MAP __env_t; - - _GLIBCXX_PROFILE_DEFINE_UNINIT_DATA(__env_t, __env); - - /** @brief Master lock. */ - _GLIBCXX_PROFILE_DEFINE_UNINIT_DATA(__gnu_cxx::__mutex, __global_mutex); - - /** @brief Representation of a warning. */ - struct __warning_data - { - float __magnitude; - __stack_t __context; - const char* __warning_id; - std::string __warning_message; - - __warning_data() - : __magnitude(0.0), __context(0), __warning_id(0) { } - - __warning_data(float __m, __stack_t __c, const char* __id, - const std::string& __msg) - : __magnitude(__m), __context(__c), __warning_id(__id), - __warning_message(__msg) { } - - bool - operator<(const __warning_data& __other) const - { return __magnitude < __other.__magnitude; } - }; - - typedef std::_GLIBCXX_STD_C::vector<__warning_data> __warning_vector_t; - - // Defined in profiler_.h. - class __trace_hash_func; - class __trace_hashtable_size; - class __trace_map2umap; - class __trace_vector_size; - class __trace_vector_to_list; - class __trace_list_to_slist; - class __trace_list_to_vector; - void __trace_vector_size_init(); - void __trace_hashtable_size_init(); - void __trace_hash_func_init(); - void __trace_vector_to_list_init(); - void __trace_list_to_slist_init(); - void __trace_list_to_vector_init(); - void __trace_map_to_unordered_map_init(); - void __trace_vector_size_report(FILE*, __warning_vector_t&); - void __trace_hashtable_size_report(FILE*, __warning_vector_t&); - void __trace_hash_func_report(FILE*, __warning_vector_t&); - void __trace_vector_to_list_report(FILE*, __warning_vector_t&); - void __trace_list_to_slist_report(FILE*, __warning_vector_t&); - void __trace_list_to_vector_report(FILE*, __warning_vector_t&); - void __trace_map_to_unordered_map_report(FILE*, __warning_vector_t&); - void __trace_vector_size_free(); - void __trace_hashtable_size_free(); - void __trace_hash_func_free(); - void __trace_vector_to_list_free(); - void __trace_list_to_slist_free(); - void __trace_list_to_vector_free(); - void __trace_map_to_unordered_map_free(); - - struct __cost_factor - { - const char* __env_var; - float __value; - }; - - typedef std::_GLIBCXX_STD_C::vector<__cost_factor*> __cost_factor_vector; - - _GLIBCXX_PROFILE_DEFINE_DATA(__trace_hash_func*, _S_hash_func, 0); - _GLIBCXX_PROFILE_DEFINE_DATA(__trace_hashtable_size*, _S_hashtable_size, 0); - _GLIBCXX_PROFILE_DEFINE_DATA(__trace_map2umap*, _S_map2umap, 0); - _GLIBCXX_PROFILE_DEFINE_DATA(__trace_vector_size*, _S_vector_size, 0); - _GLIBCXX_PROFILE_DEFINE_DATA(__trace_vector_to_list*, _S_vector_to_list, 0); - _GLIBCXX_PROFILE_DEFINE_DATA(__trace_list_to_slist*, _S_list_to_slist, 0); - _GLIBCXX_PROFILE_DEFINE_DATA(__trace_list_to_vector*, _S_list_to_vector, 0); - - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __vector_shift_cost_factor, - {"__vector_shift_cost_factor", 1.0}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __vector_iterate_cost_factor, - {"__vector_iterate_cost_factor", 1.0}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __vector_resize_cost_factor, - {"__vector_resize_cost_factor", 1.0}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __list_shift_cost_factor, - {"__list_shift_cost_factor", 0.0}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __list_iterate_cost_factor, - {"__list_iterate_cost_factor", 10.0}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __list_resize_cost_factor, - {"__list_resize_cost_factor", 0.0}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __map_insert_cost_factor, - {"__map_insert_cost_factor", 1.5}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __map_erase_cost_factor, - {"__map_erase_cost_factor", 1.5}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __map_find_cost_factor, - {"__map_find_cost_factor", 1}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __map_iterate_cost_factor, - {"__map_iterate_cost_factor", 2.3}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __umap_insert_cost_factor, - {"__umap_insert_cost_factor", 12.0}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __umap_erase_cost_factor, - {"__umap_erase_cost_factor", 12.0}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __umap_find_cost_factor, - {"__umap_find_cost_factor", 10.0}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor, __umap_iterate_cost_factor, - {"__umap_iterate_cost_factor", 1.7}); - _GLIBCXX_PROFILE_DEFINE_DATA(__cost_factor_vector*, __cost_factors, 0); - - _GLIBCXX_PROFILE_DEFINE_DATA(const char*, _S_trace_file_name, - _GLIBCXX_PROFILE_TRACE_PATH_ROOT); - _GLIBCXX_PROFILE_DEFINE_DATA(std::size_t, _S_max_warn_count, - _GLIBCXX_PROFILE_MAX_WARN_COUNT); - _GLIBCXX_PROFILE_DEFINE_DATA(std::size_t, _S_max_stack_depth, - _GLIBCXX_PROFILE_MAX_STACK_DEPTH); - _GLIBCXX_PROFILE_DEFINE_DATA(std::size_t, _S_max_mem, - _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC); - - inline std::size_t - __stack_max_depth() - { return _GLIBCXX_PROFILE_DATA(_S_max_stack_depth); } - - inline std::size_t - __max_mem() - { return _GLIBCXX_PROFILE_DATA(_S_max_mem); } - - /** @brief Base class for all trace producers. */ - template - class __trace_base - { - public: - // Do not pick the initial size too large, as we don't know which - // diagnostics are more active. - __trace_base() - : __objects_byte_size(0), __stack_table(10000), - __stack_table_byte_size(0), __id(0) { } - - ~__trace_base() - { - for (typename __stack_table_t::iterator __it - = __stack_table.begin(); __it != __stack_table.end(); ++__it) - delete __it->first; - } - - __object_info* __add_object(__stack_t __stack); - void __retire_object(__object_info* __info); - void __write(FILE* __f); - void __collect_warnings(__warning_vector_t& __warnings); - void __free(); - - private: - __gnu_cxx::__mutex __trace_mutex; - typedef _GLIBCXX_IMPL_UNORDERED_MAP<__stack_t, __stack_info, - __stack_hash, - __stack_hash> __stack_table_t; - std::size_t __objects_byte_size; - __stack_table_t __stack_table; - std::size_t __stack_table_byte_size; - - protected: - const char* __id; - }; - - template - __object_info* - __trace_base<__object_info, __stack_info>:: - __add_object(__stack_t __stack) - { - // If we have no backtrace information no need to collect data. - if (!__stack) - return 0; - - __gnu_cxx::__scoped_lock __lock(this->__trace_mutex); - - if (__max_mem() != 0 && __objects_byte_size >= __max_mem()) - { - delete __stack; - return 0; - } - - __object_info* __ret = new(std::nothrow) __object_info(__stack); - if (!__ret) - { - delete __stack; - return 0; - } - - __objects_byte_size += sizeof(__object_info); - return __ret; - } - - template - void - __trace_base<__object_info, __stack_info>:: - __retire_object(__object_info* __obj_info) - { - if (!__obj_info) - return; - - __gnu_cxx::__scoped_lock __lock(this->__trace_mutex); - - const __object_info& __info = *__obj_info; - __stack_t __stack = __info.__stack(); - typename __stack_table_t::iterator __stack_it - = __stack_table.find(__stack); - - if (__stack_it == __stack_table.end()) - { - // First occurrence of this call context. - if (__max_mem() == 0 || __stack_table_byte_size < __max_mem()) - { - __stack_table_byte_size - += (sizeof(__instruction_address_t) * __size(__stack) - + sizeof(__stack) + sizeof(__stack_info)); - __stack_table.insert(make_pair(__stack, - __stack_info(__info))); - } - else - delete __stack; - } - else - { - // Merge object info into info summary for this call context. - __stack_it->second.__merge(__info); - delete __stack; - } - - delete __obj_info; - __objects_byte_size -= sizeof(__object_info); - } - - template - void - __trace_base<__object_info, __stack_info>:: - __write(FILE* __f) - { - for (typename __stack_table_t::iterator __it - = __stack_table.begin(); __it != __stack_table.end(); ++__it) - if (__it->second.__is_valid()) - { - std::fprintf(__f, __id); - std::fprintf(__f, "|"); - __gnu_profile::__write(__f, __it->first); - std::fprintf(__f, "|"); - __it->second.__write(__f); - } - } - - template - void - __trace_base<__object_info, __stack_info>:: - __collect_warnings(__warning_vector_t& __warnings) - { - for (typename __stack_table_t::iterator __it - = __stack_table.begin(); __it != __stack_table.end(); ++__it) - __warnings.push_back(__warning_data(__it->second.__magnitude(), - __it->first, __id, - __it->second.__advice())); - } - - template - inline void - __trace_report(__trace_base<__object_info, __stack_info>* __cont, - FILE* __f, __warning_vector_t& __warnings) - { - if (__cont) - { - __cont->__collect_warnings(__warnings); - __cont->__write(__f); - } - } - - inline std::size_t - __env_to_size_t(const char* __env_var, std::size_t __default_value) - { - char* __env_value = std::getenv(__env_var); - if (__env_value) - { - errno = 0; - long __converted_value = std::strtol(__env_value, 0, 10); - if (errno || __converted_value < 0) - { - std::fprintf(stderr, - "Bad value for environment variable '%s'.\n", - __env_var); - std::abort(); - } - else - return static_cast(__converted_value); - } - else - return __default_value; - } - - inline void - __set_max_stack_trace_depth() - { - _GLIBCXX_PROFILE_DATA(_S_max_stack_depth) - = __env_to_size_t(_GLIBCXX_PROFILE_MAX_STACK_DEPTH_ENV_VAR, - _GLIBCXX_PROFILE_DATA(_S_max_stack_depth)); - } - - inline void - __set_max_mem() - { - _GLIBCXX_PROFILE_DATA(_S_max_mem) - = __env_to_size_t(_GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC_ENV_VAR, - _GLIBCXX_PROFILE_DATA(_S_max_mem)); - } - - inline int - __log_magnitude(float __f) - { - const float __log_base = 10.0; - int __result = 0; - int __sign = 1; - - if (__f < 0) - { - __f = -__f; - __sign = -1; - } - - while (__f > __log_base) - { - ++__result; - __f /= 10.0; - } - return __sign * __result; - } - - inline FILE* - __open_output_file(const char* __extension) - { - // The path is made of _S_trace_file_name + "." + extension. - std::size_t __root_len - = __builtin_strlen(_GLIBCXX_PROFILE_DATA(_S_trace_file_name)); - std::size_t __ext_len = __builtin_strlen(__extension); - char* __file_name = new char[__root_len + 1 + __ext_len + 1]; - __builtin_memcpy(__file_name, - _GLIBCXX_PROFILE_DATA(_S_trace_file_name), - __root_len); - *(__file_name + __root_len) = '.'; - __builtin_memcpy(__file_name + __root_len + 1, - __extension, __ext_len + 1); - - FILE* __out_file = std::fopen(__file_name, "w"); - if (!__out_file) - { - std::fprintf(stderr, "Could not open trace file '%s'.\n", - __file_name); - std::abort(); - } - - delete[] __file_name; - return __out_file; - } - - struct __warn - { - FILE* __file; - - __warn(FILE* __f) - { __file = __f; } - - void - operator()(const __warning_data& __info) - { - std::fprintf(__file, __info.__warning_id); - std::fprintf(__file, ": improvement = %d", - __log_magnitude(__info.__magnitude)); - std::fprintf(__file, ": call stack = "); - __gnu_profile::__write(__file, __info.__context); - std::fprintf(__file, ": advice = %s\n", - __info.__warning_message.c_str()); - } - }; - - /** @brief Final report method, registered with @b atexit. - * - * This can also be called directly by user code, including signal handlers. - * It is protected against deadlocks by the reentrance guard in profiler.h. - * However, when called from a signal handler that triggers while within - * __gnu_profile (under the guarded zone), no output will be produced. - */ - inline void - __report() - { - __gnu_cxx::__scoped_lock __lock(_GLIBCXX_PROFILE_DATA(__global_mutex)); - - __warning_vector_t __warnings, __top_warnings; - - FILE* __raw_file = __open_output_file("raw"); - __trace_vector_size_report(__raw_file, __warnings); - __trace_hashtable_size_report(__raw_file, __warnings); - __trace_hash_func_report(__raw_file, __warnings); - __trace_vector_to_list_report(__raw_file, __warnings); - __trace_list_to_slist_report(__raw_file, __warnings); - __trace_list_to_vector_report(__raw_file, __warnings); - __trace_map_to_unordered_map_report(__raw_file, __warnings); - std::fclose(__raw_file); - - // Sort data by magnitude, keeping just top N. - std::size_t __cutoff = std::min(_GLIBCXX_PROFILE_DATA(_S_max_warn_count), - __warnings.size()); - __top_n(__warnings, __top_warnings, __cutoff); - - FILE* __warn_file = __open_output_file("txt"); - __for_each(__top_warnings.begin(), __top_warnings.end(), - __warn(__warn_file)); - std::fclose(__warn_file); - } - - inline void - __report_and_free() - { - __report(); - - __trace_map_to_unordered_map_free(); - __trace_list_to_vector_free(); - __trace_list_to_slist_free(); - __trace_vector_to_list_free(); - __trace_hash_func_free(); - __trace_hashtable_size_free(); - __trace_vector_size_free(); - delete _GLIBCXX_PROFILE_DATA(__cost_factors); - } - - inline void - __set_trace_path() - { - char* __env_trace_file_name = std::getenv(_GLIBCXX_PROFILE_TRACE_ENV_VAR); - - if (__env_trace_file_name) - _GLIBCXX_PROFILE_DATA(_S_trace_file_name) = __env_trace_file_name; - - // Make sure early that we can create the trace file. - std::fclose(__open_output_file("txt")); - } - - inline void - __set_max_warn_count() - { - char* __env_max_warn_count_str - = std::getenv(_GLIBCXX_PROFILE_MAX_WARN_COUNT_ENV_VAR); - - if (__env_max_warn_count_str) - _GLIBCXX_PROFILE_DATA(_S_max_warn_count) - = static_cast(std::atoi(__env_max_warn_count_str)); - } - - inline void - __read_cost_factors() - { - std::string __conf_file_name(_GLIBCXX_PROFILE_DATA(_S_trace_file_name)); - __conf_file_name += ".conf"; - - std::ifstream __conf_file(__conf_file_name.c_str()); - - if (__conf_file.is_open()) - { - std::string __line; - - while (std::getline(__conf_file, __line)) - { - std::string::size_type __i = __line.find_first_not_of(" \t\n\v"); - - if (__line.length() <= 0 || __line[__i] == '#') - // Skip empty lines or comments. - continue; - } - - // Trim. - __line.erase(__remove(__line.begin(), __line.end(), ' '), - __line.end()); - std::string::size_type __pos = __line.find("="); - std::string __factor_name = __line.substr(0, __pos); - std::string::size_type __end = __line.find_first_of(";\n"); - std::string __factor_value = __line.substr(__pos + 1, __end - __pos); - - _GLIBCXX_PROFILE_DATA(__env)[__factor_name] = __factor_value; - } - } - - struct __cost_factor_writer - { - FILE* __file; - - __cost_factor_writer(FILE* __f) - : __file(__f) { } - - void - operator() (const __cost_factor* __factor) - { std::fprintf(__file, "%s = %f\n", __factor->__env_var, - __factor->__value); } - }; - - inline void - __write_cost_factors() - { - FILE* __file = __open_output_file("conf.out"); - __for_each(_GLIBCXX_PROFILE_DATA(__cost_factors)->begin(), - _GLIBCXX_PROFILE_DATA(__cost_factors)->end(), - __cost_factor_writer(__file)); - std::fclose(__file); - } - - struct __cost_factor_setter - { - void - operator()(__cost_factor* __factor) - { - // Look it up in the process environment first. - const char* __env_value = std::getenv(__factor->__env_var); - - if (!__env_value) - { - // Look it up in the config file. - __env_t::iterator __it - = _GLIBCXX_PROFILE_DATA(__env).find(__factor->__env_var); - if (__it != _GLIBCXX_PROFILE_DATA(__env).end()) - __env_value = __it->second.c_str(); - } - - if (__env_value) - __factor->__value = std::atof(__env_value); - } - }; - - inline void - __set_cost_factors() - { - __cost_factor_vector* __factors = new __cost_factor_vector; - _GLIBCXX_PROFILE_DATA(__cost_factors) = __factors; - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__vector_shift_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__vector_iterate_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__vector_resize_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__list_shift_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__list_iterate_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__list_resize_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__map_insert_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__map_erase_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__map_find_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__map_iterate_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__umap_insert_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__umap_erase_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__umap_find_cost_factor)); - __factors->push_back(&_GLIBCXX_PROFILE_DATA(__umap_iterate_cost_factor)); - __for_each(__factors->begin(), __factors->end(), __cost_factor_setter()); - } - - inline void - __profcxx_init_unconditional() - { - __gnu_cxx::__scoped_lock __lock(_GLIBCXX_PROFILE_DATA(__global_mutex)); - - if (__is_invalid()) - { - __set_max_warn_count(); - - if (_GLIBCXX_PROFILE_DATA(_S_max_warn_count) == 0) - __turn_off(); - else - { - __set_max_stack_trace_depth(); - __set_max_mem(); - __set_trace_path(); - __read_cost_factors(); - __set_cost_factors(); - __write_cost_factors(); - - __trace_vector_size_init(); - __trace_hashtable_size_init(); - __trace_hash_func_init(); - __trace_vector_to_list_init(); - __trace_list_to_slist_init(); - __trace_list_to_vector_init(); - __trace_map_to_unordered_map_init(); - - std::atexit(__report_and_free); - - __turn_on(); - } - } - } - - /** @brief This function must be called by each instrumentation point. - * - * The common path is inlined fully. - */ - inline bool - __profcxx_init() - { - if (__is_invalid()) - __profcxx_init_unconditional(); - - return __is_on(); - } - -} // namespace __gnu_profile - -#endif /* _GLIBCXX_PROFILE_PROFILER_TRACE_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_vector_size.h b/libstdc++-v3/include/profile/impl/profiler_vector_size.h deleted file mode 100644 index 106468e1898..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_vector_size.h +++ /dev/null @@ -1,100 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_vector_size.h - * @brief Collection of vector size traces. - */ - -// Written by Lixia Liu and Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_VECTOR_SIZE_H -#define _GLIBCXX_PROFILE_PROFILER_VECTOR_SIZE_H 1 - -#include "profile/impl/profiler.h" -#include "profile/impl/profiler_node.h" -#include "profile/impl/profiler_trace.h" -#include "profile/impl/profiler_state.h" -#include "profile/impl/profiler_container_size.h" - -namespace __gnu_profile -{ - /** @brief Hashtable size instrumentation trace producer. */ - class __trace_vector_size - : public __trace_container_size - { - public: - __trace_vector_size() - : __trace_container_size() - { __id = "vector-size"; } - }; - - inline void - __trace_vector_size_init() - { _GLIBCXX_PROFILE_DATA(_S_vector_size) = new __trace_vector_size(); } - - inline void - __trace_vector_size_free() - { delete _GLIBCXX_PROFILE_DATA(_S_vector_size); } - - inline void - __trace_vector_size_report(FILE* __f, __warning_vector_t& __warnings) - { __trace_report(_GLIBCXX_PROFILE_DATA(_S_vector_size), __f, __warnings); } - - inline __container_size_info* - __trace_vector_size_construct(std::size_t __num) - { - if (!__profcxx_init()) - return 0; - - if (!__reentrance_guard::__get_in()) - return 0; - - __reentrance_guard __get_out; - return _GLIBCXX_PROFILE_DATA(_S_vector_size)-> - __insert(__get_stack(), __num); - } - - inline void - __trace_vector_size_resize(__container_size_info* __obj_info, - std::size_t __from, std::size_t __to) - { - if (!__obj_info) - return; - - __obj_info->__resize(__from, __to); - } - - inline void - __trace_vector_size_destruct(__container_size_info* __obj_info, - std::size_t __num, std::size_t __inum) - { - if (!__obj_info) - return; - - _GLIBCXX_PROFILE_DATA(_S_vector_size)-> - __destruct(__obj_info, __num, __inum); - } - -} // namespace __gnu_profile - -#endif /* _GLIBCXX_PROFILE_PROFILER_VECTOR_SIZE_H */ diff --git a/libstdc++-v3/include/profile/impl/profiler_vector_to_list.h b/libstdc++-v3/include/profile/impl/profiler_vector_to_list.h deleted file mode 100644 index ae3d3e7cf46..00000000000 --- a/libstdc++-v3/include/profile/impl/profiler_vector_to_list.h +++ /dev/null @@ -1,261 +0,0 @@ -// -*- C++ -*- -// -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/impl/profiler_vector_to_list.h - * @brief diagnostics for vector to list. - */ - -// Written by Lixia Liu and Silvius Rus. - -#ifndef _GLIBCXX_PROFILE_PROFILER_VECTOR_TO_LIST_H -#define _GLIBCXX_PROFILE_PROFILER_VECTOR_TO_LIST_H 1 - -#include "profile/impl/profiler.h" -#include "profile/impl/profiler_node.h" -#include "profile/impl/profiler_trace.h" - -namespace __gnu_profile -{ - /** @brief A vector-to-list instrumentation line in the object table. */ - class __vector2list_info - : public __object_info_base - { - public: - __vector2list_info(__stack_t __stack) - : __object_info_base(__stack), _M_shift_count(0), _M_iterate(0), - _M_resize(0), _M_list_cost(0), _M_vector_cost(0) - { } - - void - __merge(const __vector2list_info& __o) - { - __object_info_base::__merge(__o); - _M_shift_count += __o._M_shift_count; - _M_iterate += __o._M_iterate; - _M_vector_cost += __o._M_vector_cost; - _M_list_cost += __o._M_list_cost; - _M_resize += __o._M_resize; - } - - void - __write(FILE* __f) const - { - std::fprintf(__f, "%Zu %Zu %Zu %.0f %.0f\n", _M_shift_count, - _M_resize, _M_iterate, _M_vector_cost, _M_list_cost); - } - - float - __magnitude() const - { return _M_vector_cost - _M_list_cost; } - - std::string - __advice() const - { return "change std::vector to std::list"; } - - std::size_t - __shift_count() - { return _M_shift_count; } - - std::size_t - __iterate() - { return _M_iterate; } - - float - __list_cost() - { return _M_list_cost; } - - std::size_t - __resize() - { return _M_resize; } - - void - __set_list_cost(float __lc) - { _M_list_cost = __lc; } - - void - __set_vector_cost(float __vc) - { _M_vector_cost = __vc; } - - void - __opr_insert(std::size_t __pos, std::size_t __num) - { _M_shift_count += __num - __pos; } - - void - __opr_iterate(int __num) - { __gnu_cxx::__atomic_add(&_M_iterate, __num); } - - void - __resize(std::size_t __from, std::size_t) - { _M_resize += __from; } - - private: - std::size_t _M_shift_count; - mutable _Atomic_word _M_iterate; - std::size_t _M_resize; - float _M_list_cost; - float _M_vector_cost; - }; - - - /** @brief A vector-to-list instrumentation line in the stack table. */ - class __vector2list_stack_info - : public __vector2list_info - { - public: - __vector2list_stack_info(const __vector2list_info& __o) - : __vector2list_info(__o) { } - }; - - - /** @brief Vector-to-list instrumentation producer. */ - class __trace_vector_to_list - : public __trace_base<__vector2list_info, __vector2list_stack_info> - { - public: - __trace_vector_to_list() - : __trace_base<__vector2list_info, __vector2list_stack_info>() - { __id = "vector-to-list"; } - - ~__trace_vector_to_list() { } - - // Call at destruction/clean to set container final size. - void - __destruct(__vector2list_info* __obj_info) - { - float __vc = __vector_cost(__obj_info->__shift_count(), - __obj_info->__iterate(), - __obj_info->__resize()); - float __lc = __list_cost(__obj_info->__shift_count(), - __obj_info->__iterate(), - __obj_info->__resize()); - __obj_info->__set_vector_cost(__vc); - __obj_info->__set_list_cost(__lc); - - __retire_object(__obj_info); - } - - // Collect cost of operations. - float - __vector_cost(std::size_t __shift, std::size_t __iterate, - std::size_t __resize) - { - return (__shift - * _GLIBCXX_PROFILE_DATA(__vector_shift_cost_factor).__value - + __iterate - * _GLIBCXX_PROFILE_DATA(__vector_iterate_cost_factor).__value - + __resize - * _GLIBCXX_PROFILE_DATA(__vector_resize_cost_factor).__value); - } - - float - __list_cost(std::size_t __shift, std::size_t __iterate, - std::size_t __resize) - { - return (__shift - * _GLIBCXX_PROFILE_DATA(__list_shift_cost_factor).__value - + __iterate - * _GLIBCXX_PROFILE_DATA(__list_iterate_cost_factor).__value - + __resize - * _GLIBCXX_PROFILE_DATA(__list_resize_cost_factor).__value); - } - }; - - - inline void - __trace_vector_to_list_init() - { _GLIBCXX_PROFILE_DATA(_S_vector_to_list) = new __trace_vector_to_list(); } - - inline void - __trace_vector_to_list_free() - { delete _GLIBCXX_PROFILE_DATA(_S_vector_to_list); } - - inline void - __trace_vector_to_list_report(FILE* __f, __warning_vector_t& __warnings) - { __trace_report(_GLIBCXX_PROFILE_DATA(_S_vector_to_list), __f, __warnings); } - - inline __vector2list_info* - __trace_vector_to_list_construct() - { - if (!__profcxx_init()) - return 0; - - if (!__reentrance_guard::__get_in()) - return 0; - - __reentrance_guard __get_out; - return _GLIBCXX_PROFILE_DATA(_S_vector_to_list) - ->__add_object(__get_stack()); - } - - inline void - __trace_vector_to_list_insert(__vector2list_info* __obj_info, - std::size_t __pos, - std::size_t __num) - { - if (!__obj_info) - return; - - __obj_info->__opr_insert(__pos, __num); - } - - inline void - __trace_vector_to_list_iterate(__vector2list_info* __obj_info, int) - { - if (!__obj_info) - return; - - // We only collect if an iteration took place no matter in what side. - __obj_info->__opr_iterate(1); - } - - inline void - __trace_vector_to_list_invalid_operator(__vector2list_info* __obj_info) - { - if (!__obj_info) - return; - - __obj_info->__set_invalid(); - } - - inline void - __trace_vector_to_list_resize(__vector2list_info* __obj_info, - std::size_t __from, - std::size_t __to) - { - if (!__obj_info) - return; - - __obj_info->__resize(__from, __to); - } - - inline void - __trace_vector_to_list_destruct(__vector2list_info* __obj_info) - { - if (!__obj_info) - return; - - _GLIBCXX_PROFILE_DATA(_S_vector_to_list)->__destruct(__obj_info); - } - -} // namespace __gnu_profile -#endif /* _GLIBCXX_PROFILE_PROFILER_VECTOR_TO_LIST_H */ diff --git a/libstdc++-v3/include/profile/iterator_tracker.h b/libstdc++-v3/include/profile/iterator_tracker.h deleted file mode 100644 index 9f14c14b27d..00000000000 --- a/libstdc++-v3/include/profile/iterator_tracker.h +++ /dev/null @@ -1,286 +0,0 @@ -// Profiling iterator implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file profile/iterator_tracker.h - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_ITERATOR_TRACKER -#define _GLIBCXX_PROFILE_ITERATOR_TRACKER 1 - -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - template - class __iterator_tracker - { - typedef __iterator_tracker _Self; - - // The underlying iterator - _Iterator _M_current; - - // The underlying data structure - const _Sequence* _M_ds; - typedef std::iterator_traits<_Iterator> _Traits; - - public: - typedef _Iterator _Base_iterator; - typedef typename _Traits::iterator_category iterator_category; - typedef typename _Traits::value_type value_type; - typedef typename _Traits::difference_type difference_type; - typedef typename _Traits::reference reference; - typedef typename _Traits::pointer pointer; - - __iterator_tracker() _GLIBCXX_NOEXCEPT - : _M_current(), _M_ds(0) { } - - __iterator_tracker(const _Iterator& __i, const _Sequence* __seq) - _GLIBCXX_NOEXCEPT - : _M_current(__i), _M_ds(__seq) { } - - __iterator_tracker(const __iterator_tracker& __x) _GLIBCXX_NOEXCEPT - : _M_current(__x._M_current), _M_ds(__x._M_ds) { } - - template - __iterator_tracker(const __iterator_tracker<_MutableIterator, - typename __gnu_cxx::__enable_if - <(std::__are_same<_MutableIterator, typename - _Sequence::iterator::_Base_iterator>::__value), - _Sequence>::__type>& __x) _GLIBCXX_NOEXCEPT - : _M_current(__x.base()), _M_ds(__x._M_get_sequence()) { } - - _Iterator - base() const _GLIBCXX_NOEXCEPT { return _M_current; } - - /** - * @brief Conversion to underlying non-debug iterator to allow - * better interaction with non-profile containers. - */ - operator _Iterator() const _GLIBCXX_NOEXCEPT { return _M_current; } - - pointer - operator->() const _GLIBCXX_NOEXCEPT { return &*_M_current; } - - __iterator_tracker& - operator++() _GLIBCXX_NOEXCEPT - { - _M_ds->_M_profile_iterate(); - ++_M_current; - return *this; - } - - __iterator_tracker - operator++(int) _GLIBCXX_NOEXCEPT - { - _M_ds->_M_profile_iterate(); - __iterator_tracker __tmp(*this); - ++_M_current; - return __tmp; - } - - __iterator_tracker& - operator--() _GLIBCXX_NOEXCEPT - { - _M_ds->_M_profile_iterate(1); - --_M_current; - return *this; - } - - __iterator_tracker - operator--(int) _GLIBCXX_NOEXCEPT - { - _M_ds->_M_profile_iterate(1); - __iterator_tracker __tmp(*this); - --_M_current; - return __tmp; - } - - __iterator_tracker& - operator=(const __iterator_tracker& __x) _GLIBCXX_NOEXCEPT - { - _M_current = __x._M_current; - _M_ds = __x._M_ds; - return *this; - } - - reference - operator*() const _GLIBCXX_NOEXCEPT - { return *_M_current; } - - // ------ Random access iterator requirements ------ - reference - operator[](const difference_type& __n) const _GLIBCXX_NOEXCEPT - { return _M_current[__n]; } - - __iterator_tracker& - operator+=(const difference_type& __n) _GLIBCXX_NOEXCEPT - { - _M_current += __n; - return *this; - } - - __iterator_tracker - operator+(const difference_type& __n) const _GLIBCXX_NOEXCEPT - { - __iterator_tracker __tmp(*this); - __tmp += __n; - return __tmp; - } - - __iterator_tracker& - operator-=(const difference_type& __n) _GLIBCXX_NOEXCEPT - { - _M_current += -__n; - return *this; - } - - __iterator_tracker - operator-(const difference_type& __n) const _GLIBCXX_NOEXCEPT - { - __iterator_tracker __tmp(*this); - __tmp -= __n; - return __tmp; - } - - const _Sequence* - _M_get_sequence() const - { return static_cast(_M_ds); } - }; - - template - inline bool - operator==(const __iterator_tracker<_IteratorL, _Sequence>& __lhs, - const __iterator_tracker<_IteratorR, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() == __rhs.base(); } - - template - inline bool - operator==(const __iterator_tracker<_Iterator, _Sequence>& __lhs, - const __iterator_tracker<_Iterator, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() == __rhs.base(); } - - template - inline bool - operator!=(const __iterator_tracker<_IteratorL, _Sequence>& __lhs, - const __iterator_tracker<_IteratorR, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() != __rhs.base(); } - - template - inline bool - operator!=(const __iterator_tracker<_Iterator, _Sequence>& __lhs, - const __iterator_tracker<_Iterator, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() != __rhs.base(); } - - template - inline bool - operator<(const __iterator_tracker<_IteratorL, _Sequence>& __lhs, - const __iterator_tracker<_IteratorR, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() < __rhs.base(); } - - template - inline bool - operator<(const __iterator_tracker<_Iterator, _Sequence>& __lhs, - const __iterator_tracker<_Iterator, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() < __rhs.base(); } - - template - inline bool - operator<=(const __iterator_tracker<_IteratorL, _Sequence>& __lhs, - const __iterator_tracker<_IteratorR, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() <= __rhs.base(); } - - template - inline bool - operator<=(const __iterator_tracker<_Iterator, _Sequence>& __lhs, - const __iterator_tracker<_Iterator, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() <= __rhs.base(); } - - template - inline bool - operator>(const __iterator_tracker<_IteratorL, _Sequence>& __lhs, - const __iterator_tracker<_IteratorR, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() > __rhs.base(); } - - template - inline bool - operator>(const __iterator_tracker<_Iterator, _Sequence>& __lhs, - const __iterator_tracker<_Iterator, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() > __rhs.base(); } - - template - inline bool - operator>=(const __iterator_tracker<_IteratorL, _Sequence>& __lhs, - const __iterator_tracker<_IteratorR, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() >= __rhs.base(); } - - template - inline bool - operator>=(const __iterator_tracker<_Iterator, _Sequence>& __lhs, - const __iterator_tracker<_Iterator, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() >= __rhs.base(); } - - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // According to the resolution of DR179 not only the various comparison - // operators but also operator- must accept mixed iterator/const_iterator - // parameters. - template - inline typename __iterator_tracker<_IteratorL, _Sequence>::difference_type - operator-(const __iterator_tracker<_IteratorL, _Sequence>& __lhs, - const __iterator_tracker<_IteratorR, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() - __rhs.base(); } - - template - inline typename __iterator_tracker<_Iterator, _Sequence>::difference_type - operator-(const __iterator_tracker<_Iterator, _Sequence>& __lhs, - const __iterator_tracker<_Iterator, _Sequence>& __rhs) - _GLIBCXX_NOEXCEPT - { return __lhs.base() - __rhs.base(); } - - template - inline __iterator_tracker<_Iterator, _Sequence> - operator+(typename __iterator_tracker<_Iterator,_Sequence>::difference_type - __n, - const __iterator_tracker<_Iterator, _Sequence>& __i) - _GLIBCXX_NOEXCEPT - { return __i + __n; } - -} // namespace __profile -} // namespace std -#endif diff --git a/libstdc++-v3/include/profile/list b/libstdc++-v3/include/profile/list deleted file mode 100644 index a0bc63d957e..00000000000 --- a/libstdc++-v3/include/profile/list +++ /dev/null @@ -1,650 +0,0 @@ -// Profiling list implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file profile/list - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_LIST -#define _GLIBCXX_PROFILE_LIST 1 - -#include -#include -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - template - class _List_profile - { - _List& - _M_conjure() - { return *static_cast<_List*>(this); } - - public: - __gnu_profile::__list2slist_info* _M_list2slist_info; - __gnu_profile::__list2vector_info* _M_list2vector_info; - - _List_profile() _GLIBCXX_NOEXCEPT - { _M_profile_construct(); } - - void - _M_profile_construct() _GLIBCXX_NOEXCEPT - { - _M_list2slist_info = __profcxx_list2slist_construct(); - _M_list2vector_info = __profcxx_list2vector_construct(); - } - - void - _M_profile_destruct() _GLIBCXX_NOEXCEPT - { - __profcxx_list2vector_destruct(_M_list2vector_info); - _M_list2vector_info = 0; - __profcxx_list2slist_destruct(_M_list2slist_info); - _M_list2slist_info = 0; - } - - void - _M_swap(_List_profile& __other) - { - std::swap(_M_list2slist_info, __other._M_list2slist_info); - std::swap(_M_list2vector_info, __other._M_list2vector_info); - } - -#if __cplusplus >= 201103L - _List_profile(const _List_profile&) noexcept - : _List_profile() { } - _List_profile(_List_profile&& __other) noexcept - : _List_profile() - { _M_swap(__other); } - - _List_profile& - operator=(const _List_profile&) noexcept - { - _M_profile_destruct(); - _M_profile_construct(); - } - - _List_profile& - operator=(_List_profile&& __other) noexcept - { - _M_swap(__other); - __other._M_profile_destruct(); - __other._M_profile_construct(); - } -#endif - - ~_List_profile() - { _M_profile_destruct(); } - }; - - /** @brief List wrapper with performance instrumentation. */ - template > - class list - : public _GLIBCXX_STD_C::list<_Tp, _Allocator>, - public _List_profile > - { - typedef _GLIBCXX_STD_C::list<_Tp, _Allocator> _Base; - - public: - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - - typedef __iterator_tracker - iterator; - typedef __iterator_tracker - const_iterator; - - typedef typename _Base::size_type size_type; - typedef typename _Base::difference_type difference_type; - - typedef _Tp value_type; - typedef _Allocator allocator_type; - typedef typename _Base::pointer pointer; - typedef typename _Base::const_pointer const_pointer; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - // 23.2.2.1 construct/copy/destroy: - -#if __cplusplus < 201103L - list() { } - list(const list& __x) - : _Base(__x) { } - - ~list() { } -#else - list() = default; - list(const list&) = default; - list(list&&) = default; - ~list() = default; - - list(initializer_list __l, - const allocator_type& __a = allocator_type()) - : _Base(__l, __a) { } - - list(const list& __x, const allocator_type& __a) - : _Base(__x, __a) { } - - list(list&& __x, const allocator_type& __a) - : _Base(std::move(__x), __a) { } -#endif - - explicit - list(const _Allocator& __a) _GLIBCXX_NOEXCEPT - : _Base(__a) { } - -#if __cplusplus >= 201103L - explicit - list(size_type __n, const allocator_type& __a = allocator_type()) - : _Base(__n, __a) { } - - list(size_type __n, const _Tp& __value, - const _Allocator& __a = _Allocator()) - : _Base(__n, __value, __a) { } -#else - explicit - list(size_type __n, const _Tp& __value = _Tp(), - const _Allocator& __a = _Allocator()) - : _Base(__n, __value, __a) { } -#endif - -#if __cplusplus >= 201103L - template> -#else - template -#endif - list(_InputIterator __first, _InputIterator __last, - const _Allocator& __a = _Allocator()) - : _Base(__first, __last, __a) { } - - list(const _Base& __x) - : _Base(__x) { } - -#if __cplusplus < 201103L - list& - operator=(const list& __x) - { - this->_M_profile_destruct(); - _M_base() = __x; - this->_M_profile_construct(); - return *this; - } -#else - list& - operator=(const list&) = default; - - list& - operator=(list&&) = default; - - list& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } -#endif - - // iterators: - iterator - begin() _GLIBCXX_NOEXCEPT - { return iterator(_Base::begin(), this); } - - const_iterator - begin() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::begin(), this); } - - iterator - end() _GLIBCXX_NOEXCEPT - { - __profcxx_list2slist_rewind(this->_M_list2slist_info); - return iterator(_Base::end(), this); - } - - const_iterator - end() const _GLIBCXX_NOEXCEPT - { - __profcxx_list2slist_rewind(this->_M_list2slist_info); - return const_iterator(_Base::end(), this); - } - - reverse_iterator - rbegin() _GLIBCXX_NOEXCEPT - { - __profcxx_list2slist_rewind(this->_M_list2slist_info); - return reverse_iterator(end()); - } - - const_reverse_iterator - rbegin() const _GLIBCXX_NOEXCEPT - { - __profcxx_list2slist_rewind(this->_M_list2slist_info); - return const_reverse_iterator(end()); - } - - reverse_iterator - rend() _GLIBCXX_NOEXCEPT - { return reverse_iterator(begin()); } - - const_reverse_iterator - rend() const _GLIBCXX_NOEXCEPT - { return const_reverse_iterator(begin()); } - -#if __cplusplus >= 201103L - const_iterator - cbegin() const noexcept - { return const_iterator(_Base::cbegin(), this); } - - const_iterator - cend() const noexcept - { return const_iterator(_Base::cend(), this); } - - const_reverse_iterator - crbegin() const noexcept - { return const_reverse_iterator(end()); } - - const_reverse_iterator - crend() const noexcept - { return const_reverse_iterator(begin()); } -#endif - - // 23.2.2.2 capacity: - reference - back() _GLIBCXX_NOEXCEPT - { - __profcxx_list2slist_rewind(this->_M_list2slist_info); - return _Base::back(); - } - - const_reference - back() const _GLIBCXX_NOEXCEPT - { - __profcxx_list2slist_rewind(this->_M_list2slist_info); - return _Base::back(); - } - - // 23.2.2.3 modifiers: - void - push_front(const value_type& __x) - { - __profcxx_list2vector_invalid_operator(this->_M_list2vector_info); - __profcxx_list2slist_operation(this->_M_list2slist_info); - _Base::push_front(__x); - } - - void - pop_front() _GLIBCXX_NOEXCEPT - { - __profcxx_list2slist_operation(this->_M_list2slist_info); - _Base::pop_front(); - } - - void - pop_back() _GLIBCXX_NOEXCEPT - { - _Base::pop_back(); - __profcxx_list2slist_rewind(this->_M_list2slist_info); - } - -#if __cplusplus >= 201103L - template - iterator - emplace(const_iterator __position, _Args&&... __args) - { - return iterator(_Base::emplace(__position.base(), - std::forward<_Args>(__args)...), - this); - } -#endif - - iterator -#if __cplusplus >= 201103L - insert(const_iterator __pos, const _Tp& __x) -#else - insert(iterator __pos, const _Tp& __x) -#endif - { - _M_profile_insert(__pos, this->size()); - return iterator(_Base::insert(__pos.base(), __x), this); - } - -#if __cplusplus >= 201103L - iterator - insert(const_iterator __pos, _Tp&& __x) - { - _M_profile_insert(__pos, this->size()); - return iterator(_Base::emplace(__pos.base(), std::move(__x)), - this); - } - - iterator - insert(const_iterator __pos, initializer_list __l) - { - _M_profile_insert(__pos, this->size()); - return iterator(_Base::insert(__pos.base(), __l), this); - } -#endif - -#if __cplusplus >= 201103L - iterator - insert(const_iterator __pos, size_type __n, const _Tp& __x) - { - _M_profile_insert(__pos, this->size()); - return iterator(_Base::insert(__pos.base(), __n, __x), this); - } -#else - void - insert(iterator __pos, size_type __n, const _Tp& __x) - { - _M_profile_insert(__pos, this->size()); - _Base::insert(__pos.base(), __n, __x); - } -#endif - -#if __cplusplus >= 201103L - template> - iterator - insert(const_iterator __pos, _InputIterator __first, - _InputIterator __last) - { - _M_profile_insert(__pos, this->size()); - return iterator(_Base::insert(__pos.base(), __first, __last), - this); - } -#else - template - void - insert(iterator __pos, _InputIterator __first, - _InputIterator __last) - { - _M_profile_insert(__pos, this->size()); - _Base::insert(__pos.base(), __first, __last); - } -#endif - - iterator -#if __cplusplus >= 201103L - erase(const_iterator __pos) noexcept -#else - erase(iterator __pos) -#endif - { return iterator(_Base::erase(__pos.base()), this); } - - iterator -#if __cplusplus >= 201103L - erase(const_iterator __pos, const_iterator __last) noexcept -#else - erase(iterator __pos, iterator __last) -#endif - { - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 151. can't currently clear() empty container - return iterator(_Base::erase(__pos.base(), __last.base()), this); - } - - void - swap(list& __x) - _GLIBCXX_NOEXCEPT_IF( noexcept(declval<_Base&>().swap(__x)) ) - { - _Base::swap(__x); - this->_M_swap(__x); - } - - void - clear() _GLIBCXX_NOEXCEPT - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - // 23.2.2.4 list operations: - void -#if __cplusplus >= 201103L - splice(const_iterator __pos, list&& __x) noexcept -#else - splice(iterator __pos, list& __x) -#endif - { this->splice(__pos, _GLIBCXX_MOVE(__x), __x.begin(), __x.end()); } - -#if __cplusplus >= 201103L - void - splice(const_iterator __pos, list& __x) noexcept - { this->splice(__pos, std::move(__x)); } - - void - splice(const_iterator __pos, list& __x, const_iterator __i) - { this->splice(__pos, std::move(__x), __i); } -#endif - - void -#if __cplusplus >= 201103L - splice(const_iterator __pos, list&& __x, const_iterator __i) noexcept -#else - splice(iterator __pos, list& __x, iterator __i) -#endif - { - // We used to perform the splice_alloc check: not anymore, redundant - // after implementing the relevant bits of N1599. - - // _GLIBCXX_RESOLVE_LIB_DEFECTS - _Base::splice(__pos.base(), _GLIBCXX_MOVE(__x._M_base()), - __i.base()); - } - - void -#if __cplusplus >= 201103L - splice(const_iterator __pos, list&& __x, const_iterator __first, - const_iterator __last) noexcept -#else - splice(iterator __pos, list& __x, iterator __first, - iterator __last) -#endif - { - _Base::splice(__pos.base(), _GLIBCXX_MOVE(__x._M_base()), - __first.base(), __last.base()); - } - -#if __cplusplus >= 201103L - void - splice(const_iterator __pos, list& __x, - const_iterator __first, const_iterator __last) noexcept - { this->splice(__pos, std::move(__x), __first, __last); } -#endif - - void - remove(const _Tp& __value) - { - for (iterator __x = begin(); __x != end(); ) - { - if (*__x == __value) - __x = erase(__x); - else - ++__x; - } - } - - template - void - remove_if(_Predicate __pred) - { - for (iterator __x = begin(); __x != end(); ) - { - __profcxx_list2slist_operation(this->_M_list2slist_info); - if (__pred(*__x)) - __x = erase(__x); - else - ++__x; - } - } - - void - unique() - { - iterator __first = begin(); - iterator __last = end(); - if (__first == __last) - return; - iterator __next = __first; - while (++__next != __last) - { - __profcxx_list2slist_operation(this->_M_list2slist_info); - if (*__first == *__next) - erase(__next); - else - __first = __next; - __next = __first; - } - } - - template - void - unique(_BinaryPredicate __binary_pred) - { - iterator __first = begin(); - iterator __last = end(); - if (__first == __last) - return; - iterator __next = __first; - while (++__next != __last) - { - __profcxx_list2slist_operation(this->_M_list2slist_info); - if (__binary_pred(*__first, *__next)) - erase(__next); - else - __first = __next; - __next = __first; - } - } - - void -#if __cplusplus >= 201103L - merge(list&& __x) -#else - merge(list& __x) -#endif - { _Base::merge(_GLIBCXX_MOVE(__x._M_base())); } - -#if __cplusplus >= 201103L - void - merge(list& __x) - { this->merge(std::move(__x)); } -#endif - - template - void -#if __cplusplus >= 201103L - merge(list&& __x, _Compare __comp) -#else - merge(list& __x, _Compare __comp) -#endif - { _Base::merge(_GLIBCXX_MOVE(__x._M_base()), __comp); } - -#if __cplusplus >= 201103L - template - void - merge(list& __x, _Compare __comp) - { this->merge(std::move(__x), __comp); } -#endif - - _Base& - _M_base() _GLIBCXX_NOEXCEPT { return *this; } - - const _Base& - _M_base() const _GLIBCXX_NOEXCEPT { return *this; } - - void _M_profile_iterate(int __rewind = 0) const - { - __profcxx_list2slist_operation(this->_M_list2slist_info); - __profcxx_list2vector_iterate(this->_M_list2vector_info, __rewind); - if (__rewind) - __profcxx_list2slist_rewind(this->_M_list2slist_info); - } - - private: - size_type - _M_profile_insert(const_iterator __pos, size_type __size) - { - size_type __shift = 0; - typename _Base::const_iterator __it = __pos.base(); - for (; __it != _Base::end(); ++__it) - __shift++; - __profcxx_list2slist_rewind(this->_M_list2slist_info); - __profcxx_list2slist_operation(this->_M_list2slist_info); - __profcxx_list2vector_insert(this->_M_list2vector_info, __shift, __size); - } - }; - - template - inline bool - operator==(const list<_Tp, _Alloc>& __lhs, - const list<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() == __rhs._M_base(); } - - template - inline bool - operator!=(const list<_Tp, _Alloc>& __lhs, - const list<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() != __rhs._M_base(); } - - template - inline bool - operator<(const list<_Tp, _Alloc>& __lhs, - const list<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() < __rhs._M_base(); } - - template - inline bool - operator<=(const list<_Tp, _Alloc>& __lhs, - const list<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() <= __rhs._M_base(); } - - template - inline bool - operator>=(const list<_Tp, _Alloc>& __lhs, - const list<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() >= __rhs._M_base(); } - - template - inline bool - operator>(const list<_Tp, _Alloc>& __lhs, - const list<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() > __rhs._M_base(); } - - template - inline void - swap(list<_Tp, _Alloc>& __lhs, list<_Tp, _Alloc>& __rhs) - _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs))) - { __lhs.swap(__rhs); } - -} // namespace __profile -} // namespace std - -#endif diff --git a/libstdc++-v3/include/profile/map b/libstdc++-v3/include/profile/map deleted file mode 100644 index dc96293606a..00000000000 --- a/libstdc++-v3/include/profile/map +++ /dev/null @@ -1,35 +0,0 @@ -// Profiling map/multimap implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/map - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_MAP -#define _GLIBCXX_PROFILE_MAP 1 - -#include -#include -#include - -#endif diff --git a/libstdc++-v3/include/profile/map.h b/libstdc++-v3/include/profile/map.h deleted file mode 100644 index c8b9a5a5229..00000000000 --- a/libstdc++-v3/include/profile/map.h +++ /dev/null @@ -1,705 +0,0 @@ -// Profiling map implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/map.h - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_MAP_H -#define _GLIBCXX_PROFILE_MAP_H 1 - -#include -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - /// Class std::map wrapper with performance instrumentation. - template, - typename _Allocator = std::allocator > > - class map - : public _GLIBCXX_STD_C::map<_Key, _Tp, _Compare, _Allocator>, - public _Ordered_profile > - { - typedef _GLIBCXX_STD_C::map<_Key, _Tp, _Compare, _Allocator> _Base; - - typedef typename _Base::iterator _Base_iterator; - typedef typename _Base::const_iterator _Base_const_iterator; - - public: - // types: - typedef _Key key_type; - typedef _Tp mapped_type; - typedef typename _Base::value_type value_type; - typedef _Compare key_compare; - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - - typedef __iterator_tracker<_Base_iterator, map> iterator; - typedef __iterator_tracker<_Base_const_iterator, - map> const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - typedef typename _Base::size_type size_type; - typedef typename _Base::difference_type difference_type; - - // 23.3.1.1 construct/copy/destroy: - -#if __cplusplus < 201103L - map() - : _Base() { } - map(const map& __x) - : _Base(__x) { } - ~map() - { } -#else - map() = default; - map(const map&) = default; - map(map&&) = default; - ~map() = default; -#endif - - explicit - map(const _Compare& __comp, - const _Allocator& __a = _Allocator()) - : _Base(__comp, __a) { } - -#if __cplusplus >= 201103L - template> -#else - template -#endif - map(_InputIterator __first, _InputIterator __last, - const _Compare& __comp = _Compare(), - const _Allocator& __a = _Allocator()) - : _Base(__first, __last, __comp, __a) { } - - map(const _Base& __x) - : _Base(__x) { } - -#if __cplusplus >= 201103L - map(initializer_list __l, - const _Compare& __c = _Compare(), - const _Allocator& __a = _Allocator()) - : _Base(__l, __c, __a) { } - - explicit - map(const _Allocator& __a) - : _Base(__a) { } - - map(const map& __x, const _Allocator& __a) - : _Base(__x, __a) { } - - map(map&& __x, const _Allocator& __a) - noexcept( noexcept(_Base(std::move(__x), __a)) ) - : _Base(std::move(__x), __a) { } - - map(initializer_list __l, const _Allocator& __a) - : _Base(__l, __a) { } - - template - map(_InputIterator __first, _InputIterator __last, - const _Allocator& __a) - : _Base(__first, __last, __a) { } -#endif - -#if __cplusplus < 201103L - map& - operator=(const map& __x) - { - this->_M_profile_destruct(); - _M_base() = __x; - this->_M_profile_construct(); - return *this; - } -#else - map& - operator=(const map&) = default; - - map& - operator=(map&&) = default; - - map& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } -#endif - - // iterators - iterator - begin() _GLIBCXX_NOEXCEPT - { return iterator(_Base::begin(), this); } - - const_iterator - begin() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::begin(), this); } - - iterator - end() _GLIBCXX_NOEXCEPT - { return iterator(_Base::end(), this); } - - const_iterator - end() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::end(), this); } - -#if __cplusplus >= 201103L - const_iterator - cbegin() const noexcept - { return const_iterator(_Base::cbegin(), this); } - - const_iterator - cend() const noexcept - { return const_iterator(_Base::cend(), this); } -#endif - - reverse_iterator - rbegin() _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return reverse_iterator(end()); - } - - const_reverse_iterator - rbegin() const _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(end()); - } - - reverse_iterator - rend() _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return reverse_iterator(begin()); - } - - const_reverse_iterator - rend() const _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(begin()); - } - -#if __cplusplus >= 201103L - const_reverse_iterator - crbegin() const noexcept - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(cend()); - } - - const_reverse_iterator - crend() const noexcept - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(cbegin()); - } -#endif - - // 23.3.1.2 element access: - mapped_type& - operator[](const key_type& __k) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::operator[](__k); - } - -#if __cplusplus >= 201103L - mapped_type& - operator[](key_type&& __k) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::operator[](std::move(__k)); - } -#endif - - mapped_type& - at(const key_type& __k) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::at(__k); - } - - const mapped_type& - at(const key_type& __k) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::at(__k); - } - - // modifiers: -#if __cplusplus >= 201103L - template - std::pair - emplace(_Args&&... __args) - { - // The cost is the same whether or not the element is inserted so we - // always report insertion of 1 element. - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - auto __base_ret = _Base::emplace(std::forward<_Args>(__args)...); - return std::make_pair(iterator(__base_ret.first, this), - __base_ret.second); - } - - template - iterator - emplace_hint(const_iterator __pos, _Args&&... __args) - { - auto size_before = this->size(); - auto __res - = _Base::emplace_hint(__pos.base(), std::forward<_Args>(__args)...); - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } -#endif - - std::pair - insert(const value_type& __x) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - std::pair<_Base_iterator, bool> __base_ret = _Base::insert(__x); - return std::make_pair(iterator(__base_ret.first, this), - __base_ret.second); - } - -#if __cplusplus >= 201103L - template::value>::type> - std::pair - insert(_Pair&& __x) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - auto __base_ret= _Base::insert(std::forward<_Pair>(__x)); - return std::make_pair(iterator(__base_ret.first, this), - __base_ret.second); - } -#endif - -#if __cplusplus >= 201103L - void - insert(std::initializer_list __list) - { insert(__list.begin(), __list.end()); } -#endif - - iterator -#if __cplusplus >= 201103L - insert(const_iterator __pos, const value_type& __x) -#else - insert(iterator __pos, const value_type& __x) -#endif - { - size_type size_before = this->size(); - _Base_iterator __res = _Base::insert(__pos.base(), __x); - - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } - -#if __cplusplus >= 201103L - template::value>::type> - iterator - insert(const_iterator __pos, _Pair&& __x) - { - size_type size_before = this->size(); - auto __res = _Base::insert(__pos.base(), std::forward<_Pair>(__x)); - - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } -#endif - - template - void - insert(_InputIterator __first, _InputIterator __last) - { - for (; __first != __last; ++__first) - insert(*__first); - } - -#if __cplusplus >= 201103L - iterator - erase(const_iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::erase(__pos.base()), this); - } - - iterator - erase(iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::erase(__pos.base()), this); - } -#else - void - erase(iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - _Base::erase(__pos.base()); - } -#endif - - size_type - erase(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return _Base::erase(__x); - } - -#if __cplusplus >= 201103L - iterator - erase(const_iterator __first, const_iterator __last) - { - if (__first != __last) - { - iterator __ret; - for (; __first != __last;) - __ret = erase(__first++); - return __ret; - } - else - return iterator(_Base::erase(__first.base(), __last.base()), this); - } -#else - void - erase(iterator __first, iterator __last) - { - for (; __first != __last;) - erase(__first++); - } -#endif - - void - swap(map& __x) - _GLIBCXX_NOEXCEPT_IF( noexcept(declval<_Base&>().swap(__x)) ) - { - _Base::swap(__x); - this->_M_swap(__x); - } - - void - clear() _GLIBCXX_NOEXCEPT - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - // 23.3.1.3 map operations: - iterator - find(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return iterator(_Base::find(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - find(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return { _Base::find(__x), this }; - } -#endif - - const_iterator - find(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return const_iterator(_Base::find(__x), this); - } - -#if __cplusplus > 201103L - template::type> - const_iterator - find(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return { _Base::find(__x), this }; - } -#endif - - size_type - count(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::count(__x); - } - -#if __cplusplus > 201103L - template::type> - size_type - count(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::count(__x); - } -#endif - - iterator - lower_bound(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return iterator(_Base::lower_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - lower_bound(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::lower_bound(__x), this }; - } -#endif - - const_iterator - lower_bound(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_iterator(_Base::lower_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - const_iterator - lower_bound(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::lower_bound(__x), this }; - } -#endif - - iterator - upper_bound(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return iterator(_Base::upper_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - upper_bound(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::upper_bound(__x), this }; - } -#endif - - const_iterator - upper_bound(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_iterator(_Base::upper_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - const_iterator - upper_bound(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::upper_bound(__x), this }; - } -#endif - - std::pair - equal_range(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - std::pair<_Base_iterator, _Base_iterator> __base_ret - = _Base::equal_range(__x); - return std::make_pair(iterator(__base_ret.first, this), - iterator(__base_ret.second, this)); - } - -#if __cplusplus > 201103L - template::type> - std::pair - equal_range(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - auto __res = _Base::equal_range(__x); - return { { __res.first, this }, { __res.second, this } }; - } -#endif - - std::pair - equal_range(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - std::pair<_Base_const_iterator, _Base_const_iterator> __base_ret - = _Base::equal_range(__x); - return std::make_pair(const_iterator(__base_ret.first, this), - const_iterator(__base_ret.second, this)); - } - -#if __cplusplus > 201103L - template::type> - std::pair - equal_range(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - auto __res = _Base::equal_range(__x); - return { { __res.first, this }, { __res.second, this } }; - } -#endif - - _Base& - _M_base() _GLIBCXX_NOEXCEPT { return *this; } - - const _Base& - _M_base() const _GLIBCXX_NOEXCEPT { return *this; } - - private: - /** If hint is used we consider that the map and unordered_map - * operations have equivalent insertion cost so we do not update metrics - * about it. - * Note that to find out if hint has been used is libstdc++ - * implementation dependent. - */ - bool - _M_hint_used(_Base_const_iterator __hint, _Base_iterator __res) - { - return (__hint == __res - || (__hint == _M_base().end() && ++__res == _M_base().end()) - || (__hint != _M_base().end() && (++__hint == __res - || ++__res == --__hint))); - } - - - template - friend bool - operator==(const map<_K1, _T1, _C1, _A1>&, - const map<_K1, _T1, _C1, _A1>&); - - template - friend bool - operator<(const map<_K1, _T1, _C1, _A1>&, - const map<_K1, _T1, _C1, _A1>&); - }; - - template - inline bool - operator==(const map<_Key, _Tp, _Compare, _Allocator>& __lhs, - const map<_Key, _Tp, _Compare, _Allocator>& __rhs) - { - __profcxx_map2umap_invalidate(__lhs._M_map2umap_info); - __profcxx_map2umap_invalidate(__rhs._M_map2umap_info); - return __lhs._M_base() == __rhs._M_base(); - } - - template - inline bool - operator<(const map<_Key, _Tp, _Compare, _Allocator>& __lhs, - const map<_Key, _Tp, _Compare, _Allocator>& __rhs) - { - __profcxx_map2umap_invalidate(__lhs._M_map2umap_info); - __profcxx_map2umap_invalidate(__rhs._M_map2umap_info); - return __lhs._M_base() < __rhs._M_base(); - } - - template - inline bool - operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __lhs, - const map<_Key, _Tp, _Compare, _Allocator>& __rhs) - { return !(__lhs == __rhs); } - - template - inline bool - operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __lhs, - const map<_Key, _Tp, _Compare, _Allocator>& __rhs) - { return !(__rhs < __lhs); } - - template - inline bool - operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __lhs, - const map<_Key, _Tp, _Compare, _Allocator>& __rhs) - { return !(__lhs < __rhs); } - - template - inline bool - operator>(const map<_Key, _Tp, _Compare, _Allocator>& __lhs, - const map<_Key, _Tp, _Compare, _Allocator>& __rhs) - { return __rhs < __lhs; } - - template - inline void - swap(map<_Key, _Tp, _Compare, _Allocator>& __lhs, - map<_Key, _Tp, _Compare, _Allocator>& __rhs) - _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs))) - { __lhs.swap(__rhs); } - -} // namespace __profile -} // namespace std - -#endif diff --git a/libstdc++-v3/include/profile/multimap.h b/libstdc++-v3/include/profile/multimap.h deleted file mode 100644 index 7d0af3d5e62..00000000000 --- a/libstdc++-v3/include/profile/multimap.h +++ /dev/null @@ -1,663 +0,0 @@ -// Profiling multimap implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file profile/multimap.h - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_MULTIMAP_H -#define _GLIBCXX_PROFILE_MULTIMAP_H 1 - -#include -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - /// Class std::multimap wrapper with performance instrumentation. - template, - typename _Allocator = std::allocator > > - class multimap - : public _GLIBCXX_STD_C::multimap<_Key, _Tp, _Compare, _Allocator>, - public _Ordered_profile > - { - typedef _GLIBCXX_STD_C::multimap<_Key, _Tp, _Compare, _Allocator> _Base; - - typedef typename _Base::iterator _Base_iterator; - typedef typename _Base::const_iterator _Base_const_iterator; - - public: - // types: - typedef _Key key_type; - typedef _Tp mapped_type; - typedef std::pair value_type; - typedef _Compare key_compare; - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - - typedef __iterator_tracker<_Base_iterator, - multimap> iterator; - typedef __iterator_tracker<_Base_const_iterator, - multimap> const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - typedef typename _Base::size_type size_type; - typedef typename _Base::difference_type difference_type; - - // 23.3.1.1 construct/copy/destroy: - -#if __cplusplus < 201103L - multimap() - : _Base() { } - multimap(const multimap& __x) - : _Base(__x) { } - ~multimap() { } -#else - multimap() = default; - multimap(const multimap&) = default; - multimap(multimap&&) = default; - ~multimap() = default; -#endif - - explicit multimap(const _Compare& __comp, - const _Allocator& __a = _Allocator()) - : _Base(__comp, __a) { } - -#if __cplusplus >= 201103L - template> -#else - template -#endif - multimap(_InputIterator __first, _InputIterator __last, - const _Compare& __comp = _Compare(), - const _Allocator& __a = _Allocator()) - : _Base(__first, __last, __comp, __a) { } - -#if __cplusplus >= 201103L - multimap(initializer_list __l, - const _Compare& __c = _Compare(), - const _Allocator& __a = _Allocator()) - : _Base(__l, __c, __a) { } - - explicit - multimap(const _Allocator& __a) - : _Base(__a) { } - - multimap(const multimap& __x, const _Allocator& __a) - : _Base(__x, __a) { } - - multimap(multimap&& __x, const _Allocator& __a) - noexcept( noexcept(_Base(std::move(__x), __a)) ) - : _Base(std::move(__x), __a) { } - - multimap(initializer_list __l, const _Allocator& __a) - : _Base(__l, __a) { } - - template - multimap(_InputIterator __first, _InputIterator __last, - const _Allocator& __a) - : _Base(__first, __last, __a) { } -#endif - - multimap(const _Base& __x) - : _Base(__x) { } - -#if __cplusplus < 201103L - multimap& - operator=(const multimap& __x) - { - this->_M_profile_destruct(); - _M_base() = __x; - this->_M_profile_construct(); - return *this; - } -#else - multimap& - operator=(const multimap&) = default; - - multimap& - operator=(multimap&&) = default; - - multimap& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } -#endif - - // iterators - iterator - begin() _GLIBCXX_NOEXCEPT - { return iterator(_Base::begin(), this); } - - const_iterator - begin() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::begin(), this); } - - iterator - end() _GLIBCXX_NOEXCEPT - { return iterator(_Base::end(), this); } - - const_iterator - end() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::end(), this); } - -#if __cplusplus >= 201103L - const_iterator - cbegin() const noexcept - { return const_iterator(_Base::cbegin(), this); } - - const_iterator - cend() const noexcept - { return const_iterator(_Base::cend(), this); } -#endif - - reverse_iterator - rbegin() _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return reverse_iterator(end()); - } - - const_reverse_iterator - rbegin() const _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(end()); - } - - reverse_iterator - rend() _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return reverse_iterator(begin()); - } - - const_reverse_iterator - rend() const _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(begin()); - } - -#if __cplusplus >= 201103L - const_reverse_iterator - crbegin() const noexcept - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(cend()); - } - - const_reverse_iterator - crend() const noexcept - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(cbegin()); - } -#endif - - // modifiers: -#if __cplusplus >= 201103L - template - iterator - emplace(_Args&&... __args) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::emplace(std::forward<_Args>(__args)...), this); - } - - template - iterator - emplace_hint(const_iterator __pos, _Args&&... __args) - { - auto size_before = this->size(); - auto __res - = _Base::emplace_hint(__pos.base(), std::forward<_Args>(__args)...); - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } -#endif - - iterator - insert(const value_type& __x) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::insert(__x), this); - } - -#if __cplusplus >= 201103L - template::value>::type> - iterator - insert(_Pair&& __x) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::insert(std::forward<_Pair>(__x)), this); - } -#endif - -#if __cplusplus >= 201103L - void - insert(std::initializer_list __list) - { insert(__list.begin(), __list.end()); } -#endif - - iterator -#if __cplusplus >= 201103L - insert(const_iterator __pos, const value_type& __x) -#else - insert(iterator __pos, const value_type& __x) -#endif - { - size_type size_before = this->size(); - _Base_iterator __res = _Base::insert(__pos.base(), __x); - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } - -#if __cplusplus >= 201103L - template::value>::type> - iterator - insert(const_iterator __pos, _Pair&& __x) - { - size_type size_before = this->size(); - auto __res = _Base::insert(__pos.base(), std::forward<_Pair>(__x)); - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } -#endif - - template - void - insert(_InputIterator __first, _InputIterator __last) - { - for (; __first != __last; ++__first) - insert(*__first); - } - -#if __cplusplus >= 201103L - iterator - erase(const_iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::erase(__pos.base()), this); - } - - iterator - erase(iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::erase(__pos.base()), this); - } -#else - void - erase(iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - _Base::erase(__pos.base()); - } -#endif - - size_type - erase(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return _Base::erase(__x); - } - -#if __cplusplus >= 201103L - iterator - erase(const_iterator __first, const_iterator __last) - { - if (__first != __last) - { - iterator __ret; - for (; __first != __last;) - __ret = erase(__first++); - return __ret; - } - else - return iterator(_Base::erase(__first.base(), __last.base()), this); - } -#else - void - erase(iterator __first, iterator __last) - { - for (; __first != __last;) - erase(__first++); - } -#endif - - void - swap(multimap& __x) - _GLIBCXX_NOEXCEPT_IF( noexcept(declval<_Base&>().swap(__x)) ) - { - std::swap(this->_M_map2umap_info, __x._M_map2umap_info); - _Base::swap(__x); - } - - void - clear() _GLIBCXX_NOEXCEPT - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - // 23.3.1.3 multimap operations: - iterator - find(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return iterator(_Base::find(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - find(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return { _Base::find(__x), this }; - } -#endif - - const_iterator - find(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return const_iterator(_Base::find(__x), this); - } - -#if __cplusplus > 201103L - template::type> - const_iterator - find(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return { _Base::find(__x), this }; - } -#endif - - size_type - count(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::count(__x); - } - -#if __cplusplus > 201103L - template::type> - size_type - count(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::count(__x); - } -#endif - - iterator - lower_bound(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return iterator(_Base::lower_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - lower_bound(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::lower_bound(__x), this }; - } -#endif - - const_iterator - lower_bound(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_iterator(_Base::lower_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - const_iterator - lower_bound(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::lower_bound(__x), this }; - } -#endif - - iterator - upper_bound(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return iterator(_Base::upper_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - upper_bound(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::upper_bound(__x), this }; - } -#endif - - const_iterator - upper_bound(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_iterator(_Base::upper_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - const_iterator - upper_bound(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::upper_bound(__x), this }; - } -#endif - - std::pair - equal_range(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - std::pair<_Base_iterator, _Base_iterator> __base_ret - = _Base::equal_range(__x); - return std::make_pair(iterator(__base_ret.first, this), - iterator(__base_ret.second, this)); - } - -#if __cplusplus > 201103L - template::type> - std::pair - equal_range(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - auto __res = _Base::equal_range(__x); - return { { __res.first, this }, { __res.second, this } }; - } -#endif - - std::pair - equal_range(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - std::pair<_Base_const_iterator, _Base_const_iterator> __base_ret - = _Base::equal_range(__x); - return std::make_pair(const_iterator(__base_ret.first, this), - const_iterator(__base_ret.second, this)); - } - -#if __cplusplus > 201103L - template::type> - std::pair - equal_range(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - auto __res = _Base::equal_range(__x); - return { { __res.first, this }, { __res.second, this } }; - } -#endif - - _Base& - _M_base() _GLIBCXX_NOEXCEPT { return *this; } - - const _Base& - _M_base() const _GLIBCXX_NOEXCEPT { return *this; } - - private: - /** If hint is used we consider that the map and unordered_map - * operations have equivalent insertion cost so we do not update metrics - * about it. - * Note that to find out if hint has been used is libstdc++ - * implementation dependent. - */ - bool - _M_hint_used(_Base_const_iterator __hint, _Base_iterator __res) - { - return (__hint == __res - || (__hint == _M_base().end() && ++__res == _M_base().end()) - || (__hint != _M_base().end() && (++__hint == __res - || ++__res == --__hint))); - } - - template - friend bool - operator==(const multimap<_K1, _T1, _C1, _A1>&, - const multimap<_K1, _T1, _C1, _A1>&); - - template - friend bool - operator<(const multimap<_K1, _T1, _C1, _A1>&, - const multimap<_K1, _T1, _C1, _A1>&); - }; - - template - inline bool - operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __lhs, - const multimap<_Key, _Tp, _Compare, _Allocator>& __rhs) - { - __profcxx_map2umap_invalidate(__lhs._M_map2umap_info); - __profcxx_map2umap_invalidate(__rhs._M_map2umap_info); - return __lhs._M_base() == __rhs._M_base(); - } - - template - inline bool - operator<(const multimap<_Key, _Tp, _Compare, _Allocator>& __lhs, - const multimap<_Key, _Tp, _Compare, _Allocator>& __rhs) - { - __profcxx_map2umap_invalidate(__lhs._M_map2umap_info); - __profcxx_map2umap_invalidate(__rhs._M_map2umap_info); - return __lhs._M_base() < __rhs._M_base(); - } - - template - inline bool - operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __lhs, - const multimap<_Key, _Tp, _Compare, _Allocator>& __rhs) - { return !(__lhs == __rhs); } - - template - inline bool - operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __lhs, - const multimap<_Key, _Tp, _Compare, _Allocator>& __rhs) - { return !(__rhs < __lhs); } - - template - inline bool - operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __lhs, - const multimap<_Key, _Tp, _Compare, _Allocator>& __rhs) - { return !(__lhs < __rhs); } - - template - inline bool - operator>(const multimap<_Key, _Tp, _Compare, _Allocator>& __lhs, - const multimap<_Key, _Tp, _Compare, _Allocator>& __rhs) - { return __rhs < __lhs; } - - template - inline void - swap(multimap<_Key, _Tp, _Compare, _Allocator>& __lhs, - multimap<_Key, _Tp, _Compare, _Allocator>& __rhs) - _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs))) - { __lhs.swap(__rhs); } - -} // namespace __profile -} // namespace std - -#endif diff --git a/libstdc++-v3/include/profile/multiset.h b/libstdc++-v3/include/profile/multiset.h deleted file mode 100644 index dcf7bc84cdd..00000000000 --- a/libstdc++-v3/include/profile/multiset.h +++ /dev/null @@ -1,647 +0,0 @@ -// Profiling multiset implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file profile/multiset.h - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_MULTISET_H -#define _GLIBCXX_PROFILE_MULTISET_H 1 - -#include -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - /// Class std::multiset wrapper with performance instrumentation. - template, - typename _Allocator = std::allocator<_Key> > - class multiset - : public _GLIBCXX_STD_C::multiset<_Key, _Compare, _Allocator>, - public _Ordered_profile > - { - typedef _GLIBCXX_STD_C::multiset<_Key, _Compare, _Allocator> _Base; - - typedef typename _Base::iterator _Base_iterator; - typedef typename _Base::const_iterator _Base_const_iterator; - - public: - // types: - typedef _Key key_type; - typedef _Key value_type; - typedef _Compare key_compare; - typedef _Compare value_compare; - typedef _Allocator allocator_type; - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - - typedef __iterator_tracker<_Base_iterator, - multiset> iterator; - typedef __iterator_tracker<_Base_const_iterator, - multiset> const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - typedef typename _Base::size_type size_type; - typedef typename _Base::difference_type difference_type; - - // 23.3.3.1 construct/copy/destroy: - -#if __cplusplus < 201103L - multiset() - : _Base() { } - multiset(const multiset& __x) - : _Base(__x) { } - ~multiset() { } -#else - multiset() = default; - multiset(const multiset&) = default; - multiset(multiset&&) = default; - ~multiset() = default; -#endif - - explicit multiset(const _Compare& __comp, - const _Allocator& __a = _Allocator()) - : _Base(__comp, __a) { } - -#if __cplusplus >= 201103L - template> -#else - template -#endif - multiset(_InputIterator __first, _InputIterator __last, - const _Compare& __comp = _Compare(), - const _Allocator& __a = _Allocator()) - : _Base(__first, __last, __comp, __a) { } - -#if __cplusplus >= 201103L - multiset(initializer_list __l, - const _Compare& __comp = _Compare(), - const allocator_type& __a = allocator_type()) - : _Base(__l, __comp, __a) { } - - explicit - multiset(const allocator_type& __a) - : _Base(__a) { } - - multiset(const multiset& __x, const allocator_type& __a) - : _Base(__x, __a) { } - - multiset(multiset&& __x, const allocator_type& __a) - noexcept( noexcept(_Base(std::move(__x), __a)) ) - : _Base(std::move(__x), __a) { } - - multiset(initializer_list __l, const allocator_type& __a) - : _Base(__l, __a) { } - - template - multiset(_InputIterator __first, _InputIterator __last, - const allocator_type& __a) - : _Base(__first, __last, __a) { } -#endif - - multiset(const _Base& __x) - : _Base(__x) { } - -#if __cplusplus < 201103L - multiset& - operator=(const multiset& __x) - { - this->_M_profile_destruct(); - _M_base() = __x; - this->_M_profile_construct(); - return *this; - } -#else - multiset& - operator=(const multiset&) = default; - - multiset& - operator=(multiset&&) = default; - - multiset& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } -#endif - - // iterators - iterator - begin() _GLIBCXX_NOEXCEPT - { return iterator(_Base::begin(), this); } - - const_iterator - begin() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::begin(), this); } - - iterator - end() _GLIBCXX_NOEXCEPT - { return iterator(_Base::end(), this); } - - const_iterator - end() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::end(), this); } - -#if __cplusplus >= 201103L - const_iterator - cbegin() const noexcept - { return const_iterator(_Base::cbegin(), this); } - - const_iterator - cend() const noexcept - { return const_iterator(_Base::cend(), this); } -#endif - - reverse_iterator - rbegin() _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return reverse_iterator(end()); - } - - const_reverse_iterator - rbegin() const _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(end()); - } - - reverse_iterator - rend() _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return reverse_iterator(begin()); - } - - const_reverse_iterator - rend() const _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(begin()); - } - -#if __cplusplus >= 201103L - const_reverse_iterator - crbegin() const noexcept - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(cend()); - } - - const_reverse_iterator - crend() const noexcept - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(cbegin()); - } -#endif - - void - swap(multiset& __x) - _GLIBCXX_NOEXCEPT_IF( noexcept(declval<_Base&>().swap(__x)) ) - { - _Base::swap(__x); - this->_M_swap(__x); - } - - // modifiers: -#if __cplusplus >= 201103L - template - iterator - emplace(_Args&&... __args) - { - // The cost is the same whether or not the element is inserted so we - // always report insertion of 1 element. - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::emplace(std::forward<_Args>(__args)...), this); - } - - template - iterator - emplace_hint(const_iterator __pos, _Args&&... __args) - { - auto size_before = this->size(); - auto __res - = _Base::emplace_hint(__pos.base(), std::forward<_Args>(__args)...); - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } -#endif - - iterator - insert(const value_type& __x) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::insert(__x), this); - } - -#if __cplusplus >= 201103L - iterator - insert(value_type&& __x) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::insert(std::move(__x)), this); - } -#endif - - iterator - insert(const_iterator __pos, const value_type& __x) - { - size_type size_before = this->size(); - _Base_iterator __res = _Base::insert(__pos.base(), __x); - - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } - -#if __cplusplus >= 201103L - iterator - insert(const_iterator __pos, value_type&& __x) - { - auto size_before = this->size(); - auto __res = _Base::insert(__pos.base(), std::move(__x)); - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } -#endif - -#if __cplusplus >= 201103L - template> -#else - template -#endif - void - insert(_InputIterator __first, _InputIterator __last) - { - for (; __first != __last; ++__first) - insert(*__first); - } - -#if __cplusplus >= 201103L - void - insert(initializer_list __l) - { insert(__l.begin(), __l.end()); } -#endif - -#if __cplusplus >= 201103L - iterator - erase(const_iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::erase(__pos.base()), this); - } -#else - void - erase(iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - _Base::erase(__pos.base()); - } -#endif - - size_type - erase(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return _Base::erase(__x); - } - -#if __cplusplus >= 201103L - iterator - erase(const_iterator __first, const_iterator __last) - { - if (__first != __last) - { - iterator __ret; - for (; __first != __last;) - __ret = erase(__first++); - return __ret; - } - else - return iterator(_Base::erase(__first.base(), __last.base()), this); - } -#else - void - erase(iterator __first, iterator __last) - { - for (; __first != __last;) - erase(__first++); - } -#endif - - void - clear() _GLIBCXX_NOEXCEPT - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - size_type - count(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::count(__x); - } - -#if __cplusplus > 201103L - template::type> - size_type - count(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::count(__x); - } -#endif - - // multiset operations: - iterator - find(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return iterator(_Base::find(__x), this); - } - - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 214. set::find() missing const overload - const_iterator - find(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return const_iterator(_Base::find(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - find(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return { _Base::find(__x), this }; - } - - template::type> - const_iterator - find(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return { _Base::find(__x), this }; - } -#endif - - iterator - lower_bound(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return iterator(_Base::lower_bound(__x), this); - } - - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 214. set::find() missing const overload - const_iterator - lower_bound(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_iterator(_Base::lower_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - lower_bound(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::lower_bound(__x), this }; - } - - template::type> - const_iterator - lower_bound(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::lower_bound(__x), this }; - } -#endif - - iterator - upper_bound(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return iterator(_Base::upper_bound(__x), this); - } - - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 214. set::find() missing const overload - const_iterator - upper_bound(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_iterator(_Base::upper_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - upper_bound(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::upper_bound(__x), this }; - } - - template::type> - const_iterator - upper_bound(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::upper_bound(__x), this }; - } -#endif - - std::pair - equal_range(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - std::pair<_Base_iterator, _Base_iterator> __base_ret - = _Base::equal_range(__x); - return std::make_pair(iterator(__base_ret.first, this), - iterator(__base_ret.second, this)); - } - - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 214. set::find() missing const overload - std::pair - equal_range(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - std::pair<_Base_const_iterator, _Base_const_iterator> __base_ret - = _Base::equal_range(__x); - return std::make_pair(const_iterator(__base_ret.first, this), - const_iterator(__base_ret.second, this)); - } - -#if __cplusplus > 201103L - template::type> - std::pair - equal_range(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - auto __res = _Base::equal_range(__x); - return { { __res.first, this }, { __res.second, this } }; - } - - template::type> - std::pair - equal_range(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - auto __res = _Base::equal_range(__x); - return { { __res.first, this }, { __res.second, this } }; - } -#endif - - _Base& - _M_base() _GLIBCXX_NOEXCEPT { return *this; } - - const _Base& - _M_base() const _GLIBCXX_NOEXCEPT { return *this; } - - private: - /** If hint is used we consider that the map and unordered_map - * operations have equivalent insertion cost so we do not update metrics - * about it. - * Note that to find out if hint has been used is libstdc++ - * implementation dependent. - */ - bool - _M_hint_used(_Base_const_iterator __hint, _Base_iterator __res) - { - return (__hint == __res - || (__hint == _M_base().end() && ++__res == _M_base().end()) - || (__hint != _M_base().end() && (++__hint == __res - || ++__res == --__hint))); - } - - template - friend bool - operator==(const multiset<_K1, _C1, _A1>&, - const multiset<_K1, _C1, _A1>&); - - template - friend bool - operator< (const multiset<_K1, _C1, _A1>&, - const multiset<_K1, _C1, _A1>&); - }; - - template - inline bool - operator==(const multiset<_Key, _Compare, _Allocator>& __lhs, - const multiset<_Key, _Compare, _Allocator>& __rhs) - { - __profcxx_map2umap_invalidate(__lhs._M_map2umap_info); - __profcxx_map2umap_invalidate(__rhs._M_map2umap_info); - return __lhs._M_base() == __rhs._M_base(); - } - - template - inline bool - operator<(const multiset<_Key, _Compare, _Allocator>& __lhs, - const multiset<_Key, _Compare, _Allocator>& __rhs) - { - __profcxx_map2umap_invalidate(__lhs._M_map2umap_info); - __profcxx_map2umap_invalidate(__rhs._M_map2umap_info); - return __lhs._M_base() < __rhs._M_base(); - } - - template - inline bool - operator!=(const multiset<_Key, _Compare, _Allocator>& __lhs, - const multiset<_Key, _Compare, _Allocator>& __rhs) - { return !(__lhs == __rhs); } - - template - inline bool - operator<=(const multiset<_Key, _Compare, _Allocator>& __lhs, - const multiset<_Key, _Compare, _Allocator>& __rhs) - { return !(__rhs < __lhs); } - - template - inline bool - operator>=(const multiset<_Key, _Compare, _Allocator>& __lhs, - const multiset<_Key, _Compare, _Allocator>& __rhs) - { return !(__lhs < __rhs); } - - template - inline bool - operator>(const multiset<_Key, _Compare, _Allocator>& __lhs, - const multiset<_Key, _Compare, _Allocator>& __rhs) - { return __rhs < __lhs; } - - template - void - swap(multiset<_Key, _Compare, _Allocator>& __x, - multiset<_Key, _Compare, _Allocator>& __y) - _GLIBCXX_NOEXCEPT_IF(noexcept(__x.swap(__y))) - { return __x.swap(__y); } - -} // namespace __profile -} // namespace std - -#endif diff --git a/libstdc++-v3/include/profile/ordered_base.h b/libstdc++-v3/include/profile/ordered_base.h deleted file mode 100644 index ceee4553cff..00000000000 --- a/libstdc++-v3/include/profile/ordered_base.h +++ /dev/null @@ -1,100 +0,0 @@ -// Profiling unordered containers implementation details -*- C++ -*- - -// Copyright (C) 2014-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/ordered_base.h - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_ORDERED -#define _GLIBCXX_PROFILE_ORDERED 1 - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - template - class _Ordered_profile - { - public: - void - _M_profile_iterate(int __rewind = 0) const - { __profcxx_map2umap_iterate(this->_M_map2umap_info, __rewind); } - - protected: - _Ordered_profile() _GLIBCXX_NOEXCEPT - { _M_profile_construct(); } - -#if __cplusplus >= 201103L - _Ordered_profile(const _Ordered_profile&) noexcept - : _Ordered_profile() { } - _Ordered_profile(_Ordered_profile&& __other) noexcept - : _Ordered_profile() - { _M_swap(__other); } - - _Ordered_profile& - operator=(const _Ordered_profile&) noexcept - { - _M_profile_destruct(); - _M_profile_construct(); - } - - _Ordered_profile& - operator=(_Ordered_profile&& __other) noexcept - { - _M_swap(__other); - - __other._M_profile_destruct(); - __other._M_profile_construct(); - } -#endif - - ~_Ordered_profile() - { _M_profile_destruct(); } - - void - _M_profile_construct() _GLIBCXX_NOEXCEPT - { _M_map2umap_info = __profcxx_map2umap_construct(); } - - void - _M_profile_destruct() _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_destruct(_M_map2umap_info); - _M_map2umap_info = 0; - } - - void - _M_swap(_Ordered_profile& __other) - { std::swap(_M_map2umap_info, __other._M_map2umap_info); } - - __gnu_profile::__map2umap_info* _M_map2umap_info; - - private: - _Cont& - _M_conjure() - { return *static_cast<_Cont*>(this); } - }; - -} // namespace __profile -} // namespace std - -#endif diff --git a/libstdc++-v3/include/profile/set b/libstdc++-v3/include/profile/set deleted file mode 100644 index 14fc9ddd242..00000000000 --- a/libstdc++-v3/include/profile/set +++ /dev/null @@ -1,35 +0,0 @@ -// Profiling set/multiset implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/set - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_SET -#define _GLIBCXX_PROFILE_SET 1 - -#include -#include -#include - -#endif diff --git a/libstdc++-v3/include/profile/set.h b/libstdc++-v3/include/profile/set.h deleted file mode 100644 index 18f9c7440c4..00000000000 --- a/libstdc++-v3/include/profile/set.h +++ /dev/null @@ -1,628 +0,0 @@ -// Profiling set implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. - -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file profile/set.h - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_SET_H -#define _GLIBCXX_PROFILE_SET_H 1 - -#include -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - /// Class std::set wrapper with performance instrumentation. - template, - typename _Allocator = std::allocator<_Key> > - class set - : public _GLIBCXX_STD_C::set<_Key,_Compare,_Allocator>, - public _Ordered_profile > - { - typedef _GLIBCXX_STD_C::set<_Key, _Compare, _Allocator> _Base; - - typedef typename _Base::iterator _Base_iterator; - typedef typename _Base::const_iterator _Base_const_iterator; - - public: - // types: - typedef _Key key_type; - typedef _Key value_type; - typedef _Compare key_compare; - typedef _Compare value_compare; - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - - typedef __iterator_tracker<_Base_iterator, set> iterator; - typedef __iterator_tracker<_Base_const_iterator, - set> const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - typedef typename _Base::size_type size_type; - typedef typename _Base::difference_type difference_type; - - // 23.3.3.1 construct/copy/destroy: -#if __cplusplus < 201103L - set() - : _Base() { } - set(const set& __x) - : _Base(__x) { } - ~set() { } -#else - set() = default; - set(const set&) = default; - set(set&&) = default; - ~set() = default; -#endif - - explicit set(const _Compare& __comp, - const _Allocator& __a = _Allocator()) - : _Base(__comp, __a) { } - -#if __cplusplus >= 201103L - template> -#else - template -#endif - set(_InputIterator __first, _InputIterator __last, - const _Compare& __comp = _Compare(), - const _Allocator& __a = _Allocator()) - : _Base(__first, __last, __comp, __a) { } - -#if __cplusplus >= 201103L - set(initializer_list __l, - const _Compare& __comp = _Compare(), - const _Allocator& __a = _Allocator()) - : _Base(__l, __comp, __a) { } - - explicit - set(const _Allocator& __a) - : _Base(__a) { } - - set(const set& __x, const _Allocator& __a) - : _Base(__x, __a) { } - - set(set&& __x, const _Allocator& __a) - noexcept( noexcept(_Base(std::move(__x), __a)) ) - : _Base(std::move(__x), __a) { } - - set(initializer_list __l, const _Allocator& __a) - : _Base(__l, __a) { } - - template - set(_InputIterator __first, _InputIterator __last, - const _Allocator& __a) - : _Base(__first, __last, __a) { } -#endif - - set(const _Base& __x) - : _Base(__x) { } - -#if __cplusplus < 201103L - set& - operator=(const set& __x) - { - this->_M_profile_destruct(); - _M_base() = __x; - this->_M_profile_construct(); - return *this; - } -#else - set& - operator=(const set&) = default; - - set& - operator=(set&&) = default; - - set& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } -#endif - - // iterators - iterator - begin() _GLIBCXX_NOEXCEPT - { return iterator(_Base::begin(), this); } - - const_iterator - begin() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::begin(), this); } - - iterator - end() _GLIBCXX_NOEXCEPT - { return iterator(_Base::end(), this); } - - const_iterator - end() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::end(), this); } - -#if __cplusplus >= 201103L - const_iterator - cbegin() const noexcept - { return const_iterator(_Base::cbegin(), this); } - - const_iterator - cend() const noexcept - { return const_iterator(_Base::cend(), this); } -#endif - - reverse_iterator - rbegin() _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return reverse_iterator(end()); - } - - const_reverse_iterator - rbegin() const _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(end()); - } - - reverse_iterator - rend() _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return reverse_iterator(begin()); - } - - const_reverse_iterator - rend() const _GLIBCXX_NOEXCEPT - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(begin()); - } - -#if __cplusplus >= 201103L - const_reverse_iterator - crbegin() const noexcept - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(cend()); - } - - const_reverse_iterator - crend() const noexcept - { - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_reverse_iterator(cbegin()); - } -#endif - - void - swap(set& __x) - _GLIBCXX_NOEXCEPT_IF( noexcept(declval<_Base&>().swap(__x)) ) - { - _Base::swap(__x); - this->_M_swap(__x); - } - - // modifiers: -#if __cplusplus >= 201103L - template - std::pair - emplace(_Args&&... __args) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - auto __base_ret = _Base::emplace(std::forward<_Args>(__args)...); - return std::make_pair(iterator(__base_ret.first, this), - __base_ret.second); - } - - template - iterator - emplace_hint(const_iterator __pos, _Args&&... __args) - { - auto size_before = this->size(); - auto __res - = _Base::emplace_hint(__pos.base(), std::forward<_Args>(__args)...); - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } -#endif - - std::pair - insert(const value_type& __x) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - std::pair<_Base_iterator, bool> __base_ret = _Base::insert(__x); - return std::make_pair(iterator(__base_ret.first, this), - __base_ret.second); - } - -#if __cplusplus >= 201103L - std::pair - insert(value_type&& __x) - { - __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1); - std::pair<_Base_iterator, bool> __base_ret - = _Base::insert(std::move(__x)); - return std::make_pair(iterator(__base_ret.first, this), - __base_ret.second); - } -#endif - - iterator - insert(const_iterator __pos, const value_type& __x) - { - size_type size_before = this->size(); - _Base_iterator __res = _Base::insert(__pos.base(), __x); - __profcxx_map2umap_insert(this->_M_map2umap_info, - size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1); - return iterator(__res, this); - } - -#if __cplusplus >= 201103L - iterator - insert(const_iterator __pos, value_type&& __x) - { return iterator(_Base::insert(__pos.base(), std::move(__x)), this); } -#endif - - template - void - insert(_InputIterator __first, _InputIterator __last) - { - for (; __first != __last; ++__first) - insert(*__first); - } - -#if __cplusplus >= 201103L - void - insert(initializer_list __l) - { insert(__l.begin(), __l.end()); } -#endif - -#if __cplusplus >= 201103L - iterator - erase(const_iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return iterator(_Base::erase(__pos.base()), this); - } -#else - void - erase(iterator __pos) - { - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - _Base::erase(__pos.base()); - } -#endif - - size_type - erase(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1); - return _Base::erase(__x); - } - -#if __cplusplus >= 201103L - iterator - erase(const_iterator __first, const_iterator __last) - { - if (__first != __last) - { - iterator __ret; - for (; __first != __last;) - __ret = erase(__first++); - return __ret; - } - - return iterator(_Base::erase(__first.base(), __last.base()), this); - } -#else - void - erase(iterator __first, iterator __last) - { - for (; __first != __last;) - erase(__first++); - } -#endif - - void - clear() _GLIBCXX_NOEXCEPT - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - size_type - count(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::count(__x); - } - -#if __cplusplus > 201103L - template::type> - size_type - count(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return _Base::count(__x); - } -#endif - - // set operations: - iterator - find(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return iterator(_Base::find(__x), this); - } - - const_iterator - find(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return const_iterator(_Base::find(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - find(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return { _Base::find(__x), this }; - } - - template::type> - const_iterator - find(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - return { _Base::find(__x), this }; - } -#endif - - iterator - lower_bound(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return iterator(_Base::lower_bound(__x), this); - } - - const_iterator - lower_bound(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_iterator(_Base::lower_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - lower_bound(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::lower_bound(__x), this }; - } - - template::type> - const_iterator - lower_bound(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::lower_bound(__x), this }; - } -#endif - - iterator - upper_bound(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return iterator(_Base::upper_bound(__x), this); - } - - const_iterator - upper_bound(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return const_iterator(_Base::upper_bound(__x), this); - } - -#if __cplusplus > 201103L - template::type> - iterator - upper_bound(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::upper_bound(__x), this }; - } - - template::type> - const_iterator - upper_bound(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - __profcxx_map2umap_invalidate(this->_M_map2umap_info); - return { _Base::upper_bound(__x), this }; - } -#endif - - std::pair - equal_range(const key_type& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - std::pair<_Base_iterator, _Base_iterator> __base_ret - = _Base::equal_range(__x); - return std::make_pair(iterator(__base_ret.first, this), - iterator(__base_ret.second, this)); - } - - std::pair - equal_range(const key_type& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - std::pair<_Base_const_iterator, _Base_const_iterator> __base_ret - = _Base::equal_range(__x); - return std::make_pair(const_iterator(__base_ret.first, this), - const_iterator(__base_ret.second, this)); - } - -#if __cplusplus > 201103L - template::type> - std::pair - equal_range(const _Kt& __x) - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - auto __res = _Base::equal_range(__x); - return { { __res.first, this }, { __res.second, this } }; - } - - template::type> - std::pair - equal_range(const _Kt& __x) const - { - __profcxx_map2umap_find(this->_M_map2umap_info, this->size()); - auto __res = _Base::equal_range(__x); - return { { __res.first, this }, { __res.second, this } }; - } -#endif - - _Base& - _M_base() _GLIBCXX_NOEXCEPT { return *this; } - - const _Base& - _M_base() const _GLIBCXX_NOEXCEPT { return *this; } - - private: - /** If hint is used we consider that the map and unordered_map - * operations have equivalent insertion cost so we do not update metrics - * about it. - * Note that to find out if hint has been used is libstdc++ - * implementation dependent. - */ - bool - _M_hint_used(_Base_const_iterator __hint, _Base_iterator __res) - { - return (__hint == __res - || (__hint == _M_base().end() && ++__res == _M_base().end()) - || (__hint != _M_base().end() && (++__hint == __res - || ++__res == --__hint))); - } - - template - friend bool - operator==(const set<_K1, _C1, _A1>&, const set<_K1, _C1, _A1>&); - - template - friend bool - operator<(const set<_K1, _C1, _A1>&, const set<_K1, _C1, _A1>&); - }; - - template - inline bool - operator==(const set<_Key, _Compare, _Allocator>& __lhs, - const set<_Key, _Compare, _Allocator>& __rhs) - { - __profcxx_map2umap_invalidate(__lhs._M_map2umap_info); - __profcxx_map2umap_invalidate(__rhs._M_map2umap_info); - return __lhs._M_base() == __rhs._M_base(); - } - - template - inline bool - operator<(const set<_Key, _Compare, _Allocator>& __lhs, - const set<_Key, _Compare, _Allocator>& __rhs) - { - __profcxx_map2umap_invalidate(__lhs._M_map2umap_info); - __profcxx_map2umap_invalidate(__rhs._M_map2umap_info); - return __lhs._M_base() < __rhs._M_base(); - } - - template - inline bool - operator!=(const set<_Key, _Compare, _Allocator>& __lhs, - const set<_Key, _Compare, _Allocator>& __rhs) - { return !(__lhs == __rhs); } - - template - inline bool - operator<=(const set<_Key, _Compare, _Allocator>& __lhs, - const set<_Key, _Compare, _Allocator>& __rhs) - { return !(__rhs < __lhs); } - - template - inline bool - operator>=(const set<_Key, _Compare, _Allocator>& __lhs, - const set<_Key, _Compare, _Allocator>& __rhs) - { return !(__lhs < __rhs); } - - template - inline bool - operator>(const set<_Key, _Compare, _Allocator>& __lhs, - const set<_Key, _Compare, _Allocator>& __rhs) - { return __rhs < __lhs; } - - template - void - swap(set<_Key, _Compare, _Allocator>& __x, - set<_Key, _Compare, _Allocator>& __y) - _GLIBCXX_NOEXCEPT_IF(noexcept(__x.swap(__y))) - { return __x.swap(__y); } - -} // namespace __profile -} // namespace std - -#endif diff --git a/libstdc++-v3/include/profile/unordered_base.h b/libstdc++-v3/include/profile/unordered_base.h deleted file mode 100644 index 200f4e047fe..00000000000 --- a/libstdc++-v3/include/profile/unordered_base.h +++ /dev/null @@ -1,308 +0,0 @@ -// Profiling unordered containers implementation details -*- C++ -*- - -// Copyright (C) 2013-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/unordered_base.h - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_UNORDERED -#define _GLIBCXX_PROFILE_UNORDERED 1 - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - template - struct _Bucket_index_helper; - - template - struct _Bucket_index_helper<_UnorderedCont, _Value, true> - { - static std::size_t - bucket(const _UnorderedCont& __uc, - const __detail::_Hash_node<_Value, true>* __node) - { return __node->_M_hash_code % __uc.bucket_count(); } - }; - - template - struct _Bucket_index_helper<_UnorderedCont, _Value, false> - { - static std::size_t - bucket(const _UnorderedCont& __uc, - const __detail::_Hash_node<_Value, false>* __node) - { return __uc.bucket(__node->_M_v()); } - }; - - template - struct _Bucket_index_helper<_UnorderedCont, - std::pair, false> - { - typedef std::pair _Value; - - static std::size_t - bucket(const _UnorderedCont& __uc, - const __detail::_Hash_node<_Value, false>* __node) - { return __uc.bucket(__node->_M_v().first); } - }; - - template - std::size_t - __get_bucket_index(const _UnorderedCont& __uc, - const __detail::_Hash_node<_Value, _Cache_hash_code>* __node) - { - using __bucket_index_helper - = _Bucket_index_helper<_UnorderedCont, _Value, _Cache_hash_code>; - return __bucket_index_helper::bucket(__uc, __node); - } - - template - struct _Equal_helper; - - template - struct _Equal_helper<_UnorderedCont, _Value, true> - { - static std::size_t - are_equal(const _UnorderedCont& __uc, - const __detail::_Hash_node<_Value, true>* __lhs, - const __detail::_Hash_node<_Value, true>* __rhs) - { - return __lhs->_M_hash_code == __rhs->_M_hash_code - && __uc.key_eq()(__lhs->_M_v(), __rhs->_M_v()); - } - }; - - template - struct _Equal_helper<_UnorderedCont, _Value, false> - { - static std::size_t - are_equal(const _UnorderedCont& __uc, - const __detail::_Hash_node<_Value, false>* __lhs, - const __detail::_Hash_node<_Value, false>* __rhs) - { return __uc.key_eq()(__lhs->_M_v(), __rhs->_M_v()); } - }; - - template - struct _Equal_helper<_UnorderedCont, std::pair, true> - { - typedef std::pair _Value; - - static std::size_t - are_equal(const _UnorderedCont& __uc, - const __detail::_Hash_node<_Value, true>* __lhs, - const __detail::_Hash_node<_Value, true>* __rhs) - { - return __lhs->_M_hash_code == __rhs->_M_hash_code - && __uc.key_eq()(__lhs->_M_v().first, __rhs->_M_v().first); - } - }; - - template - struct _Equal_helper<_UnorderedCont, std::pair, false> - { - typedef std::pair _Value; - - static std::size_t - are_equal(const _UnorderedCont& __uc, - const __detail::_Hash_node<_Value, false>* __lhs, - const __detail::_Hash_node<_Value, false>* __rhs) - { return __uc.key_eq()(__lhs->_M_v().first, __rhs->_M_v().first); } - }; - - template - bool - __are_equal(const _UnorderedCont& __uc, - const __detail::_Hash_node<_Value, _Cache_hash_code>* __lhs, - const __detail::_Hash_node<_Value, _Cache_hash_code>* __rhs) - { - using __equal_helper - = _Equal_helper<_UnorderedCont, _Value, _Cache_hash_code>; - return __equal_helper::are_equal(__uc, __lhs, __rhs); - } - - template - class _Unordered_profile - { - _UnorderedCont& - _M_conjure() - { return *(static_cast<_UnorderedCont*>(this)); } - - using __unique_keys = std::integral_constant; - - protected: - _Unordered_profile() noexcept - { _M_profile_construct(); } - - _Unordered_profile(const _Unordered_profile&) noexcept - : _Unordered_profile() { } - - _Unordered_profile(_Unordered_profile&& __other) noexcept - : _Unordered_profile() - { _M_swap(__other); } - - ~_Unordered_profile() - { _M_profile_destruct(); } - - _Unordered_profile& - operator=(const _Unordered_profile&) noexcept - { - // Assignment just reset profiling. - _M_profile_destruct(); - _M_profile_construct(); - } - - _Unordered_profile& - operator=(_Unordered_profile&& __other) noexcept - { - // Take profiling of the moved instance... - _M_swap(__other); - - // ...and then reset other instance profiling. - __other._M_profile_destruct(); - __other._M_profile_construct(); - } - - void - _M_profile_construct() noexcept - { - auto& __uc = _M_conjure(); - _M_size_info = __profcxx_hashtable_size_construct(__uc.bucket_count()); - _M_hashfunc_info = __profcxx_hash_func_construct(); - } - - void - _M_profile_destruct() noexcept - { - auto& __uc = _M_conjure(); - __profcxx_hashtable_size_destruct(_M_size_info, - __uc.bucket_count(), __uc.size()); - _M_size_info = 0; - - if (!_M_hashfunc_info) - return; - - _M_profile_destruct(__unique_keys()); - _M_hashfunc_info = 0; - } - - void - _M_swap(_Unordered_profile& __other) noexcept - { - std::swap(_M_size_info, __other._M_size_info); - std::swap(_M_hashfunc_info, __other._M_hashfunc_info); - } - - void - _M_profile_resize(std::size_t __old_size) - { - auto __new_size = _M_conjure().bucket_count(); - if (__old_size != __new_size) - __profcxx_hashtable_size_resize(_M_size_info, __old_size, __new_size); - } - - __gnu_profile::__container_size_info* _M_size_info; - __gnu_profile::__hashfunc_info* _M_hashfunc_info; - - private: - void - _M_profile_destruct(std::true_type); - - void - _M_profile_destruct(std::false_type); - }; - - template - void - _Unordered_profile<_UnorderedCont, _Unique_keys>:: - _M_profile_destruct(std::true_type) - { - auto& __uc = _M_conjure(); - std::size_t __hops = 0, __lc = 0, __chain = 0; - auto __it = __uc.begin(); - while (__it != __uc.end()) - { - auto __bkt = __get_bucket_index(__uc, __it._M_cur); - auto __lit = __uc.begin(__bkt); - auto __lend = __uc.end(__bkt); - for (++__it, ++__lit; __lit != __lend; ++__it, ++__lit) - ++__chain; - - if (__chain) - { - ++__chain; - __lc = __lc > __chain ? __lc : __chain; - __hops += __chain * (__chain - 1) / 2; - __chain = 0; - } - } - - __profcxx_hash_func_destruct(_M_hashfunc_info, - __lc, __uc.size(), __hops); - } - - template - void - _Unordered_profile<_UnorderedCont, _Unique_keys>:: - _M_profile_destruct(std::false_type) - { - auto& __uc = _M_conjure(); - std::size_t __hops = 0, __lc = 0, __chain = 0, __unique_size = 0; - auto __it = __uc.begin(); - while (__it != __uc.end()) - { - auto __bkt = __get_bucket_index(__uc, __it._M_cur); - auto __lit = __uc.begin(__bkt); - auto __lend = __uc.end(__bkt); - auto __pit = __it; - ++__unique_size; - for (++__it, ++__lit; __lit != __lend; ++__it, ++__lit) - { - if (!__are_equal(__uc, __pit._M_cur, __it._M_cur)) - { - ++__chain; - ++__unique_size; - __pit = __it; - } - } - - if (__chain) - { - ++__chain; - __lc = __lc > __chain ? __lc : __chain; - __hops += __chain * (__chain - 1) / 2; - __chain = 0; - } - } - - __profcxx_hash_func_destruct(_M_hashfunc_info, - __lc, __unique_size, __hops); - } - -} // namespace __profile -} // namespace std - -#endif diff --git a/libstdc++-v3/include/profile/unordered_map b/libstdc++-v3/include/profile/unordered_map deleted file mode 100644 index 0e54915a066..00000000000 --- a/libstdc++-v3/include/profile/unordered_map +++ /dev/null @@ -1,586 +0,0 @@ -// Profiling unordered_map/unordered_multimap implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/unordered_map - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_UNORDERED_MAP -#define _GLIBCXX_PROFILE_UNORDERED_MAP 1 - -#if __cplusplus < 201103L -# include -#else -# include - -#include -#include - -#define _GLIBCXX_BASE unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc> -#define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - /// Class std::unordered_map wrapper with performance instrumentation. - template, - typename _Pred = std::equal_to<_Key>, - typename _Alloc = std::allocator > > - class unordered_map - : public _GLIBCXX_STD_BASE, - public _Unordered_profile, - true> - { - typedef typename _GLIBCXX_STD_BASE _Base; - - _Base& - _M_base() noexcept { return *this; } - - const _Base& - _M_base() const noexcept { return *this; } - - public: - typedef typename _Base::size_type size_type; - typedef typename _Base::hasher hasher; - typedef typename _Base::key_equal key_equal; - typedef typename _Base::allocator_type allocator_type; - typedef typename _Base::key_type key_type; - typedef typename _Base::value_type value_type; - typedef typename _Base::difference_type difference_type; - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - typedef typename _Base::mapped_type mapped_type; - - typedef typename _Base::iterator iterator; - typedef typename _Base::const_iterator const_iterator; - - unordered_map() = default; - - explicit - unordered_map(size_type __n, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__n, __hf, __eql, __a) { } - - template - unordered_map(_InputIterator __f, _InputIterator __l, - size_type __n = 0, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__f, __l, __n, __hf, __eql, __a) { } - - unordered_map(const unordered_map&) = default; - - unordered_map(const _Base& __x) - : _Base(__x) { } - - unordered_map(unordered_map&&) = default; - - explicit - unordered_map(const allocator_type& __a) - : _Base(__a) { } - - unordered_map(const unordered_map& __umap, - const allocator_type& __a) - : _Base(__umap, __a) { } - - unordered_map(unordered_map&& __umap, - const allocator_type& __a) - : _Base(std::move(__umap._M_base()), __a) { } - - unordered_map(initializer_list __l, - size_type __n = 0, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__l, __n, __hf, __eql, __a) { } - - unordered_map(size_type __n, const allocator_type& __a) - : unordered_map(__n, hasher(), key_equal(), __a) - { } - - unordered_map(size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_map(__n, __hf, key_equal(), __a) - { } - - template - unordered_map(_InputIterator __first, _InputIterator __last, - size_type __n, - const allocator_type& __a) - : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) - { } - - template - unordered_map(_InputIterator __first, _InputIterator __last, - size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_map(__first, __last, __n, __hf, key_equal(), __a) - { } - - unordered_map(initializer_list __l, - size_type __n, - const allocator_type& __a) - : unordered_map(__l, __n, hasher(), key_equal(), __a) - { } - - unordered_map(initializer_list __l, - size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_map(__l, __n, __hf, key_equal(), __a) - { } - - unordered_map& - operator=(const unordered_map&) = default; - - unordered_map& - operator=(unordered_map&&) = default; - - unordered_map& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } - - void - clear() noexcept - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - template - std::pair - emplace(_Args&&... __args) - { - size_type __old_size = _Base::bucket_count(); - std::pair __res - = _Base::emplace(std::forward<_Args>(__args)...); - this->_M_profile_resize(__old_size); - return __res; - } - - template - iterator - emplace_hint(const_iterator __it, _Args&&... __args) - { - size_type __old_size = _Base::bucket_count(); - iterator __res - = _Base::emplace_hint(__it, std::forward<_Args>(__args)...); - this->_M_profile_resize(__old_size); - return __res; - } - - void - insert(std::initializer_list __l) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__l); - this->_M_profile_resize(__old_size); - } - - std::pair - insert(const value_type& __obj) - { - size_type __old_size = _Base::bucket_count(); - std::pair __res = _Base::insert(__obj); - this->_M_profile_resize(__old_size); - return __res; - } - - iterator - insert(const_iterator __iter, const value_type& __v) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__iter, __v); - this->_M_profile_resize(__old_size); - return __res; - } - - template::value>::type> - std::pair - insert(_Pair&& __obj) - { - size_type __old_size = _Base::bucket_count(); - std::pair __res - = _Base::insert(std::forward<_Pair>(__obj)); - this->_M_profile_resize(__old_size); - return __res; - } - - template::value>::type> - iterator - insert(const_iterator __iter, _Pair&& __v) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__iter, std::forward<_Pair>(__v)); - this->_M_profile_resize(__old_size); - return __res; - } - - template - void - insert(_InputIter __first, _InputIter __last) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__first, __last); - this->_M_profile_resize(__old_size); - } - - // operator[] - mapped_type& - operator[](const _Key& __k) - { - size_type __old_size = _Base::bucket_count(); - mapped_type& __res = _M_base()[__k]; - this->_M_profile_resize(__old_size); - return __res; - } - - mapped_type& - operator[](_Key&& __k) - { - size_type __old_size = _Base::bucket_count(); - mapped_type& __res = _M_base()[std::move(__k)]; - this->_M_profile_resize(__old_size); - return __res; - } - - void - swap(unordered_map& __x) - noexcept( noexcept(__x._M_base().swap(__x)) ) - { - _Base::swap(__x._M_base()); - this->_M_swap(__x); - } - - void rehash(size_type __n) - { - size_type __old_size = _Base::bucket_count(); - _Base::rehash(__n); - this->_M_profile_resize(__old_size); - } - }; - - template - inline void - swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, - unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) - noexcept(noexcept(__x.swap(__y))) - { __x.swap(__y); } - - template - inline bool - operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, - const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) - { return static_cast(__x) == __y; } - - template - inline bool - operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, - const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) - { return !(__x == __y); } - -#undef _GLIBCXX_BASE -#undef _GLIBCXX_STD_BASE -#define _GLIBCXX_BASE unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc> -#define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE - - /// Class std::unordered_multimap wrapper with performance instrumentation. - template, - typename _Pred = std::equal_to<_Key>, - typename _Alloc = std::allocator > > - class unordered_multimap - : public _GLIBCXX_STD_BASE, - public _Unordered_profile, - false> - { - typedef typename _GLIBCXX_STD_BASE _Base; - - _Base& - _M_base() noexcept { return *this; } - - const _Base& - _M_base() const noexcept { return *this; } - - public: - typedef typename _Base::size_type size_type; - typedef typename _Base::hasher hasher; - typedef typename _Base::key_equal key_equal; - typedef typename _Base::allocator_type allocator_type; - typedef typename _Base::key_type key_type; - typedef typename _Base::value_type value_type; - typedef typename _Base::difference_type difference_type; - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - - typedef typename _Base::iterator iterator; - typedef typename _Base::const_iterator const_iterator; - - unordered_multimap() = default; - - explicit - unordered_multimap(size_type __n, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__n, __hf, __eql, __a) { } - - template - unordered_multimap(_InputIterator __f, _InputIterator __l, - size_type __n = 0, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__f, __l, __n, __hf, __eql, __a) { } - - unordered_multimap(const unordered_multimap&) = default; - - unordered_multimap(const _Base& __x) - : _Base(__x) { } - - unordered_multimap(unordered_multimap&&) = default; - - explicit - unordered_multimap(const allocator_type& __a) - : _Base(__a) { } - - unordered_multimap(const unordered_multimap& __ummap, - const allocator_type& __a) - : _Base(__ummap._M_base(), __a) { } - - unordered_multimap(unordered_multimap&& __ummap, - const allocator_type& __a) - : _Base(std::move(__ummap._M_base()), __a) { } - - unordered_multimap(initializer_list __l, - size_type __n = 0, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__l, __n, __hf, __eql, __a) { } - - unordered_multimap(size_type __n, const allocator_type& __a) - : unordered_multimap(__n, hasher(), key_equal(), __a) - { } - - unordered_multimap(size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_multimap(__n, __hf, key_equal(), __a) - { } - - template - unordered_multimap(_InputIterator __first, _InputIterator __last, - size_type __n, - const allocator_type& __a) - : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) - { } - - template - unordered_multimap(_InputIterator __first, _InputIterator __last, - size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) - { } - - unordered_multimap(initializer_list __l, - size_type __n, - const allocator_type& __a) - : unordered_multimap(__l, __n, hasher(), key_equal(), __a) - { } - - unordered_multimap(initializer_list __l, - size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_multimap(__l, __n, __hf, key_equal(), __a) - { } - - unordered_multimap& - operator=(const unordered_multimap&) = default; - - unordered_multimap& - operator=(unordered_multimap&&) = default; - - unordered_multimap& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } - - void - clear() noexcept - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - template - iterator - emplace(_Args&&... __args) - { - size_type __old_size = _Base::bucket_count(); - iterator __res - = _Base::emplace(std::forward<_Args>(__args)...); - this->_M_profile_resize(__old_size); - return __res; - } - - template - iterator - emplace_hint(const_iterator __it, _Args&&... __args) - { - size_type __old_size = _Base::bucket_count(); - iterator __res - = _Base::emplace_hint(__it, std::forward<_Args>(__args)...); - this->_M_profile_resize(__old_size); - return __res; - } - - void - insert(std::initializer_list __l) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__l); - this->_M_profile_resize(__old_size); - } - - iterator - insert(const value_type& __obj) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__obj); - this->_M_profile_resize(__old_size); - return __res; - } - - iterator - insert(const_iterator __iter, const value_type& __v) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__iter, __v); - this->_M_profile_resize(__old_size); - return __res; - } - - template::value>::type> - iterator - insert(_Pair&& __obj) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(std::forward<_Pair>(__obj)); - this->_M_profile_resize(__old_size); - return __res; - } - - template::value>::type> - iterator - insert(const_iterator __iter, _Pair&& __v) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__iter, std::forward<_Pair>(__v)); - this->_M_profile_resize(__old_size); - return __res; - } - - template - void - insert(_InputIter __first, _InputIter __last) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__first, __last); - this->_M_profile_resize(__old_size); - } - - void - swap(unordered_multimap& __x) - noexcept( noexcept(__x._M_base().swap(__x)) ) - { - _Base::swap(__x._M_base()); - this->_M_swap(__x); - } - - void - rehash(size_type __n) - { - size_type __old_size = _Base::bucket_count(); - _Base::rehash(__n); - this->_M_profile_resize(__old_size); - } - }; - - template - inline void - swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, - unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) - noexcept(noexcept(__x.swap(__y))) - { __x.swap(__y); } - - template - inline bool - operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, - const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) - { return static_cast(__x) == __y; } - - template - inline bool - operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, - const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) - { return !(__x == __y); } - -} // namespace __profile -} // namespace std - -#undef _GLIBCXX_BASE -#undef _GLIBCXX_STD_BASE - -#endif // C++11 - -#endif diff --git a/libstdc++-v3/include/profile/unordered_set b/libstdc++-v3/include/profile/unordered_set deleted file mode 100644 index 2e410d07f2b..00000000000 --- a/libstdc++-v3/include/profile/unordered_set +++ /dev/null @@ -1,561 +0,0 @@ -// Profiling unordered_set/unordered_multiset implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/unordered_set - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_UNORDERED_SET -#define _GLIBCXX_PROFILE_UNORDERED_SET 1 - -#if __cplusplus < 201103L -# include -#else -# include - -#include -#include - -#define _GLIBCXX_BASE unordered_set<_Key, _Hash, _Pred, _Alloc> -#define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - /** @brief Unordered_set wrapper with performance instrumentation. */ - template, - typename _Pred = std::equal_to<_Key>, - typename _Alloc = std::allocator<_Key> > - class unordered_set - : public _GLIBCXX_STD_BASE, - public _Unordered_profile, - true> - { - typedef _GLIBCXX_STD_BASE _Base; - - _Base& - _M_base() noexcept { return *this; } - - const _Base& - _M_base() const noexcept { return *this; } - - public: - typedef typename _Base::size_type size_type; - typedef typename _Base::hasher hasher; - typedef typename _Base::key_equal key_equal; - typedef typename _Base::allocator_type allocator_type; - typedef typename _Base::key_type key_type; - typedef typename _Base::value_type value_type; - typedef typename _Base::difference_type difference_type; - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - - typedef typename _Base::iterator iterator; - typedef typename _Base::const_iterator const_iterator; - - unordered_set() = default; - - explicit - unordered_set(size_type __n, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__n, __hf, __eql, __a) - { } - - template - unordered_set(_InputIterator __f, _InputIterator __l, - size_type __n = 0, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__f, __l, __n, __hf, __eql, __a) - { } - - unordered_set(const unordered_set&) = default; - - unordered_set(const _Base& __x) - : _Base(__x) - { } - - unordered_set(unordered_set&&) = default; - - explicit - unordered_set(const allocator_type& __a) - : _Base(__a) - { } - - unordered_set(const unordered_set& __uset, - const allocator_type& __a) - : _Base(__uset._M_base(), __a) - { } - - unordered_set(unordered_set&& __uset, - const allocator_type& __a) - : _Base(std::move(__uset._M_base()), __a) - { } - - unordered_set(initializer_list __l, - size_type __n = 0, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__l, __n, __hf, __eql, __a) - { } - - unordered_set(size_type __n, const allocator_type& __a) - : unordered_set(__n, hasher(), key_equal(), __a) - { } - - unordered_set(size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_set(__n, __hf, key_equal(), __a) - { } - - template - unordered_set(_InputIterator __first, _InputIterator __last, - size_type __n, - const allocator_type& __a) - : unordered_set(__first, __last, __n, hasher(), key_equal(), __a) - { } - - template - unordered_set(_InputIterator __first, _InputIterator __last, - size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_set(__first, __last, __n, __hf, key_equal(), __a) - { } - - unordered_set(initializer_list __l, - size_type __n, - const allocator_type& __a) - : unordered_set(__l, __n, hasher(), key_equal(), __a) - { } - - unordered_set(initializer_list __l, - size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_set(__l, __n, __hf, key_equal(), __a) - { } - - unordered_set& - operator=(const unordered_set&) = default; - - unordered_set& - operator=(unordered_set&&) = default; - - unordered_set& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } - - void - swap(unordered_set& __x) - noexcept( noexcept(__x._M_base().swap(__x)) ) - { - _Base::swap(__x); - this->_M_swap(__x); - } - - void - clear() noexcept - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - template - std::pair - emplace(_Args&&... __args) - { - size_type __old_size = _Base::bucket_count(); - std::pair __res - = _Base::emplace(std::forward<_Args>(__args)...); - this->_M_profile_resize(__old_size); - return __res; - } - - template - iterator - emplace_hint(const_iterator __it, _Args&&... __args) - { - size_type __old_size = _Base::bucket_count(); - iterator __res - = _Base::emplace_hint(__it, std::forward<_Args>(__args)...); - this->_M_profile_resize(__old_size); - return __res; - } - - void - insert(std::initializer_list __l) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__l); - this->_M_profile_resize(__old_size); - } - - std::pair - insert(const value_type& __obj) - { - size_type __old_size = _Base::bucket_count(); - std::pair __res = _Base::insert(__obj); - this->_M_profile_resize(__old_size); - return __res; - } - - iterator - insert(const_iterator __iter, const value_type& __v) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__iter, __v); - this->_M_profile_resize(__old_size); - return __res; - } - - std::pair - insert(value_type&& __obj) - { - size_type __old_size = _Base::bucket_count(); - std::pair __res = _Base::insert(std::move(__obj)); - this->_M_profile_resize(__old_size); - return __res; - } - - iterator - insert(const_iterator __iter, value_type&& __v) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__iter, std::move(__v)); - this->_M_profile_resize(__old_size); - return __res; - } - - template - void - insert(_InputIter __first, _InputIter __last) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__first, __last); - this->_M_profile_resize(__old_size); - } - - void - rehash(size_type __n) - { - size_type __old_size = _Base::bucket_count(); - _Base::rehash(__n); - this->_M_profile_resize(__old_size); - } - }; - - template - inline void - swap(unordered_set<_Key, _Hash, _Pred, _Alloc>& __x, - unordered_set<_Key, _Hash, _Pred, _Alloc>& __y) - noexcept(noexcept(__x.swap(__y))) - { __x.swap(__y); } - - template - inline bool - operator==(const unordered_set<_Key, _Hash, _Pred, _Alloc>& __x, - const unordered_set<_Key, _Hash, _Pred, _Alloc>& __y) - { return static_cast(__x) == __y; } - - template - inline bool - operator!=(const unordered_set<_Key, _Hash, _Pred, _Alloc>& __x, - const unordered_set<_Key, _Hash, _Pred, _Alloc>& __y) - { return !(__x == __y); } - -#undef _GLIBCXX_BASE -#undef _GLIBCXX_STD_BASE -#define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE -#define _GLIBCXX_BASE unordered_multiset<_Value, _Hash, _Pred, _Alloc> - - /** @brief Unordered_multiset wrapper with performance instrumentation. */ - template, - typename _Pred = std::equal_to<_Value>, - typename _Alloc = std::allocator<_Value> > - class unordered_multiset - : public _GLIBCXX_STD_BASE, - public _Unordered_profile, - false> - { - typedef _GLIBCXX_STD_BASE _Base; - - _Base& - _M_base() noexcept { return *this; } - - const _Base& - _M_base() const noexcept { return *this; } - - public: - typedef typename _Base::size_type size_type; - typedef typename _Base::hasher hasher; - typedef typename _Base::key_equal key_equal; - typedef typename _Base::allocator_type allocator_type; - typedef typename _Base::key_type key_type; - typedef typename _Base::value_type value_type; - typedef typename _Base::difference_type difference_type; - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - - typedef typename _Base::iterator iterator; - typedef typename _Base::const_iterator const_iterator; - - unordered_multiset() = default; - - explicit - unordered_multiset(size_type __n, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__n, __hf, __eql, __a) - { } - - template - unordered_multiset(_InputIterator __f, _InputIterator __l, - size_type __n = 0, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__f, __l, __n, __hf, __eql, __a) - { } - - unordered_multiset(const unordered_multiset&) = default; - - unordered_multiset(const _Base& __x) - : _Base(__x) - { } - - unordered_multiset(unordered_multiset&&) = default; - - explicit - unordered_multiset(const allocator_type& __a) - : _Base(__a) - { } - - unordered_multiset(const unordered_multiset& __umset, - const allocator_type& __a) - : _Base(__umset._M_base(), __a) - { } - - unordered_multiset(unordered_multiset&& __umset, - const allocator_type& __a) - : _Base(std::move(__umset._M_base()), __a) - { } - - unordered_multiset(initializer_list __l, - size_type __n = 0, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) - : _Base(__l, __n, __hf, __eql, __a) - { } - - unordered_multiset(size_type __n, const allocator_type& __a) - : unordered_multiset(__n, hasher(), key_equal(), __a) - { } - - unordered_multiset(size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_multiset(__n, __hf, key_equal(), __a) - { } - - template - unordered_multiset(_InputIterator __first, _InputIterator __last, - size_type __n, - const allocator_type& __a) - : unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) - { } - - template - unordered_multiset(_InputIterator __first, _InputIterator __last, - size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) - { } - - unordered_multiset(initializer_list __l, - size_type __n, - const allocator_type& __a) - : unordered_multiset(__l, __n, hasher(), key_equal(), __a) - { } - - unordered_multiset(initializer_list __l, - size_type __n, const hasher& __hf, - const allocator_type& __a) - : unordered_multiset(__l, __n, __hf, key_equal(), __a) - { } - - unordered_multiset& - operator=(const unordered_multiset&) = default; - - unordered_multiset& - operator=(unordered_multiset&&) = default; - - unordered_multiset& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } - - void - swap(unordered_multiset& __x) - noexcept( noexcept(__x._M_base().swap(__x)) ) - { - _Base::swap(__x); - this->_M_swap(__x); - } - - void - clear() noexcept - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - template - iterator - emplace(_Args&&... __args) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::emplace(std::forward<_Args>(__args)...); - this->_M_profile_resize(__old_size); - return __res; - } - - template - iterator - emplace_hint(const_iterator __it, _Args&&... __args) - { - size_type __old_size = _Base::bucket_count(); - iterator __res - = _Base::emplace_hint(__it, std::forward<_Args>(__args)...); - this->_M_profile_resize(__old_size); - return __res; - } - - void - insert(std::initializer_list __l) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__l); - this->_M_profile_resize(__old_size); - } - - iterator - insert(const value_type& __obj) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__obj); - this->_M_profile_resize(__old_size); - return __res; - } - - iterator - insert(const_iterator __iter, const value_type& __v) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__iter, __v); - this->_M_profile_resize(__old_size); - return __res; - } - - iterator - insert(value_type&& __obj) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(std::move(__obj)); - this->_M_profile_resize(__old_size); - return __res; - } - - iterator - insert(const_iterator __iter, value_type&& __v) - { - size_type __old_size = _Base::bucket_count(); - iterator __res = _Base::insert(__iter, std::move(__v)); - this->_M_profile_resize(__old_size); - return __res; - } - - template - void - insert(_InputIter __first, _InputIter __last) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__first, __last); - this->_M_profile_resize(__old_size); - } - - void - rehash(size_type __n) - { - size_type __old_size = _Base::bucket_count(); - _Base::rehash(__n); - this->_M_profile_resize(__old_size); - } - }; - - template - inline void - swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, - unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) - noexcept(noexcept(__x.swap(__y))) - { __x.swap(__y); } - - template - inline bool - operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, - const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) - { return static_cast(__x) == __y; } - - template - inline bool - operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, - const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) - { return !(__x == __y); } - -} // namespace __profile -} // namespace std - -#undef _GLIBCXX_BASE -#undef _GLIBCXX_STD_BASE - -#endif // C++11 - -#endif diff --git a/libstdc++-v3/include/profile/vector b/libstdc++-v3/include/profile/vector deleted file mode 100644 index 56fe23a9ddd..00000000000 --- a/libstdc++-v3/include/profile/vector +++ /dev/null @@ -1,572 +0,0 @@ -// Profiling vector implementation -*- C++ -*- - -// Copyright (C) 2009-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -/** @file profile/vector - * This file is a GNU profile extension to the Standard C++ Library. - */ - -#ifndef _GLIBCXX_PROFILE_VECTOR -#define _GLIBCXX_PROFILE_VECTOR 1 - -#include -#include -#include -#include - -namespace std _GLIBCXX_VISIBILITY(default) -{ -namespace __profile -{ - template - class _Vector_profile_pre - { - _Vector& - _M_conjure() - { return *static_cast<_Vector*>(this); } - - public: -#if __cplusplus >= 201103L - _Vector_profile_pre() = default; - _Vector_profile_pre(const _Vector_profile_pre&) = default; - _Vector_profile_pre(_Vector_profile_pre&&) = default; - - _Vector_profile_pre& - operator=(const _Vector_profile_pre&) - { _M_conjure()._M_profile_destruct(); } - - _Vector_profile_pre& - operator=(_Vector_profile_pre&&) noexcept - { _M_conjure()._M_profile_destruct(); } -#endif - }; - - template - class _Vector_profile_post - { - _Vector& - _M_conjure() - { return *static_cast<_Vector*>(this); } - - protected: - __gnu_profile::__container_size_info* _M_size_info; - __gnu_profile::__vector2list_info* _M_vect2list_info; - - _Vector_profile_post() _GLIBCXX_NOEXCEPT - { _M_profile_construct(); } - -#if __cplusplus >= 201103L - _Vector_profile_post(const _Vector_profile_post&) noexcept - : _Vector_profile_post() { } - _Vector_profile_post(_Vector_profile_post&& __other) noexcept - : _Vector_profile_post() - { _M_swap(__other); } - - _Vector_profile_post& - operator=(const _Vector_profile_post&) noexcept - { _M_profile_construct(); } - - _Vector_profile_post& - operator=(_Vector_profile_post&& __other) noexcept - { - _M_swap(__other); - __other._M_profile_construct(); - } -#endif - - ~_Vector_profile_post() - { _M_conjure()._M_profile_destruct(); } - - public: - void - _M_profile_construct() _GLIBCXX_NOEXCEPT - { - _M_size_info = - __profcxx_vector_size_construct(_M_conjure().capacity()); - _M_vect2list_info = __profcxx_vector2list_construct(); - } - - void - _M_profile_destruct() _GLIBCXX_NOEXCEPT - { - __profcxx_vector2list_destruct(_M_vect2list_info); - _M_vect2list_info = 0; - __profcxx_vector_size_destruct(_M_size_info, - _M_conjure().capacity(), - _M_conjure().size()); - _M_size_info = 0; - } - - void - _M_swap(_Vector_profile_post& __other) _GLIBCXX_NOEXCEPT - { - std::swap(_M_size_info, __other._M_size_info); - std::swap(_M_vect2list_info, __other._M_vect2list_info); - } - }; - - template > - class vector - : public _Vector_profile_pre >, - public _GLIBCXX_STD_C::vector<_Tp, _Allocator>, - public _Vector_profile_post > - { - typedef _GLIBCXX_STD_C::vector<_Tp, _Allocator> _Base; - - typedef typename _Base::iterator _Base_iterator; - typedef typename _Base::const_iterator _Base_const_iterator; - - public: - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; - - typedef __iterator_tracker<_Base_iterator, vector> - iterator; - typedef __iterator_tracker<_Base_const_iterator, vector> - const_iterator; - - typedef typename _Base::size_type size_type; - typedef typename _Base::difference_type difference_type; - - typedef _Tp value_type; - typedef _Allocator allocator_type; - typedef typename _Base::pointer pointer; - typedef typename _Base::const_pointer const_pointer; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - _Base& - _M_base() _GLIBCXX_NOEXCEPT { return *this; } - - const _Base& - _M_base() const _GLIBCXX_NOEXCEPT { return *this; } - - // 23.2.4.1 construct/copy/destroy: - -#if __cplusplus < 201103L - vector() - { } - - vector(const vector& __x) - : _Base(__x) { } -#else - vector() = default; - vector(const vector&) = default; - vector(vector&&) = default; -#endif - - explicit - vector(const _Allocator& __a) _GLIBCXX_NOEXCEPT - : _Base(__a) { } - -#if __cplusplus >= 201103L - explicit - vector(size_type __n, const _Allocator& __a = _Allocator()) - : _Base(__n, __a) { } - - vector(size_type __n, const _Tp& __value, - const _Allocator& __a = _Allocator()) - : _Base(__n, __value, __a) { } -#else - explicit - vector(size_type __n, const _Tp& __value = _Tp(), - const _Allocator& __a = _Allocator()) - : _Base(__n, __value, __a) { } -#endif - -#if __cplusplus >= 201103L - template> -#else - template -#endif - vector(_InputIterator __first, _InputIterator __last, - const _Allocator& __a = _Allocator()) - : _Base(__first, __last, __a) { } - - /// Construction from a normal-mode vector - vector(const _Base& __x) - : _Base(__x) { } - -#if __cplusplus >= 201103L - vector(const _Base& __x, const _Allocator& __a) - : _Base(__x, __a) { } - - vector(vector&& __x, const _Allocator& __a) - : _Base(std::move(__x), __a) { } - - vector(initializer_list __l, - const allocator_type& __a = allocator_type()) - : _Base(__l, __a) { } -#endif - -#if __cplusplus < 201103L - vector& - operator=(const vector& __x) - { - this->_M_profile_destruct(); - _M_base() = __x; - this->_M_profile_construct(); - return *this; - } -#else - vector& - operator=(const vector&) = default; - - vector& - operator=(vector&&) = default; - - vector& - operator=(initializer_list __l) - { - this->_M_profile_destruct(); - _M_base() = __l; - this->_M_profile_construct(); - return *this; - } -#endif - - // iterators: - iterator - begin() _GLIBCXX_NOEXCEPT - { return iterator(_Base::begin(), this); } - - const_iterator - begin() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::begin(), this); } - - iterator - end() _GLIBCXX_NOEXCEPT - { return iterator(_Base::end(), this); } - - const_iterator - end() const _GLIBCXX_NOEXCEPT - { return const_iterator(_Base::end(), this); } - - reverse_iterator - rbegin() _GLIBCXX_NOEXCEPT - { return reverse_iterator(end()); } - - const_reverse_iterator - rbegin() const _GLIBCXX_NOEXCEPT - { return const_reverse_iterator(end()); } - - reverse_iterator - rend() _GLIBCXX_NOEXCEPT - { return reverse_iterator(begin()); } - - const_reverse_iterator - rend() const _GLIBCXX_NOEXCEPT - { return const_reverse_iterator(begin()); } - -#if __cplusplus >= 201103L - const_iterator - cbegin() const noexcept - { return const_iterator(_Base::begin(), this); } - - const_iterator - cend() const noexcept - { return const_iterator(_Base::end(), this); } - - const_reverse_iterator - crbegin() const noexcept - { return const_reverse_iterator(end()); } - - const_reverse_iterator - crend() const noexcept - { return const_reverse_iterator(begin()); } -#endif - - // 23.2.4.2 capacity: - -#if __cplusplus >= 201103L - void - resize(size_type __sz) - { - __profcxx_vector2list_invalid_operator(this->_M_vect2list_info); - _M_profile_resize(this->capacity(), __sz); - _Base::resize(__sz); - } - - void - resize(size_type __sz, const _Tp& __c) - { - __profcxx_vector2list_invalid_operator(this->_M_vect2list_info); - _M_profile_resize(this->capacity(), __sz); - _Base::resize(__sz, __c); - } -#else - void - resize(size_type __sz, _Tp __c = _Tp()) - { - __profcxx_vector2list_invalid_operator(this->_M_vect2list_info); - _M_profile_resize(this->capacity(), __sz); - _Base::resize(__sz, __c); - } -#endif - - // element access: - reference - operator[](size_type __n) _GLIBCXX_NOEXCEPT - { - __profcxx_vector2list_invalid_operator(this->_M_vect2list_info); - return _M_base()[__n]; - } - const_reference - operator[](size_type __n) const _GLIBCXX_NOEXCEPT - { - __profcxx_vector2list_invalid_operator(this->_M_vect2list_info); - return _M_base()[__n]; - } - - // 23.2.4.3 modifiers: - void - push_back(const _Tp& __x) - { - size_type __old_size = this->capacity(); - _Base::push_back(__x); - _M_profile_resize(__old_size, this->capacity()); - } - -#if __cplusplus >= 201103L - void - push_back(_Tp&& __x) - { - size_type __old_size = this->capacity(); - _Base::push_back(std::move(__x)); - _M_profile_resize(__old_size, this->capacity()); - } - -#endif - - iterator -#if __cplusplus >= 201103L - insert(const_iterator __pos, const _Tp& __x) -#else - insert(iterator __pos, const _Tp& __x) -#endif - { - __profcxx_vector2list_insert(this->_M_vect2list_info, - __pos.base() - _Base::begin(), - this->size()); - size_type __old_size = this->capacity(); - _Base_iterator __res = _Base::insert(__pos.base(), __x); - _M_profile_resize(__old_size, this->capacity()); - return iterator(__res, this); - } - -#if __cplusplus >= 201103L - iterator - insert(const_iterator __pos, _Tp&& __x) - { - __profcxx_vector2list_insert(this->_M_vect2list_info, - __pos.base() - _Base::cbegin(), - this->size()); - size_type __old_size = this->capacity(); - _Base_iterator __res = _Base::insert(__pos.base(), __x); - _M_profile_resize(__old_size, this->capacity()); - return iterator(__res, this); - } - - template - iterator - emplace(const_iterator __pos, _Args&&... __args) - { - _Base_iterator __res = _Base::emplace(__pos.base(), - std::forward<_Args>(__args)...); - return iterator(__res, this); - } - - iterator - insert(const_iterator __pos, initializer_list __l) - { return this->insert(__pos, __l.begin(), __l.end()); } -#endif - - void - swap(vector& __x) -#if __cplusplus >= 201103L - noexcept( noexcept(declval<_Base>().swap(__x)) ) -#endif - { - _Base::swap(__x); - this->_M_swap(__x); - } - -#if __cplusplus >= 201103L - iterator - insert(const_iterator __pos, size_type __n, const _Tp& __x) - { - __profcxx_vector2list_insert(this->_M_vect2list_info, - __pos.base() - _Base::cbegin(), - this->size()); - size_type __old_size = this->capacity(); - _Base_iterator __res = _Base::insert(__pos, __n, __x); - _M_profile_resize(__old_size, this->capacity()); - return iterator(__res, this); - } -#else - void - insert(iterator __pos, size_type __n, const _Tp& __x) - { - __profcxx_vector2list_insert(this->_M_vect2list_info, - __pos.base() - _Base::begin(), - this->size()); - size_type __old_size = this->capacity(); - _Base::insert(__pos, __n, __x); - _M_profile_resize(__old_size, this->capacity()); - } -#endif - -#if __cplusplus >= 201103L - template> - iterator - insert(const_iterator __pos, - _InputIterator __first, _InputIterator __last) - { - __profcxx_vector2list_insert(this->_M_vect2list_info, - __pos.base() - _Base::cbegin(), - this->size()); - size_type __old_size = this->capacity(); - _Base_iterator __res = _Base::insert(__pos, __first, __last); - _M_profile_resize(__old_size, this->capacity()); - return iterator(__res, this); - } -#else - template - void - insert(iterator __pos, - _InputIterator __first, _InputIterator __last) - { - __profcxx_vector2list_insert(this->_M_vect2list_info, - __pos.base() - _Base::begin(), - this->size()); - size_type __old_size = this->capacity(); - _Base::insert(__pos, __first, __last); - _M_profile_resize(__old_size, this->capacity()); - } -#endif - - iterator -#if __cplusplus >= 201103L - erase(const_iterator __pos) -#else - erase(iterator __pos) -#endif - { return iterator(_Base::erase(__pos.base()), this); } - - iterator -#if __cplusplus >= 201103L - erase(const_iterator __first, const_iterator __last) -#else - erase(iterator __first, iterator __last) -#endif - { return iterator(_Base::erase(__first.base(), __last.base()), this); } - - void - clear() _GLIBCXX_NOEXCEPT - { - this->_M_profile_destruct(); - _Base::clear(); - this->_M_profile_construct(); - } - - inline void - _M_profile_iterate(int __rewind = 0) const - { __profcxx_vector2list_iterate(this->_M_vect2list_info, __rewind); } - - private: - void _M_profile_resize(size_type __old_size, size_type __new_size) - { - if (__old_size < __new_size) - { - __profcxx_vector_size_resize(this->_M_size_info, - this->size(), __new_size); - __profcxx_vector2list_resize(this->_M_vect2list_info, - this->size(), __new_size); - } - } - }; - - template - inline bool - operator==(const vector<_Tp, _Alloc>& __lhs, - const vector<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() == __rhs._M_base(); } - - template - inline bool - operator!=(const vector<_Tp, _Alloc>& __lhs, - const vector<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() != __rhs._M_base(); } - - template - inline bool - operator<(const vector<_Tp, _Alloc>& __lhs, - const vector<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() < __rhs._M_base(); } - - template - inline bool - operator<=(const vector<_Tp, _Alloc>& __lhs, - const vector<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() <= __rhs._M_base(); } - - template - inline bool - operator>=(const vector<_Tp, _Alloc>& __lhs, - const vector<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() >= __rhs._M_base(); } - - template - inline bool - operator>(const vector<_Tp, _Alloc>& __lhs, - const vector<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() > __rhs._M_base(); } - - template - inline void - swap(vector<_Tp, _Alloc>& __lhs, vector<_Tp, _Alloc>& __rhs) - _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs))) - { __lhs.swap(__rhs); } - -} // namespace __profile - -#if __cplusplus >= 201103L - // DR 1182. - /// std::hash specialization for vector. - template - struct hash<__profile::vector> - : public __hash_base> - { - size_t - operator()(const __profile::vector& __b) const noexcept - { - return std::hash<_GLIBCXX_STD_C::vector>()(__b._M_base()); - } - }; -#endif - -} // namespace std - -#endif diff --git a/libstdc++-v3/scripts/run_doxygen b/libstdc++-v3/scripts/run_doxygen index eb3559a61c6..d73768cb4c1 100644 --- a/libstdc++-v3/scripts/run_doxygen +++ b/libstdc++-v3/scripts/run_doxygen @@ -329,10 +329,6 @@ for f in *__parallel_*; do newname=`echo $f | sed 's/__parallel_/__parallel::/'` mv $f $newname done -for f in *__profile_*; do - newname=`echo $f | sed 's/__profile_/__profile::/'` - mv $f $newname -done # Remove inline namespaces used for versioning. for f in *_V2_*; do @@ -376,10 +372,6 @@ for f in __gnu_parallel_*; do newname=`echo $f | sed 's/^__gnu_parallel_/__gnu_parallel::/'` mv $f $newname done -for f in __gnu_profile_*; do - newname=`echo $f | sed 's/^__gnu_profile_/__gnu_profile::/'` - mv $f $newname -done for f in __gnu_pbds_*; do newname=`echo $f | sed 's/^__gnu_pbds_/__gnu_pbds::/'` mv $f $newname diff --git a/libstdc++-v3/testsuite/23_containers/array/element_access/60497.cc b/libstdc++-v3/testsuite/23_containers/array/element_access/60497.cc index 6391e62c9da..7a4451e141b 100644 --- a/libstdc++-v3/testsuite/23_containers/array/element_access/60497.cc +++ b/libstdc++-v3/testsuite/23_containers/array/element_access/60497.cc @@ -21,7 +21,6 @@ #include #include -#include #include struct A; @@ -32,6 +31,3 @@ auto b = std::get<0>(std::move(a)); std::__debug::array*, 1> c; auto d = std::__debug::get<0>(std::move(c)); - -std::__profile::array*, 1> e; -auto f = std::__profile::get<0>(std::move(e)); diff --git a/libstdc++-v3/testsuite/23_containers/array/specialized_algorithms/swap_cxx17.cc b/libstdc++-v3/testsuite/23_containers/array/specialized_algorithms/swap_cxx17.cc index 1fbb44e3de4..91d8d26d7a7 100644 --- a/libstdc++-v3/testsuite/23_containers/array/specialized_algorithms/swap_cxx17.cc +++ b/libstdc++-v3/testsuite/23_containers/array/specialized_algorithms/swap_cxx17.cc @@ -1,6 +1,5 @@ // { dg-options "-std=gnu++17" } // { dg-do compile } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2016-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/capacity/1.cc b/libstdc++-v3/testsuite/23_containers/forward_list/capacity/1.cc index fcde485eda5..deb71f2d51b 100644 --- a/libstdc++-v3/testsuite/23_containers/forward_list/capacity/1.cc +++ b/libstdc++-v3/testsuite/23_containers/forward_list/capacity/1.cc @@ -34,7 +34,7 @@ test01() fld.resize(0); VERIFY(fld.empty() == true); -#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PROFILE) +#ifdef _GLIBCXX_DEBUG using std::_GLIBCXX_STD_C::_Fwd_list_node; #else using std::_Fwd_list_node; diff --git a/libstdc++-v3/testsuite/23_containers/list/capacity/29134.cc b/libstdc++-v3/testsuite/23_containers/list/capacity/29134.cc index 05b0b5701c0..1b23938c088 100644 --- a/libstdc++-v3/testsuite/23_containers/list/capacity/29134.cc +++ b/libstdc++-v3/testsuite/23_containers/list/capacity/29134.cc @@ -26,10 +26,10 @@ void test01() typedef std::list list_type; list_type l; -#if ! defined _GLIBCXX_DEBUG && ! defined _GLIBCXX_PROFILE - using std::_List_node; -#else +#ifdef _GLIBCXX_DEBUG using std::_GLIBCXX_STD_C::_List_node; +#else + using std::_List_node; #endif VERIFY( l.max_size() == std::allocator<_List_node >().max_size() ); diff --git a/libstdc++-v3/testsuite/23_containers/map/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/map/modifiers/extract.cc index cde0cd3da92..cf72e46b5ce 100644 --- a/libstdc++-v3/testsuite/23_containers/map/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/map/modifiers/extract.cc @@ -16,7 +16,6 @@ // . // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/23_containers/map/modifiers/insert_or_assign/1.cc b/libstdc++-v3/testsuite/23_containers/map/modifiers/insert_or_assign/1.cc index 5699315c3f0..39526a9520d 100644 --- a/libstdc++-v3/testsuite/23_containers/map/modifiers/insert_or_assign/1.cc +++ b/libstdc++-v3/testsuite/23_containers/map/modifiers/insert_or_assign/1.cc @@ -1,5 +1,4 @@ // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2015-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/23_containers/map/modifiers/try_emplace/1.cc b/libstdc++-v3/testsuite/23_containers/map/modifiers/try_emplace/1.cc index d9de9f7b9da..17abdc41531 100644 --- a/libstdc++-v3/testsuite/23_containers/map/modifiers/try_emplace/1.cc +++ b/libstdc++-v3/testsuite/23_containers/map/modifiers/try_emplace/1.cc @@ -1,5 +1,4 @@ // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2015-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/23_containers/multimap/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/multimap/modifiers/extract.cc index 3ba61a81b66..0c9ba093895 100644 --- a/libstdc++-v3/testsuite/23_containers/multimap/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/multimap/modifiers/extract.cc @@ -16,7 +16,6 @@ // . // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/23_containers/multiset/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/multiset/modifiers/extract.cc index 667e8ec9c29..61daacd3347 100644 --- a/libstdc++-v3/testsuite/23_containers/multiset/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/multiset/modifiers/extract.cc @@ -16,7 +16,6 @@ // . // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/23_containers/set/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/set/modifiers/extract.cc index ee4a7401804..48bca02c039 100644 --- a/libstdc++-v3/testsuite/23_containers/set/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/set/modifiers/extract.cc @@ -16,7 +16,6 @@ // . // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/extract.cc index 42ea9a058f1..a3cd5e6eb2e 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/extract.cc @@ -16,7 +16,6 @@ // . // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/modifiers/extract.cc index 449969ba146..21f0f3b6019 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/modifiers/extract.cc @@ -16,7 +16,6 @@ // . // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/modifiers/extract.cc index e27e56866cc..909163c86de 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/modifiers/extract.cc @@ -16,7 +16,6 @@ // . // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/extract.cc index 1e7dca38731..324dba7a161 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/extract.cc @@ -16,7 +16,6 @@ // . // { dg-options "-std=gnu++17" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/29134.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/29134.cc index cb631924fa5..2c84964210b 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/29134.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/29134.cc @@ -29,8 +29,6 @@ void test01() #ifdef _GLIBCXX_DEBUG using std::_GLIBCXX_STD_C::_S_word_bit; -#elif defined(_GLIBCXX_PROFILE) - using std::_GLIBCXX_STD_C::_S_word_bit; #else using std::_S_word_bit; #endif diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/31370.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/31370.cc index 102960fe459..25a9b65e5a2 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/31370.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/31370.cc @@ -26,8 +26,6 @@ #ifdef _GLIBCXX_DEBUG using std::_GLIBCXX_STD_C::_S_word_bit; -#elif defined(_GLIBCXX_PROFILE) - using std::_GLIBCXX_STD_C::_S_word_bit; #else using std::_S_word_bit; #endif diff --git a/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert_vs_emplace.cc b/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert_vs_emplace.cc index ffa19867ed0..187e433d9d3 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert_vs_emplace.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert_vs_emplace.cc @@ -1,5 +1,4 @@ // { dg-do run { target c++11 } } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // The class X and test code is by by Howard Hinnant and used under a // Creative Commons Attribution 4.0 International License. diff --git a/libstdc++-v3/testsuite/25_algorithms/binary_search/partitioned.cc b/libstdc++-v3/testsuite/25_algorithms/binary_search/partitioned.cc index 1862cd2deb7..43d260ed1c3 100644 --- a/libstdc++-v3/testsuite/25_algorithms/binary_search/partitioned.cc +++ b/libstdc++-v3/testsuite/25_algorithms/binary_search/partitioned.cc @@ -17,7 +17,6 @@ // { dg-options "-D_GLIBCXX_DEBUG" } // { dg-do run { target c++11 } } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/25_algorithms/equal_range/partitioned.cc b/libstdc++-v3/testsuite/25_algorithms/equal_range/partitioned.cc index b67ac755940..a80fe66beff 100644 --- a/libstdc++-v3/testsuite/25_algorithms/equal_range/partitioned.cc +++ b/libstdc++-v3/testsuite/25_algorithms/equal_range/partitioned.cc @@ -17,7 +17,6 @@ // { dg-options "-D_GLIBCXX_DEBUG" } // { dg-do run { target c++11 } } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/71545.cc b/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/71545.cc index c40b927a7a1..9c8c2938a0d 100644 --- a/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/71545.cc +++ b/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/71545.cc @@ -17,7 +17,6 @@ // { dg-options "-D_GLIBCXX_DEBUG" } // { dg-do link { target c++11 } } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include diff --git a/libstdc++-v3/testsuite/25_algorithms/lower_bound/partitioned.cc b/libstdc++-v3/testsuite/25_algorithms/lower_bound/partitioned.cc index 6fbde5888fb..e48facb7173 100644 --- a/libstdc++-v3/testsuite/25_algorithms/lower_bound/partitioned.cc +++ b/libstdc++-v3/testsuite/25_algorithms/lower_bound/partitioned.cc @@ -17,7 +17,6 @@ // { dg-options "-D_GLIBCXX_DEBUG" } // { dg-do run { target c++11 } } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/25_algorithms/upper_bound/partitioned.cc b/libstdc++-v3/testsuite/25_algorithms/upper_bound/partitioned.cc index 9fade2de676..7dd43b6074d 100644 --- a/libstdc++-v3/testsuite/25_algorithms/upper_bound/partitioned.cc +++ b/libstdc++-v3/testsuite/25_algorithms/upper_bound/partitioned.cc @@ -17,7 +17,6 @@ // { dg-options "-D_GLIBCXX_DEBUG" } // { dg-do run { target c++11 } } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } #include #include diff --git a/libstdc++-v3/testsuite/Makefile.am b/libstdc++-v3/testsuite/Makefile.am index 2821345c8c0..92eff6d1e0a 100644 --- a/libstdc++-v3/testsuite/Makefile.am +++ b/libstdc++-v3/testsuite/Makefile.am @@ -196,9 +196,6 @@ libgomp_flags=-B${glibcxx_builddir}/../libgomp \ atomic_flags=$(ATOMIC_FLAGS) parallel_flags="unix/-D_GLIBCXX_PARALLEL/-fopenmp" -# Runs the testsuite in profile mode. -profile_flags = "unix/-D_GLIBCXX_PROFILE" - check-debug: site.exp outputdir=debug; export outputdir; \ if test ! -d $${outputdir}; then \ @@ -226,17 +223,8 @@ check-performance-parallel: testsuite_files_performance ${performance_script} CXXFLAGS="-D_GLIBCXX_PARALLEL -fopenmp $(atomic_flags) $(libgomp_flags)"; export CXXFLAGS; \ ${check_performance_script} ${glibcxx_srcdir} ${glibcxx_builddir}) -check-profile: site.exp - -@(outputdir=profile; export outputdir; \ - if test ! -d $${outputdir}; then \ - mkdir $${outputdir}; \ - fi; \ - srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \ - EXPECT=$(EXPECT); export EXPECT; \ - $(MAKE) CXXFLAGS="$(atomic_flags) " RUNTESTFLAGS="$(RUNTESTFLAGS) conformance.exp --outdir $${outputdir} --objdir $${outputdir} --target_board=$(profile_flags)" check-DEJAGNU; ) - .PHONY: baseline_symbols new-abi-baseline \ - check-abi check-compile check-performance check-parallel check-profile + check-abi check-compile check-performance check-parallel # By adding these files here, automake will remove them for 'make clean' CLEANFILES = *.txt *.tst *.exe core* filebuf_* tmp* ostream_* *.log *.sum \ @@ -245,4 +233,4 @@ CLEANFILES = *.txt *.tst *.exe core* filebuf_* tmp* ostream_* *.log *.sum \ # To remove directories. clean-local: - rm -rf de fr debug parallel profile binaries normal* + rm -rf de fr debug parallel binaries normal* diff --git a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in index 32aea3cedd4..f68d62776ff 100644 --- a/libstdc++-v3/testsuite/Makefile.in +++ b/libstdc++-v3/testsuite/Makefile.in @@ -414,9 +414,6 @@ libgomp_flags = -B${glibcxx_builddir}/../libgomp \ atomic_flags = $(ATOMIC_FLAGS) parallel_flags = "unix/-D_GLIBCXX_PARALLEL/-fopenmp" -# Runs the testsuite in profile mode. -profile_flags = "unix/-D_GLIBCXX_PROFILE" - # By adding these files here, automake will remove them for 'make clean' CLEANFILES = *.txt *.tst *.exe core* filebuf_* tmp* ostream_* *.log *.sum \ testsuite_* site.exp abi_check baseline_symbols *TEST* *.dat \ @@ -733,21 +730,12 @@ check-performance-parallel: testsuite_files_performance ${performance_script} CXXFLAGS="-D_GLIBCXX_PARALLEL -fopenmp $(atomic_flags) $(libgomp_flags)"; export CXXFLAGS; \ ${check_performance_script} ${glibcxx_srcdir} ${glibcxx_builddir}) -check-profile: site.exp - -@(outputdir=profile; export outputdir; \ - if test ! -d $${outputdir}; then \ - mkdir $${outputdir}; \ - fi; \ - srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \ - EXPECT=$(EXPECT); export EXPECT; \ - $(MAKE) CXXFLAGS="$(atomic_flags) " RUNTESTFLAGS="$(RUNTESTFLAGS) conformance.exp --outdir $${outputdir} --objdir $${outputdir} --target_board=$(profile_flags)" check-DEJAGNU; ) - .PHONY: baseline_symbols new-abi-baseline \ - check-abi check-compile check-performance check-parallel check-profile + check-abi check-compile check-performance check-parallel # To remove directories. clean-local: - rm -rf de fr debug parallel profile binaries normal* + rm -rf de fr debug parallel binaries normal* # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/libstdc++-v3/testsuite/ext/profile/all.cc b/libstdc++-v3/testsuite/ext/profile/all.cc deleted file mode 100644 index 03146681aaa..00000000000 --- a/libstdc++-v3/testsuite/ext/profile/all.cc +++ /dev/null @@ -1,52 +0,0 @@ -// { dg-options "-O0" } -// { dg-additional-options "-D_GLIBCXX_PROFILE_NO_THREADS" { target { ! tls_native } } } -// { dg-do compile { target c++11 } } -// { dg-require-profile-mode "" } - -// -*- C++ -*- - -// Copyright (C) 2006-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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 library; see the file COPYING3. If not see -// . - -#include -#include -#include - -using std::map; -using std::vector; -using std::unordered_map; - -struct dumb_hash { - size_t operator()(int x) const {return 0;} - size_t operator()(int x, int y) const {return x == y;} -}; - -int main() { - map m_to_umap; - vector v_to_list; - unordered_map um_too_small; - unordered_map um_too_large(1000000); - unordered_map um_dumb_hash; - - for (int i = 0; i < 10000; ++i) { - m_to_umap[i] = i; - v_to_list.insert(v_to_list.begin(), i); - um_too_small[i] = i; - um_too_small[i] = i; - um_dumb_hash[i] = i; - } -} diff --git a/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc b/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc deleted file mode 100644 index cd2a48845aa..00000000000 --- a/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc +++ /dev/null @@ -1,33 +0,0 @@ -// { dg-options "-D_GLIBCXX_DEBUG -D_GLIBCXX_PROFILE" } -// { dg-do compile } - -// -*- C++ -*- - -// Otherwise we may get *multiple* errors. -#undef _GLIBCXX_PARALLEL - -// Copyright (C) 2006-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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 library; see the file COPYING3. If not see -// . - -#include - -// { dg-error "multiple inlined namespaces" "" { target *-*-* } 0 } - -// "template argument 1 is invalid" -// { dg-prune-output "tuple:993" } -// PMR alias templates cause ambiguities between debug and profile containers: -// { dg-prune-output "is ambiguous" } diff --git a/libstdc++-v3/testsuite/ext/profile/profiler_algos.cc b/libstdc++-v3/testsuite/ext/profile/profiler_algos.cc deleted file mode 100644 index 0626c3949e6..00000000000 --- a/libstdc++-v3/testsuite/ext/profile/profiler_algos.cc +++ /dev/null @@ -1,147 +0,0 @@ -// { dg-require-profile-mode "" } - -// -*- C++ -*- - -// Unit tests for profile/impl/profile_algos.h. - -// Copyright (C) 2010-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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 library; see the file COPYING3. If not see -// . - -#include -#include - -using std::_GLIBCXX_STD_C::vector; - -enum Failure -{ - NO_FAILURES = 0x0, - INSERT_AFTER_N = 0x1, - INSERT_AT_HEAD = 0x2, - INSERT_AT_TAIL = 0x4, - INSERT_IN_THE_MIDDLE = 0x8, - TOP_N = 0x10, - FOR_EACH = 0x20, - REMOVE = 0x40 -}; - - -static int -test_insert_top_n() -{ - vector v; - - for (int i = 0; i < 10; i++) - v.push_back(10 - i); - - // Inserting -5 should have no effect if size is limited to 10. - __gnu_profile::__insert_top_n(v, -5, 10); - for (int i = 0; i < 10; i++) - if (v[i] != 10 - i) - return INSERT_AFTER_N; - - // Insert at head. - __gnu_profile::__insert_top_n(v, 11, 10); - for (int i = 0; i < 11; i++) - if (v[i] != 11 - i) - return INSERT_AT_HEAD; - - // Insert at end. - __gnu_profile::__insert_top_n(v, 0, 100); - for (int i = 0; i < 12; i++) - if (v[i] != 11 - i) - return INSERT_AT_TAIL; - - // Insert in the middle. - __gnu_profile::__insert_top_n(v, 6, 11); - for (int i = 0; i < 6; i++) - if (v[i] != 11 - i) - return INSERT_IN_THE_MIDDLE; - for (int i = 6; i < 13; i++) - if (v[i] != 12 - i) - return INSERT_IN_THE_MIDDLE; - - return NO_FAILURES; -} - -static int -test_top_n() -{ - vector v, out; - - for (int i = 0; i < 100; i++) - { - v.push_back(100 + i); - v.push_back(100 - i); - } - - __gnu_profile::__top_n(v, out, 10); - - for (int i = 0; i < 10; i++) - if (out[i] != 199 - i) - return TOP_N; - - return NO_FAILURES; -} - -struct test_for_each_helper -{ - static int sum; - void operator ()(int i) { - sum += i; - } -}; - -int test_for_each_helper::sum = 0; - -static int -test_for_each() -{ - vector v; - test_for_each_helper helper; - int checksum = 0; - - for (int i = 0; i < 10; i++) - { - v.push_back(i); - checksum += i; - } - - __gnu_profile::__for_each(v.begin(), v.end(), helper); - - return helper.sum == checksum ? NO_FAILURES : FOR_EACH; -} - -static int -test_remove() -{ - vector v; - - for (int i = 0; i < 10; i++) - v.push_back(' '); - v.push_back('x'); - for (int i = 0; i < 10; i++) - v.push_back(' '); - v.push_back('x'); - - return __gnu_profile::__remove(v.begin(), v.end(), ' ') == v.begin() + 2 - ? NO_FAILURES : REMOVE; -} - -int main() -{ - return test_insert_top_n() | test_top_n() | test_for_each() | test_remove(); -} diff --git a/libstdc++-v3/testsuite/ext/profile/replace_new.cc b/libstdc++-v3/testsuite/ext/profile/replace_new.cc deleted file mode 100644 index 7a707e868d5..00000000000 --- a/libstdc++-v3/testsuite/ext/profile/replace_new.cc +++ /dev/null @@ -1,54 +0,0 @@ -// -*- C++ -*- - -// Copyright (C) 2006-2019 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) -// any later version. -// -// This library 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 library; see the file COPYING3. If not see -// . - -// { dg-require-profile-mode "" } - -#include -#include - -using std::vector; - -void* operator new(std::size_t size) THROW(std::bad_alloc) -{ - void* p = std::malloc(size); - if (!p) - throw std::bad_alloc(); - return p; -} - -void* operator new (std::size_t size, const std::nothrow_t&) throw() -{ - // With _GLIBCXX_PROFILE, the instrumentation of the vector constructor - // will call back into this new operator. - vector v; - return std::malloc(size); -} - -void operator delete(void* p) throw() -{ - if (p) - std::free(p); -} - -int -main() -{ - vector v; - return 0; -} diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_global.cc b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_global.cc index 39121334e68..13cc87c80c4 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_global.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_global.cc @@ -31,9 +31,7 @@ typedef std::char_traits traits_t; typedef __gnu_cxx::throw_allocator_random allocator_t; typedef std::basic_string string_t; -#ifndef _GLIBCXX_PROFILE string_t s("bayou bend"); -#endif int main() { diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc index 2496e814d34..87a9f0c7334 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc @@ -30,12 +30,10 @@ typedef std::basic_string string_t; int main() { -#ifndef _GLIBCXX_PROFILE { string_t s; s += "bayou bend"; } -#endif if (__gnu_test::counter::count() != 0) throw std::runtime_error("count not zero"); diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp index d0efc90a1ba..87fbed696ed 100644 --- a/libstdc++-v3/testsuite/lib/libstdc++.exp +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp @@ -966,30 +966,6 @@ proc check_v3_target_debug_mode { } { }] } -proc check_v3_target_profile_mode { } { - return [check_v3_target_prop_cached et_profile_mode { - global tool - # Set up and preprocess a C++ test program that depends - # on profile mode activated. - set src profile_mode[pid].cc - - set f [open $src "w"] - puts $f "#ifndef _GLIBCXX_PROFILE" - puts $f "# error No profile mode" - puts $f "#endif" - close $f - - set lines [v3_target_compile $src /dev/null preprocess ""] - file delete $src - - if [string match "" $lines] { - # No error message, preprocessing succeeded. - return 1 - } - return 0 - }] -} - proc check_v3_target_normal_mode { } { return [check_v3_target_prop_cached et_normal_mode { global tool @@ -999,9 +975,7 @@ proc check_v3_target_normal_mode { } { set f [open $src "w"] puts $f "#include " - puts $f "#if defined(_GLIBCXX_DEBUG) || \\" - puts $f " defined(_GLIBCXX_PROFILE) || \\" - puts $f " defined(_GLIBCXX_PARALLEL)" + puts $f "#if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PARALLEL)" puts $f "# error No normal mode" puts $f "#endif" close $f diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/80276.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/80276.cc index fd67aaf3b70..3425b499e3a 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/80276.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/80276.cc @@ -1,6 +1,5 @@ // { dg-do run { target c++11 } } // { dg-options "-g -O0" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2018-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/compat.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/compat.cc index a538b854038..7bfc3c68867 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/compat.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/compat.cc @@ -1,6 +1,5 @@ // { dg-options "-g -O0" } // { dg-do run } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2014-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc index 616413448bc..7d0a9a21768 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx11.cc @@ -1,6 +1,5 @@ // { dg-do run { target c++11 } } // { dg-options "-g -O0" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2011-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc index 4ff462ef519..da0b03d99ab 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc @@ -1,6 +1,5 @@ // { dg-options "-g -O0 -std=gnu++17" } // { dg-do run { target c++17 } } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2014-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc index 54be58329d7..123ffddc806 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc @@ -1,6 +1,5 @@ // { dg-do run } // { dg-options "-g -O0 -std=gnu++98" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2011-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug_cxx11.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug_cxx11.cc index 592abbddd14..c7902d1d8d0 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug_cxx11.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/debug_cxx11.cc @@ -1,6 +1,5 @@ // { dg-do run { target c++11 } } // { dg-options "-g -O0" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2016-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/libfundts.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/libfundts.cc index f099bd32b3e..95ed2517cd1 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/libfundts.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/libfundts.cc @@ -1,6 +1,5 @@ // { dg-do run { target c++14 } } // { dg-options "-g -O0" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2014-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc index 453baf8131a..60dfdc597f3 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc @@ -2,7 +2,6 @@ // { dg-do run } // { dg-options "-g -O0 -std=gnu++98" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2011-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc index 6e8c56f44c9..b18f5cc22a9 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc @@ -2,7 +2,6 @@ // { dg-do run { target c++11 } } // { dg-options "-g -O0" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2011-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc index 3f35c53ac46..2fae1b6fb06 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc @@ -1,6 +1,5 @@ // { dg-do run { target c++11 } } // { dg-options "-g -O0" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2011-2019 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis2.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis2.cc index 887e80373e2..883f0391f4e 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis2.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis2.cc @@ -1,6 +1,5 @@ // { dg-do run { target c++11 } } // { dg-options "-g -O0" } -// { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } } // Copyright (C) 2011-2019 Free Software Foundation, Inc. //