Debug mode enhancements

François Dumont frs.dumont@gmail.com
Fri Jun 12 17:12:00 GMT 2015


Hi

    This is a patch to:

- Enhance __get_distance to get a better feedback about distance between
iterators so that we can take sharper decision about what is right or
not. This function is now aware about safe iterators and leverage on
those a little like std::distance does with C++ 11 list::iterator.
- Make debug mode aware about iterator adapters reverse_iterator and
move_iterator.
- Thanks to previous points this patch also extend situations where it
is possible to remove debug layers on iterators to lower performance
hint of this mode. We now detect at runtime if we know enough about the
iterator range to get rid of the potential debug layer.

    For the last point I introduced __gnu_debug::__unsafe which remove
debug layer unconditionally in opposition to __gnu_debug::__base which
do so only for random access iterator. The latter has been kept to be
used in context of constructors.

    I had to introduced new debug headers to limit impact in
stl_iterator.h. We shall not include debug.h here as the purpose is not
to inject debug checks in the normal code.

    Note that the new __get_distance will be very useful to implement
proper debug algos

    Here is the tricky part for me, the ChangeLog entry, much more
complicated than the code :-)

    * include/bits/stl_iterator_base_types.h (_Iter_base): Limit definition
    to pre-C++11 mode.
    * include/debug/functions.h
    (__gnu_debug::__valid_range, __gnu_debug::__base): Move...
    * include/debug/safe_iterator.h
    (__gnu_debug::_Sequence_traits): New.
    (__gnu_debug::__get_distance_from_begin): New.
    (__gnu_debug::__get_distance_to_end): New.
    (__gnu_debug::_Safe_iterator<>::_M_valid_range): Expose iterator range
    distance information. Add optional check_dereferenceable parameter,
    default true.
    (__gnu_debug::_Distance_precision, __gnu_debug::__get_distance): Move
    default definition...
    (__gnu_debug::__get_distance): New overload for _Safe_iterator.
    (__gnu_debug::__unsafe): Likewise.
    * include/debug/helper_functions.h: ...here. New.
    (__gnu_debug::__unsafe): New helper function to remove safe iterator
    layer.
    * include/debug/stl_iterator.h: New. Include latter.
    * include/bits/stl_iterator.h: Include latter in debug mode.
    * include/debug/stl_iterator.tcc: Adapt.
    * include/debug/safe_local_iterator.h (__gnu_debug::__get_distance): Add
    overload for _Safe_local_iterator.
    (__gnu_debug::__unsafe): Likewise.
    * include/debug/safe_local_iterator.tcc: Adapt.
    * include/debug/macros.h (__glibcxx_check_valid_range2): New.
    (__glibcxx_check_insert_range): Add _Dist parameter.
    (__glibcxx_check_insert_range_after): Likewise.
    * include/debug/deque (deque<>::assign): Remove iterator debug layer
    when possible.
    (deque<>::insert): Likewise.
    * include/debug/forward_list (__glibcxx_check_valid_fl_range): New.
    (forward_list<>::splice_after): Use latter.
    (forward_list<>::assign): Remove iterator debug layer when possible.
    (forward_list<>::insert_after): Likewise.
    (__gnu_debug::_Sequence_traits<>): Partial specialization.
    * include/debug/list (list<>::assign): Remove iterator debug layer when
    possible.
    (list<>::insert): Likewise.
    [__gnu_debug::_Sequence_traits<>]: Partial specialization pre C++11 ABI.
    * include/debug/map.h (map<>::insert): Remove iterator debug layer when
    possible.
    * include/debug/multimap.h (multimap<>::insert): Likewise.
    * include/debug/set.h (set<>::insert): Likewise.
    * include/debug/multiset.h (multiset<>::insert): Likewise.
    * include/debug/string (basic_string<>::append, basic_string<>::assign,
    basic_string<>::insert, basic_string<>::replace): Likewise.
    * include/debug/unordered_map
    (unordered_map<>::insert, unordered_multimap<>::insert): Likewise.
    * include/debug/unordered_set
    (unordered_set<>::insert, unordered_multiset<>insert): Likewise.
    * include/debug/vector
    (vector<>::assign, vector<>::insert): Likewise.
    * include/Makefile.am: Add new debug headers.
    * include/Makefile.in: Regenerate.

Being fully tested under Linux x86_64.

François

-------------- next part --------------
A non-text attachment was scrubbed...
Name: get_distance.patch
Type: text/x-patch
Size: 55689 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20150612/d4d6d0e5/attachment.bin>


More information about the Libstdc++ mailing list