10a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Pretty-printers for libstc++. 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Copyright (C) 2008-2013 Free Software Foundation, Inc. 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# This program is free software; you can redistribute it and/or modify 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# it under the terms of the GNU General Public License as published by 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# the Free Software Foundation; either version 3 of the License, or 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# (at your option) any later version. 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# This program is distributed in the hope that it will be useful, 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# but WITHOUT ANY WARRANTY; without even the implied warranty of 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# GNU General Public License for more details. 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# You should have received a copy of the GNU General Public License 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# along with this program. If not, see <http://www.gnu.org/licenses/>. 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport gdb 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport itertools 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport re 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Try to use the new-style pretty-printing if available. 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao_use_gdb_pp = True 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gaotry: 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao import gdb.printing 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoexcept ImportError: 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _use_gdb_pp = False 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Try to install type-printers. 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao_use_type_printing = False 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gaotry: 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao import gdb.types 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if hasattr(gdb.types, 'TypePrinter'): 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _use_type_printing = True 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoexcept ImportError: 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Starting with the type ORIG, search for the member type NAME. This 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# handles searching upward through superclasses. This is needed to 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# work around http://sourceware.org/bugzilla/show_bug.cgi?id=13615. 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef find_type(orig, name): 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao typ = orig.strip_typedefs() 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while True: 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao search = str(typ) + '::' + name 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return gdb.lookup_type(search) 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except RuntimeError: 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # The type was not found, so try the superclass. We only need 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # to check the first superclass, so we don't bother with 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # anything fancier here. 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao field = typ.fields()[0] 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not field.is_base_class: 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise ValueError, "Cannot find type %s::%s" % (str(orig), name) 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao typ = field.type 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass SharedPointerPrinter: 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a shared_ptr or weak_ptr" 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao state = 'empty' 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao refcounts = self.val['_M_refcount']['_M_pi'] 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if refcounts != 0: 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao usecount = refcounts['_M_use_count'] 690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao weakcount = refcounts['_M_weak_count'] 700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if usecount == 0: 710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao state = 'expired, weak %d' % weakcount 720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao state = 'count %d, weak %d' % (usecount, weakcount - 1) 740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s (%s) %s' % (self.typename, state, self.val['_M_ptr']) 750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 760a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass UniquePointerPrinter: 770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a unique_ptr" 780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao v = self.val['_M_t']['_M_head_impl'] 840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('std::unique_ptr<%s> containing %s' % (str(v.type.target()), 850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao str(v))) 860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 870a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdListPrinter: 880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::list" 890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class _iterator: 910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, nodetype, head): 920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.nodetype = nodetype 930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.base = head['_M_next'] 940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.head = head.address 950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = 0 960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.base == self.head: 1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao elt = self.base.cast(self.nodetype).dereference() 1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.base = elt['_M_next'] 1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao count = self.count 1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = self.count + 1 1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('[%d]' % count, elt['_M_data']) 1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children(self): 1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = find_type(self.val.type, '_Node') 1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = nodetype.strip_typedefs().pointer() 1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self._iterator(nodetype, self.val['_M_impl']['_M_node']) 1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.val['_M_impl']['_M_node'].address == self.val['_M_impl']['_M_node']['_M_next']: 1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'empty %s' % (self.typename) 1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s' % (self.typename) 1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdListIteratorPrinter: 1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print std::list::iterator" 1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = find_type(self.val.type, '_Node') 1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = nodetype.strip_typedefs().pointer() 1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val['_M_node'].cast(nodetype).dereference()['_M_data'] 1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdSlistPrinter: 1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a __gnu_cxx::slist" 1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class _iterator: 1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, nodetype, head): 1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.nodetype = nodetype 1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.base = head['_M_head']['_M_next'] 1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = 0 1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.base == 0: 1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao elt = self.base.cast(self.nodetype).dereference() 1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.base = elt['_M_next'] 1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao count = self.count 1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = self.count + 1 1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('[%d]' % count, elt['_M_data']) 1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children(self): 1600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = find_type(self.val.type, '_Node') 1610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = nodetype.strip_typedefs().pointer() 1620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self._iterator(nodetype, self.val) 1630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 1650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.val['_M_head']['_M_next'] == 0: 1660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'empty __gnu_cxx::slist' 1670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '__gnu_cxx::slist' 1680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1690a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdSlistIteratorPrinter: 1700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print __gnu_cxx::slist::iterator" 1710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 1730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 1740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 1760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = find_type(self.val.type, '_Node') 1770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = nodetype.strip_typedefs().pointer() 1780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val['_M_node'].cast(nodetype).dereference()['_M_data'] 1790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1800a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdVectorPrinter: 1810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::vector" 1820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class _iterator: 1840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, start, finish, bitvec): 1850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.bitvec = bitvec 1860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if bitvec: 1870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.item = start['_M_p'] 1880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.so = start['_M_offset'] 1890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.finish = finish['_M_p'] 1900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.fo = finish['_M_offset'] 1910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao itype = self.item.dereference().type 1920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.isize = 8 * itype.sizeof 1930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 1940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.item = start 1950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.finish = finish 1960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = 0 1970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 1990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 2000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 2020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao count = self.count 2030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = self.count + 1 2040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.bitvec: 2050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.item == self.finish and self.so >= self.fo: 2060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 2070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao elt = self.item.dereference() 2080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if elt & (1 << self.so): 2090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao obit = 1 2100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 2110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao obit = 0 2120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.so = self.so + 1 2130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.so >= self.isize: 2140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.item = self.item + 1 2150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.so = 0 2160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('[%d]' % count, obit) 2170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 2180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.item == self.finish: 2190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 2200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao elt = self.item.dereference() 2210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.item = self.item + 1 2220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('[%d]' % count, elt) 2230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 2250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 2260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 2270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.is_bool = val.type.template_argument(0).code == gdb.TYPE_CODE_BOOL 2280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children(self): 2300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self._iterator(self.val['_M_impl']['_M_start'], 2310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val['_M_impl']['_M_finish'], 2320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.is_bool) 2330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 2350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao start = self.val['_M_impl']['_M_start'] 2360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao finish = self.val['_M_impl']['_M_finish'] 2370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao end = self.val['_M_impl']['_M_end_of_storage'] 2380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.is_bool: 2390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao start = self.val['_M_impl']['_M_start']['_M_p'] 2400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao so = self.val['_M_impl']['_M_start']['_M_offset'] 2410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao finish = self.val['_M_impl']['_M_finish']['_M_p'] 2420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao fo = self.val['_M_impl']['_M_finish']['_M_offset'] 2430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao itype = start.dereference().type 2440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao bl = 8 * itype.sizeof 2450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao length = (bl - so) + bl * ((finish - start) - 1) + fo 2460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao capacity = bl * (end - start) 2470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('%s<bool> of length %d, capacity %d' 2480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao % (self.typename, int (length), int (capacity))) 2490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 2500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('%s of length %d, capacity %d' 2510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao % (self.typename, int (finish - start), int (end - start))) 2520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def display_hint(self): 2540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'array' 2550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2560a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdVectorIteratorPrinter: 2570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print std::vector::iterator" 2580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 2600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 2610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 2630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val['_M_current'].dereference() 2640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2650a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdTuplePrinter: 2660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::tuple" 2670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class _iterator: 2690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, head): 2700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.head = head 2710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Set the base class as the initial head of the 2730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # tuple. 2740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodes = self.head.type.fields () 2750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if len (nodes) == 1: 2760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Set the actual head to the first pair. 2770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.head = self.head.cast (nodes[0].type) 2780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao elif len (nodes) != 0: 2790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise ValueError, "Top of tuple tree does not consist of a single node." 2800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = 0 2810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__ (self): 2830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 2840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next (self): 2860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodes = self.head.type.fields () 2870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Check for further recursions in the inheritance tree. 2880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if len (nodes) == 0: 2890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 2900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Check that this iteration has an expected structure. 2910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if len (nodes) != 2: 2920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise ValueError, "Cannot parse more than 2 nodes in a tuple tree." 2930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # - Left node is the next recursion parent. 2950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # - Right node is the actual class contained in the tuple. 2960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Process right node. 2980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao impl = self.head.cast (nodes[1].type) 2990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Process left node and set it as head. 3010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.head = self.head.cast (nodes[0].type) 3020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = self.count + 1 3030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Finally, check the implementation. If it is 3050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # wrapped in _M_head_impl return that, otherwise return 3060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # the value "as is". 3070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao fields = impl.type.fields () 3080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if len (fields) < 1 or fields[0].name != "_M_head_impl": 3090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('[%d]' % self.count, impl) 3100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 3110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('[%d]' % self.count, impl['_M_head_impl']) 3120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 3140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 3150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val; 3160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children (self): 3180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self._iterator (self.val) 3190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 3210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if len (self.val.type.fields ()) == 0: 3220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'empty %s' % (self.typename) 3230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s containing' % (self.typename) 3240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3250a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdStackOrQueuePrinter: 3260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::stack or std::queue" 3270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 3290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 3300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.visualizer = gdb.default_visualizer(val['c']) 3310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children (self): 3330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.visualizer.children() 3340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 3360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s wrapping: %s' % (self.typename, 3370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.visualizer.to_string()) 3380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def display_hint (self): 3400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if hasattr (self.visualizer, 'display_hint'): 3410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.visualizer.display_hint () 3420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return None 3430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3440a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass RbtreeIterator: 3450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, rbtree): 3460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.size = rbtree['_M_t']['_M_impl']['_M_node_count'] 3470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.node = rbtree['_M_t']['_M_impl']['_M_header']['_M_left'] 3480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = 0 3490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 3510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 3520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __len__(self): 3540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return int (self.size) 3550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 3570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.count == self.size: 3580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 3590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.node 3600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = self.count + 1 3610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.count < self.size: 3620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Compute the next node. 3630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = self.node 3640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if node.dereference()['_M_right']: 3650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = node.dereference()['_M_right'] 3660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while node.dereference()['_M_left']: 3670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = node.dereference()['_M_left'] 3680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 3690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao parent = node.dereference()['_M_parent'] 3700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while node == parent.dereference()['_M_right']: 3710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = parent 3720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao parent = parent.dereference()['_M_parent'] 3730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if node.dereference()['_M_right'] != parent: 3740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = parent 3750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.node = node 3760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return result 3770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# This is a pretty printer for std::_Rb_tree_iterator (which is 3790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# std::map::iterator), and has nothing to do with the RbtreeIterator 3800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# class above. 3810a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdRbtreeIteratorPrinter: 3820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print std::map::iterator" 3830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 3850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 3860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 3880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao typename = str(self.val.type.strip_typedefs()) + '::_Link_type' 3890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = gdb.lookup_type(typename).strip_typedefs() 3900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val.cast(nodetype).dereference()['_M_value_field'] 3910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3920a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdDebugIteratorPrinter: 3930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a debug enabled version of an iterator" 3940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 3960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 3970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Just strip away the encapsulating __gnu_debug::_Safe_iterator 3990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # and return the wrapped iterator value. 4000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 4010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao itype = self.val.type.template_argument(0) 4020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val['_M_current'].cast(itype) 4030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4040a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdMapPrinter: 4050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::map or std::multimap" 4060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Turn an RbtreeIterator into a pretty-print iterator. 4080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class _iter: 4090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, rbiter, type): 4100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.rbiter = rbiter 4110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = 0 4120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.type = type 4130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 4150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 4160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 4180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.count % 2 == 0: 4190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao n = self.rbiter.next() 4200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao n = n.cast(self.type).dereference()['_M_value_field'] 4210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.pair = n 4220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao item = n['first'] 4230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 4240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao item = self.pair['second'] 4250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = ('[%d]' % self.count, item) 4260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = self.count + 1 4270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return result 4280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 4300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 4310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 4320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 4340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s with %d elements' % (self.typename, 4350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao len (RbtreeIterator (self.val))) 4360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children (self): 4380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rep_type = find_type(self.val.type, '_Rep_type') 4390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = find_type(rep_type, '_Link_type') 4400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = node.strip_typedefs() 4410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self._iter (RbtreeIterator (self.val), node) 4420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def display_hint (self): 4440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'map' 4450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4460a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdSetPrinter: 4470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::set or std::multiset" 4480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Turn an RbtreeIterator into a pretty-print iterator. 4500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class _iter: 4510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, rbiter, type): 4520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.rbiter = rbiter 4530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = 0 4540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.type = type 4550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 4570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 4580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 4600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao item = self.rbiter.next() 4610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao item = item.cast(self.type).dereference()['_M_value_field'] 4620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # FIXME: this is weird ... what to do? 4630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Maybe a 'set' display hint? 4640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = ('[%d]' % self.count, item) 4650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = self.count + 1 4660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return result 4670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 4690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 4700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 4710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 4730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s with %d elements' % (self.typename, 4740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao len (RbtreeIterator (self.val))) 4750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children (self): 4770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rep_type = find_type(self.val.type, '_Rep_type') 4780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = find_type(rep_type, '_Link_type') 4790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = node.strip_typedefs() 4800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self._iter (RbtreeIterator (self.val), node) 4810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4820a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdBitsetPrinter: 4830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::bitset" 4840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 4860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 4870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 4880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 4900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # If template_argument handled values, we could print the 4910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # size. Or we could use a regexp on the type. 4920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s' % (self.typename) 4930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children (self): 4950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao words = self.val['_M_w'] 4960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao wtype = words.type 4970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # The _M_w member can be either an unsigned long, or an 4990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # array. This depends on the template specialization used. 5000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # If it is a single long, convert to a single element list. 5010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if wtype.code == gdb.TYPE_CODE_ARRAY: 5020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao tsize = wtype.target ().sizeof 5030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 5040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao words = [words] 5050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao tsize = wtype.sizeof 5060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nwords = wtype.sizeof / tsize 5080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = [] 5090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao byte = 0 5100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while byte < nwords: 5110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao w = words[byte] 5120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao bit = 0 5130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while w != 0: 5140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if (w & 1) != 0: 5150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Another spot where we could use 'set'? 5160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result.append(('[%d]' % (byte * tsize * 8 + bit), 1)) 5170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao bit = bit + 1 5180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao w = w >> 1 5190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao byte = byte + 1 5200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return result 5210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5220a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdDequePrinter: 5230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::deque" 5240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class _iter: 5260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, node, start, end, last, buffer_size): 5270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.node = node 5280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.p = start 5290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.end = end 5300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.last = last 5310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.buffer_size = buffer_size 5320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = 0 5330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 5350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 5360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 5380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.p == self.last: 5390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 5400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = ('[%d]' % self.count, self.p.dereference()) 5420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = self.count + 1 5430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Advance the 'cur' pointer. 5450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.p = self.p + 1 5460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.p == self.end: 5470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # If we got to the end of this bucket, move to the 5480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # next bucket. 5490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.node = self.node + 1 5500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.p = self.node[0] 5510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.end = self.p + self.buffer_size 5520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return result 5540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 5560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 5570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 5580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.elttype = val.type.template_argument(0) 5590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao size = self.elttype.sizeof 5600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if size < 512: 5610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.buffer_size = int (512 / size) 5620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 5630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.buffer_size = 1 5640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 5660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao start = self.val['_M_impl']['_M_start'] 5670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao end = self.val['_M_impl']['_M_finish'] 5680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao delta_n = end['_M_node'] - start['_M_node'] - 1 5700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao delta_s = start['_M_last'] - start['_M_cur'] 5710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao delta_e = end['_M_cur'] - end['_M_first'] 5720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao size = self.buffer_size * delta_n + delta_s + delta_e 5740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s with %d elements' % (self.typename, long (size)) 5760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children(self): 5780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao start = self.val['_M_impl']['_M_start'] 5790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao end = self.val['_M_impl']['_M_finish'] 5800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self._iter(start['_M_node'], start['_M_cur'], start['_M_last'], 5810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao end['_M_cur'], self.buffer_size) 5820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def display_hint (self): 5840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'array' 5850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5860a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdDequeIteratorPrinter: 5870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print std::deque::iterator" 5880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 5900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 5910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 5930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val['_M_cur'].dereference() 5940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5950a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdStringPrinter: 5960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::basic_string of some kind" 5970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 5990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 6000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 6020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Make sure &string works, too. 6030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao type = self.val.type 6040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if type.code == gdb.TYPE_CODE_REF: 6050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao type = type.target () 6060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Calculate the length of the string so that to_string returns 6080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # the string according to length, not according to first null 6090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # encountered. 6100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ptr = self.val ['_M_dataplus']['_M_p'] 6110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao realtype = type.unqualified ().strip_typedefs () 6120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer () 6130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao header = ptr.cast(reptype) - 1 6140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao len = header.dereference ()['_M_length'] 6150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if hasattr(ptr, "lazy_string"): 6160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ptr.lazy_string (length = len) 6170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ptr.string (length = len) 6180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def display_hint (self): 6200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'string' 6210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6220a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass Tr1HashtableIterator: 6230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, hash): 6240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.node = hash['_M_bbegin']['_M_node']['_M_nxt'] 6250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.node_type = find_type(hash.type, '__node_type').pointer() 6260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__ (self): 6280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 6290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next (self): 6310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.node == 0: 6320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 6330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao node = self.node.cast(self.node_type) 6340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = node.dereference()['_M_v'] 6350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.node = node.dereference()['_M_nxt'] 6360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return result 6370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6380a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass Tr1UnorderedSetPrinter: 6390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a tr1::unordered_set" 6400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 6420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 6430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 6440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def hashtable (self): 6460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.typename.startswith('std::tr1'): 6470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val 6480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val['_M_h'] 6490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 6510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s with %d elements' % (self.typename, self.hashtable()['_M_element_count']) 6520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao @staticmethod 6540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def format_count (i): 6550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '[%d]' % i 6560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children (self): 6580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao counter = itertools.imap (self.format_count, itertools.count()) 6590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return itertools.izip (counter, Tr1HashtableIterator (self.hashtable())) 6600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6610a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass Tr1UnorderedMapPrinter: 6620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a tr1::unordered_map" 6630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__ (self, typename, val): 6650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 6660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 6670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def hashtable (self): 6690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.typename.startswith('std::tr1'): 6700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val 6710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.val['_M_h'] 6720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string (self): 6740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s with %d elements' % (self.typename, self.hashtable()['_M_element_count']) 6750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao @staticmethod 6770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def flatten (list): 6780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for elt in list: 6790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for i in elt: 6800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao yield i 6810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao @staticmethod 6830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def format_one (elt): 6840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return (elt['first'], elt['second']) 6850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao @staticmethod 6870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def format_count (i): 6880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '[%d]' % i 6890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children (self): 6910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao counter = itertools.imap (self.format_count, itertools.count()) 6920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Map over the hash table and flatten the result. 6930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao data = self.flatten (itertools.imap (self.format_one, Tr1HashtableIterator (self.hashtable()))) 6940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Zip the two iterators together. 6950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return itertools.izip (counter, data) 6960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def display_hint (self): 6980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'map' 6990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7000a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StdForwardListPrinter: 7010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Print a std::forward_list" 7020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class _iterator: 7040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, nodetype, head): 7050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.nodetype = nodetype 7060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.base = head['_M_next'] 7070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = 0 7080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 7100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 7110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 7130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.base == 0: 7140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 7150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao elt = self.base.cast(self.nodetype).dereference() 7160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.base = elt['_M_next'] 7170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao count = self.count 7180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.count = self.count + 1 7190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao valptr = elt['_M_storage'].address 7200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao valptr = valptr.cast(elt.type.template_argument(0).pointer()) 7210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ('[%d]' % count, valptr.dereference()) 7220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, typename, val): 7240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.val = val 7250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.typename = typename 7260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def children(self): 7280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = find_type(self.val.type, '_Node') 7290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao nodetype = nodetype.strip_typedefs().pointer() 7300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self._iterator(nodetype, self.val['_M_impl']['_M_head']) 7310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def to_string(self): 7330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.val['_M_impl']['_M_head']['_M_next'] == 0: 7340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'empty %s' % (self.typename) 7350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '%s' % (self.typename) 7360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# A "regular expression" printer which conforms to the 7390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# "SubPrettyPrinter" protocol from gdb.printing. 7400a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass RxPrinter(object): 7410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, name, function): 7420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao super(RxPrinter, self).__init__() 7430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.name = name 7440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.function = function 7450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.enabled = True 7460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def invoke(self, value): 7480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not self.enabled: 7490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return None 7500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.function(self.name, value) 7510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# A pretty-printer that conforms to the "PrettyPrinter" protocol from 7530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# gdb.printing. It can also be used directly as an old-style printer. 7540a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass Printer(object): 7550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, name): 7560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao super(Printer, self).__init__() 7570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.name = name 7580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.subprinters = [] 7590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.lookup = {} 7600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.enabled = True 7610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.compiled_rx = re.compile('^([a-zA-Z0-9_:]+)<.*>$') 7620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def add(self, name, function): 7640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # A small sanity check. 7650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # FIXME 7660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not self.compiled_rx.match(name + '<>'): 7670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise ValueError, 'libstdc++ programming error: "%s" does not match' % name 7680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao printer = RxPrinter(name, function) 7690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.subprinters.append(printer) 7700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.lookup[name] = printer 7710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Add a name using _GLIBCXX_BEGIN_NAMESPACE_VERSION. 7730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def add_version(self, base, name, function): 7740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.add(base + name, function) 7750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.add(base + '__7::' + name, function) 7760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Add a name using _GLIBCXX_BEGIN_NAMESPACE_CONTAINER. 7780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def add_container(self, base, name, function): 7790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.add_version(base, name, function) 7800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.add_version(base + '__cxx1998::', name, function) 7810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao @staticmethod 7830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def get_basic_type(type): 7840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # If it points to a reference, get the reference. 7850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if type.code == gdb.TYPE_CODE_REF: 7860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao type = type.target () 7870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Get the unqualified type, stripped of typedefs. 7890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao type = type.unqualified ().strip_typedefs () 7900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return type.tag 7920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __call__(self, val): 7940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao typename = self.get_basic_type(val.type) 7950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not typename: 7960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return None 7970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 7980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # All the types we match are template types, so we can use a 7990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # dictionary. 8000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao match = self.compiled_rx.match(typename) 8010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not match: 8020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return None 8030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao basename = match.group(1) 8050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if basename in self.lookup: 8060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.lookup[basename].invoke(val) 8070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Cannot find a pretty printer. Return None. 8090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return None 8100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8110a8c90248264a8b26970b4473770bcc3df8515fJosh Gaolibstdcxx_printer = None 8120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8130a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass FilteringTypePrinter(object): 8140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, match, name): 8150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.match = match 8160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.name = name 8170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.enabled = True 8180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class _recognizer(object): 8200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, match, name): 8210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.match = match 8220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.name = name 8230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.type_obj = None 8240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def recognize(self, type_obj): 8260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if type_obj.tag is None: 8270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return None 8280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.type_obj is None: 8300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not self.match in type_obj.tag: 8310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Filter didn't match. 8320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return None 8330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 8340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.type_obj = gdb.lookup_type(self.name).strip_typedefs() 8350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except: 8360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 8370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.type_obj == type_obj: 8380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.name 8390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return None 8400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def instantiate(self): 8420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self._recognizer(self.match, self.name) 8430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8440a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef add_one_type_printer(obj, match, name): 8450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao printer = FilteringTypePrinter(match, 'std::' + name) 8460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao gdb.types.register_type_printer(obj, printer) 8470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8480a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef register_type_printers(obj): 8490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao global _use_type_printing 8500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not _use_type_printing: 8520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 8530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for pfx in ('', 'w'): 8550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_string', pfx + 'string') 8560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_ios', pfx + 'ios') 8570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_streambuf', pfx + 'streambuf') 8580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_istream', pfx + 'istream') 8590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_ostream', pfx + 'ostream') 8600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_iostream', pfx + 'iostream') 8610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_stringbuf', pfx + 'stringbuf') 8620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_istringstream', 8630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pfx + 'istringstream') 8640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_ostringstream', 8650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pfx + 'ostringstream') 8660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_stringstream', 8670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pfx + 'stringstream') 8680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_filebuf', pfx + 'filebuf') 8690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_ifstream', pfx + 'ifstream') 8700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_ofstream', pfx + 'ofstream') 8710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_fstream', pfx + 'fstream') 8720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_regex', pfx + 'regex') 8730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'sub_match', pfx + 'csub_match') 8740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'sub_match', pfx + 'ssub_match') 8750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'match_results', pfx + 'cmatch') 8760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'match_results', pfx + 'smatch') 8770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'regex_iterator', pfx + 'cregex_iterator') 8780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'regex_iterator', pfx + 'sregex_iterator') 8790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'regex_token_iterator', 8800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pfx + 'cregex_token_iterator') 8810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'regex_token_iterator', 8820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pfx + 'sregex_token_iterator') 8830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Note that we can't have a printer for std::wstreampos, because 8850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # it shares the same underlying type as std::streampos. 8860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'fpos', 'streampos') 8870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_string', 'u16string') 8880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'basic_string', 'u32string') 8890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for dur in ('nanoseconds', 'microseconds', 'milliseconds', 8910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'seconds', 'minutes', 'hours'): 8920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'duration', dur) 8930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 8940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'linear_congruential_engine', 'minstd_rand0') 8950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'linear_congruential_engine', 'minstd_rand') 8960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'mersenne_twister_engine', 'mt19937') 8970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'mersenne_twister_engine', 'mt19937_64') 8980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'subtract_with_carry_engine', 'ranlux24_base') 8990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'subtract_with_carry_engine', 'ranlux48_base') 9000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'discard_block_engine', 'ranlux24') 9010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'discard_block_engine', 'ranlux48') 9020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao add_one_type_printer(obj, 'shuffle_order_engine', 'knuth_b') 9030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9040a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef register_libstdcxx_printers (obj): 9050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "Register libstdc++ pretty-printers with objfile Obj." 9060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao global _use_gdb_pp 9080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao global libstdcxx_printer 9090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if _use_gdb_pp: 9110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao gdb.printing.register_pretty_printer(obj, libstdcxx_printer) 9120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 9130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if obj is None: 9140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao obj = gdb 9150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao obj.pretty_printers.append(libstdcxx_printer) 9160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao register_type_printers(obj) 9180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9190a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef build_libstdcxx_dictionary (): 9200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao global libstdcxx_printer 9210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer = Printer("libstdc++-v6") 9230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # For _GLIBCXX_BEGIN_NAMESPACE_VERSION. 9250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao vers = '(__7::)?' 9260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # For _GLIBCXX_BEGIN_NAMESPACE_CONTAINER. 9270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao container = '(__cxx1998::' + vers + ')?' 9280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # libstdc++ objects requiring pretty-printing. 9300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # In order from: 9310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01847.html 9320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', 'basic_string', StdStringPrinter) 9330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'bitset', StdBitsetPrinter) 9340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'deque', StdDequePrinter) 9350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'list', StdListPrinter) 9360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'map', StdMapPrinter) 9370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'multimap', StdMapPrinter) 9380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'multiset', StdSetPrinter) 9390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', 'priority_queue', 9400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdStackOrQueuePrinter) 9410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', 'queue', StdStackOrQueuePrinter) 9420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', 'tuple', StdTuplePrinter) 9430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'set', StdSetPrinter) 9440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', 'stack', StdStackOrQueuePrinter) 9450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', 'unique_ptr', UniquePointerPrinter) 9460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'vector', StdVectorPrinter) 9470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # vector<bool> 9480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Printer registrations for classes compiled with -D_GLIBCXX_DEBUG. 9500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::bitset', StdBitsetPrinter) 9510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::deque', StdDequePrinter) 9520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::list', StdListPrinter) 9530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::map', StdMapPrinter) 9540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::multimap', StdMapPrinter) 9550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::multiset', StdSetPrinter) 9560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::priority_queue', 9570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdStackOrQueuePrinter) 9580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::queue', StdStackOrQueuePrinter) 9590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::set', StdSetPrinter) 9600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::stack', StdStackOrQueuePrinter) 9610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::unique_ptr', UniquePointerPrinter) 9620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::vector', StdVectorPrinter) 9630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # These are the TR1 and C++0x printers. 9650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # For array - the default GDB pretty-printer seems reasonable. 9660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', 'shared_ptr', SharedPointerPrinter) 9670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', 'weak_ptr', SharedPointerPrinter) 9680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'unordered_map', 9690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedMapPrinter) 9700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'unordered_set', 9710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedSetPrinter) 9720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'unordered_multimap', 9730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedMapPrinter) 9740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'unordered_multiset', 9750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedSetPrinter) 9760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', 'forward_list', 9770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdForwardListPrinter) 9780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::tr1::', 'shared_ptr', SharedPointerPrinter) 9800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::tr1::', 'weak_ptr', SharedPointerPrinter) 9810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::tr1::', 'unordered_map', 9820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedMapPrinter) 9830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::tr1::', 'unordered_set', 9840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedSetPrinter) 9850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::tr1::', 'unordered_multimap', 9860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedMapPrinter) 9870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::tr1::', 'unordered_multiset', 9880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedSetPrinter) 9890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 9900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # These are the C++0x printer registrations for -D_GLIBCXX_DEBUG cases. 9910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # The tr1 namespace printers do not seem to have any debug 9920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # equivalents, so do no register them. 9930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::unordered_map', 9940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedMapPrinter) 9950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::unordered_set', 9960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedSetPrinter) 9970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::unordered_multimap', 9980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedMapPrinter) 9990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::unordered_multiset', 10000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Tr1UnorderedSetPrinter) 10010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__debug::forward_list', 10020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdForwardListPrinter) 10030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 10040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 10050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Extensions. 10060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('__gnu_cxx::', 'slist', StdSlistPrinter) 10070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 10080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if True: 10090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # These shouldn't be necessary, if GDB "print *i" worked. 10100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # But it often doesn't, so here they are. 10110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', '_List_iterator', 10120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdListIteratorPrinter) 10130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', '_List_const_iterator', 10140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdListIteratorPrinter) 10150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', '_Rb_tree_iterator', 10160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdRbtreeIteratorPrinter) 10170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('std::', '_Rb_tree_const_iterator', 10180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdRbtreeIteratorPrinter) 10190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', '_Deque_iterator', 10200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdDequeIteratorPrinter) 10210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_container('std::', '_Deque_const_iterator', 10220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdDequeIteratorPrinter) 10230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('__gnu_cxx::', '__normal_iterator', 10240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdVectorIteratorPrinter) 10250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add_version('__gnu_cxx::', '_Slist_iterator', 10260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdSlistIteratorPrinter) 10270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 10280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Debug (compiled with -D_GLIBCXX_DEBUG) printer 10290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # registrations. The Rb_tree debug iterator when unwrapped 10300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # from the encapsulating __gnu_debug::_Safe_iterator does not 10310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # have the __norm namespace. Just use the existing printer 10320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # registration for that. 10330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('__gnu_debug::_Safe_iterator', 10340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdDebugIteratorPrinter) 10350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__norm::_List_iterator', 10360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdListIteratorPrinter) 10370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__norm::_List_const_iterator', 10380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdListIteratorPrinter) 10390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__norm::_Deque_const_iterator', 10400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdDequeIteratorPrinter) 10410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libstdcxx_printer.add('std::__norm::_Deque_iterator', 10420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StdDequeIteratorPrinter) 10430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 10440a8c90248264a8b26970b4473770bcc3df8515fJosh Gaobuild_libstdcxx_dictionary () 1045