Skip to content

Commit

Permalink
2018-03-08 François Dumont <fdumont@gcc.gnu.org>
Browse files Browse the repository at this point in the history
	* python/libstdcxx/v6/printers.py (NodeIteratorPrinter): New.
	(StdListIteratorPrinter): Inherit from latter.
	(StdFwdListIteratorPrinter): New, inherit from latter.
	(StdDebugIteratorPrinter.to_string): Use non-debug iterator printer
	when iterator has no associated container.
	(build_libstdcxx_dictionary): Add __gnu_cxx::_Fwd_list_iterator and
	__gnu_cxx::_Fwd_list_const_iterator printers. Remove __norm namespace
	registrations.
	* testsuite/libstdc++-prettyprinters/debug.cc: Adapt.
	* testsuite/libstdc++-prettyprinters/debug_cxx11.cc: Adapt.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@258350 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
fdumont committed Mar 8, 2018
1 parent 7a85853 commit db4f7f8
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 23 deletions.
13 changes: 13 additions & 0 deletions libstdc++-v3/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
2018-03-08 François Dumont <fdumont@gcc.gnu.org>

* python/libstdcxx/v6/printers.py (NodeIteratorPrinter): New.
(StdListIteratorPrinter): Inherit from latter.
(StdFwdListIteratorPrinter): New, inherit from latter.
(StdDebugIteratorPrinter.to_string): Use non-debug iterator printer
when iterator has no associated container.
(build_libstdcxx_dictionary): Add __gnu_cxx::_Fwd_list_iterator and
__gnu_cxx::_Fwd_list_const_iterator printers. Remove __norm namespace
registrations.
* testsuite/libstdc++-prettyprinters/debug.cc: Adapt.
* testsuite/libstdc++-prettyprinters/debug_cxx11.cc: Adapt.

2018-03-06 Ville Voutilainen <ville.voutilainen@gmail.com>

PR libstdc++/84601
Expand Down
44 changes: 25 additions & 19 deletions libstdc++-v3/python/libstdcxx/v6/printers.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,21 +249,32 @@ def to_string(self):
return 'empty %s' % (self.typename)
return '%s' % (self.typename)

class StdListIteratorPrinter:
"Print std::list::iterator"

def __init__(self, typename, val):
class NodeIteratorPrinter:
def __init__(self, typename, val, contname):
self.val = val
self.typename = typename
self.contname = contname

def to_string(self):
if not self.val['_M_node']:
return 'non-dereferenceable iterator for std::list'
return 'non-dereferenceable iterator for std::%s' % (self.contname)
nodetype = find_type(self.val.type, '_Node')
nodetype = nodetype.strip_typedefs().pointer()
node = self.val['_M_node'].cast(nodetype).dereference()
return str(get_value_from_list_node(node))

class StdListIteratorPrinter(NodeIteratorPrinter):
"Print std::list::iterator"

def __init__(self, typename, val):
NodeIteratorPrinter.__init__(self, typename, val, 'list')

class StdFwdListIteratorPrinter(NodeIteratorPrinter):
"Print std::forward_list::iterator"

def __init__(self, typename, val):
NodeIteratorPrinter.__init__(self, typename, val, 'forward_list')

class StdSlistPrinter:
"Print a __gnu_cxx::slist"

Expand Down Expand Up @@ -575,10 +586,12 @@ def __init__ (self, typename, val):
# and return the wrapped iterator value.
def to_string (self):
base_type = gdb.lookup_type('__gnu_debug::_Safe_iterator_base')
itype = self.val.type.template_argument(0)
safe_seq = self.val.cast(base_type)['_M_sequence']
if not safe_seq or self.val['_M_version'] != safe_seq['_M_version']:
if not safe_seq:
return str(self.val.cast(itype))
if self.val['_M_version'] != safe_seq['_M_version']:
return "invalid iterator"
itype = self.val.type.template_argument(0)
return str(self.val.cast(itype))

def num_elements(num):
Expand Down Expand Up @@ -1731,21 +1744,14 @@ def build_libstdcxx_dictionary ():
StdVectorIteratorPrinter)
libstdcxx_printer.add_version('__gnu_cxx::', '_Slist_iterator',
StdSlistIteratorPrinter)
libstdcxx_printer.add_version('__gnu_cxx::', '_Fwd_list_iterator',
StdFwdListIteratorPrinter)
libstdcxx_printer.add_version('__gnu_cxx::', '_Fwd_list_const_iterator',
StdFwdListIteratorPrinter)

# Debug (compiled with -D_GLIBCXX_DEBUG) printer
# registrations. The Rb_tree debug iterator when unwrapped
# from the encapsulating __gnu_debug::_Safe_iterator does not
# have the __norm namespace. Just use the existing printer
# registration for that.
# registrations.
libstdcxx_printer.add('__gnu_debug::_Safe_iterator',
StdDebugIteratorPrinter)
libstdcxx_printer.add('std::__norm::_List_iterator',
StdListIteratorPrinter)
libstdcxx_printer.add('std::__norm::_List_const_iterator',
StdListIteratorPrinter)
libstdcxx_printer.add('std::__norm::_Deque_const_iterator',
StdDequeIteratorPrinter)
libstdcxx_printer.add('std::__norm::_Deque_iterator',
StdDequeIteratorPrinter)

build_libstdcxx_dictionary ()
6 changes: 4 additions & 2 deletions libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.

#define _GLIBCXX_DEBUG
#ifndef _GLIBCXX_DEBUG
# define _GLIBCXX_DEBUG
#endif

#include <string>
#include <deque>
Expand Down Expand Up @@ -96,7 +98,7 @@ main()
v.push_back(1);
v.push_back(2);
std::vector<int>::iterator viter0;
// { dg-final { note-test viter0 {invalid iterator} } }
// { dg-final { note-test viter0 {non-dereferenceable iterator for std::vector} } }
std::vector<int>::iterator viter1 = v.begin();
std::vector<int>::iterator viter2 = viter1 + 1;
v.erase(viter1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.

#define _GLIBCXX_DEBUG
#ifndef _GLIBCXX_DEBUG
# define _GLIBCXX_DEBUG
#endif

#include <forward_list>
#include <unordered_map>
Expand All @@ -31,7 +33,7 @@ main()
{
std::forward_list<std::string> flst;
std::forward_list<std::string>::iterator flstiter0;
// { dg-final { note-test flstiter0 {invalid iterator}} }
// { dg-final { note-test flstiter0 {non-dereferenceable iterator for std::forward_list}} }
flst.push_front("dum");
std::forward_list<std::string>::iterator flstiter1 = flst.begin();
// { dg-final { note-test *flstiter1 {"dum"}} }
Expand Down

0 comments on commit db4f7f8

Please sign in to comment.