From patchwork Mon Jan 9 20:25:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Fran=C3=A7ois_Dumont?= X-Patchwork-Id: 90577 Delivered-To: patch@linaro.org Received: by 10.140.20.99 with SMTP id 90csp262715qgi; Mon, 9 Jan 2017 12:25:58 -0800 (PST) X-Received: by 10.84.142.1 with SMTP id 1mr192956223plw.87.1483993558497; Mon, 09 Jan 2017 12:25:58 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id f17si89930120plj.110.2017.01.09.12.25.58 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 09 Jan 2017 12:25:58 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-445711-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-445711-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-445711-patch=linaro.org@gcc.gnu.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :subject:to:references:cc:message-id:date:mime-version :in-reply-to:content-type; q=dns; s=default; b=TisNGNQ2ptxeHeFvr D3PF96C6f8INnbkcHKa5p0/827sT6MJda4dP5Fpl6v3/ypiIpQIkr3sNec0sT0Mc f4hjXDDYueshHxoQuC8dQLSZnUijI4iZxJXbBRvN/H0KIkZ8V72XfOKVn7/iiKjM qLEBC2J3pyYLPuUFTgojcBQdWU= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :subject:to:references:cc:message-id:date:mime-version :in-reply-to:content-type; s=default; bh=efscUoNw97JQD+MLHYbJpN/ /VL0=; b=dVAnwmwaRBtFpJl/99gJTX4jWjrgHPefuaDH3Rtqskw0028FM+J9VFH N/KHwqDMvUjuabJV7EtMZKCtjHmgruQidSDYe0EX79lTp2T9g5GOAqokqR9Rlkrc dFsbMWtHVzeKXBrv/DFi/gA287BQ34L+lT97XARHCcwmRfTKIar8= Received: (qmail 19939 invoked by alias); 9 Jan 2017 20:25:35 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 19914 invoked by uid 89); 9 Jan 2017 20:25:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.0 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS, URIBL_BLACK autolearn=no version=3.3.2 spammy=_M_index, _m_index, franois, Franois X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-wm0-f42.google.com Received: from mail-wm0-f42.google.com (HELO mail-wm0-f42.google.com) (74.125.82.42) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 09 Jan 2017 20:25:24 +0000 Received: by mail-wm0-f42.google.com with SMTP id k184so135217490wme.1; Mon, 09 Jan 2017 12:25:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:references:cc:message-id:date :user-agent:mime-version:in-reply-to; bh=/+6994NBs5NE6yEzXaKztlZXe5DcX3IkD8EGZ30Zxdg=; b=NbJ63pyfd4dXav8t2eW5CyMtvCYuAxDq70OSHeWJwAAOeOWVUIkb2eOLuiXqq6znXm e73lSrNDaxVMgDPDI4iUzWOb/NHjpBFWzSEYaAVm6sgc6OzFHizu665SU0XCvspiL2bU dm8j4taNHGpjPqz5TEQ51L5cIFHmfotYzXgYuQ2oDVrVuVgcqyCYiRgrZaqfRALwNgQ8 tnONFd4b5MUTmE/Uuj7h4WZ9zldty7ujaJl1uZtLez5dBQuKpA90QhNs5OeuAtl/BYh5 79CZk21uspFuX6Kg8vnca6EwuXhdod3nxWCwl3O0O5xSc6c8QCps5YybOFksbTrpmCBA mhgA== X-Gm-Message-State: AIkVDXKAl6qiW/xcIiQeK7zmEm0lE2/1VtJQtJuqVTzic424HwZ6lPkrjA3IbfhARQbsDg== X-Received: by 10.223.136.36 with SMTP id d33mr828086wrd.199.1483993522419; Mon, 09 Jan 2017 12:25:22 -0800 (PST) Received: from [192.168.0.23] (arf62-1-82-237-250-248.fbx.proxad.net. [82.237.250.248]) by smtp.googlemail.com with ESMTPSA id bc2sm3903426wjb.38.2017.01.09.12.25.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 09 Jan 2017 12:25:21 -0800 (PST) From: =?UTF-8?Q?Fran=c3=a7ois_Dumont?= Subject: Re: Pretty printers for versioned namespace To: Jonathan Wakely References: <37f043c2-5022-feb2-598b-5cb8ba11d762@gmail.com> <20161129201709.GL3301@redhat.com> <71a8120b-494a-c074-bb13-1ddfa560fdf2@gmail.com> <20161202004150.GI3301@redhat.com> <1a5de3bf-9cfc-3569-6dc8-7ffcd99c286f@gmail.com> <20161209151830.GH6326@redhat.com> <20161215145717.GB22266@redhat.com> <20170104125240.GH895@redhat.com> Cc: "libstdc++@gcc.gnu.org" , gcc-patches Message-ID: <9b83337c-ee12-df97-9035-7636955f0bf9@gmail.com> Date: Mon, 9 Jan 2017 21:25:20 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 In-Reply-To: <20170104125240.GH895@redhat.com> On 04/01/2017 13:52, Jonathan Wakely wrote: > On 24/12/16 14:47 +0100, François Dumont wrote: > > I'd prefer not to have to use the regex matches in libstdc++.exp as > they complicate things. > > For the two examples above, the whatis results are bad even for the > non-versioned namespace. For specializations of basic_string we only > have type printers that recognize the standard typedefs like > std::u16string, but not other specializations. We really want it to > show std::basic_string not the full name. That would > require a TemplateTypePrinter for basic_string. The attached patch > works, and should be easy to incorporate into your changes for the > versioned namespace. > + add_one_template_type_printer(obj, 'basic_string', + 'basic_string<((un)?signed char), std::char_traits<\\1 ?>, std::allocator<\\1 ?> >', + 'basic_string<{1}>') + I had consider a similar approach but more generic like: + add_one_template_type_printer(obj, 'basic_string', + 'basic_string<(.*)?, std::char_traits<\\1 ?>, std::allocator<\\1 ?> >', + 'basic_string<{1}>') + but it had bad effect on rendering of std::string type so I give up on this approach. Your version is indeed enough to cover not too exotic instantiations of std::basic_string. I also updated 48362.cc test case as this test was already adapted for versioned namespace. But I had to keep one occurence of '__7' when displaying types inside a tuple. I think it is ok. Tested with versioned namespace. Is it ok to commit after I completed tests without versioned namespace ? François diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index 7690a6b..9de1a96 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -36,6 +36,8 @@ import sys # We probably can't do much about this until this GDB PR is addressed: # +vers_nsp = '__7::' + if sys.version_info[0] > 2: ### Python 3 stuff Iterator = object @@ -100,11 +102,15 @@ def find_type(orig, name): raise ValueError("Cannot find type %s::%s" % (str(orig), name)) typ = field.type +# Test if a type is a given template instantiation. +def is_specialization_of(type, template_name): + return re.match('^std::(%s)?%s<.*>$' % (vers_nsp, template_name), type) is not None + class SharedPointerPrinter: "Print a shared_ptr or weak_ptr" def __init__ (self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val def to_string (self): @@ -127,9 +133,9 @@ class UniquePointerPrinter: def to_string (self): impl_type = self.val.type.fields()[0].type.tag - if impl_type.startswith('std::__uniq_ptr_impl<'): # New implementation + if is_specialization_of(impl_type, '__uniq_ptr_impl'): # New implementation v = self.val['_M_t']['_M_t']['_M_head_impl'] - elif impl_type.startswith('std::tuple<'): + elif is_specialization_of(impl_type, 'tuple'): v = self.val['_M_t']['_M_head_impl'] else: raise ValueError("Unsupported implementation for unique_ptr: %s" % self.val.type.fields()[0].type.tag) @@ -179,7 +185,7 @@ class StdListPrinter: return ('[%d]' % count, val) def __init__(self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val def children(self): @@ -299,7 +305,7 @@ class StdVectorPrinter: return ('[%d]' % count, elt) def __init__(self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val self.is_bool = val.type.template_argument(0).code == gdb.TYPE_CODE_BOOL @@ -403,7 +409,7 @@ class StdTuplePrinter: return ('[%d]' % self.count, impl['_M_head_impl']) def __init__ (self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val; def children (self): @@ -418,7 +424,7 @@ class StdStackOrQueuePrinter: "Print a std::stack or std::queue" def __init__ (self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.visualizer = gdb.default_visualizer(val['c']) def children (self): @@ -496,7 +502,10 @@ class StdRbtreeIteratorPrinter: def __init__ (self, typename, val): self.val = val valtype = self.val.type.template_argument(0).strip_typedefs() - nodetype = gdb.lookup_type('std::_Rb_tree_node<' + str(valtype) + '>') + if typename.startswith('std::' + vers_nsp): + nodetype = gdb.lookup_type('std::' + vers_nsp + '_Rb_tree_node<' + str(valtype) + '>') + else: + nodetype = gdb.lookup_type('std::_Rb_tree_node<' + str(valtype) + '>') self.link_type = nodetype.strip_typedefs().pointer() def to_string (self): @@ -552,7 +561,7 @@ class StdMapPrinter: return result def __init__ (self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val def to_string (self): @@ -592,7 +601,7 @@ class StdSetPrinter: return result def __init__ (self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val def to_string (self): @@ -609,7 +618,7 @@ class StdBitsetPrinter: "Print a std::bitset" def __init__(self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val def to_string (self): @@ -679,7 +688,7 @@ class StdDequePrinter: return result def __init__(self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val self.elttype = val.type.template_argument(0) size = self.elttype.sizeof @@ -805,7 +814,7 @@ class Tr1UnorderedSetPrinter: "Print a tr1::unordered_set" def __init__ (self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val def hashtable (self): @@ -831,7 +840,7 @@ class Tr1UnorderedMapPrinter: "Print a tr1::unordered_map" def __init__ (self, typename, val): - self.typename = typename + self.typename = typename.replace(vers_nsp, '') self.val = val def hashtable (self): @@ -897,7 +906,7 @@ class StdForwardListPrinter: def __init__(self, typename, val): self.val = val - self.typename = typename + self.typename = typename.replace(vers_nsp, '') def children(self): nodetype = find_type(self.val.type, '_Node') @@ -952,12 +961,11 @@ class SingleObjContainerPrinter(object): return self.visualizer.display_hint () return self.hint - class StdExpAnyPrinter(SingleObjContainerPrinter): "Print a std::any or std::experimental::any" def __init__ (self, typename, val): - self.typename = re.sub('^std::experimental::fundamentals_v\d::', 'std::experimental::', typename, 1) + self.typename = re.sub('^std::experimental::fundamentals_v\d::', 'std::experimental::', typename, 1).replace(vers_nsp, '') self.val = val self.contained_type = None contained_value = None @@ -972,8 +980,11 @@ class StdExpAnyPrinter(SingleObjContainerPrinter): if not m: raise ValueError("Unknown manager function in %s" % self.typename) + mgrname = m.group(1) # FIXME need to expand 'std::string' so that gdb.lookup_type works - mgrname = re.sub("std::string(?!\w)", str(gdb.lookup_type('std::string').strip_typedefs()), m.group(1)) + if 'std::string' in mgrname: + mgrname = re.sub("std::string(?!\w)", str(gdb.lookup_type('std::string').strip_typedefs()), m.group(1)) + mgrtype = gdb.lookup_type(mgrname) self.contained_type = mgrtype.template_argument(0) valptr = None @@ -994,14 +1005,14 @@ class StdExpAnyPrinter(SingleObjContainerPrinter): if hasattr (self.visualizer, 'children'): return desc + self.visualizer.to_string () valtype = self._recognize (self.contained_type) - return desc + valtype + return desc + str(valtype).replace(vers_nsp, '') class StdExpOptionalPrinter(SingleObjContainerPrinter): "Print a std::optional or std::experimental::optional" def __init__ (self, typename, val): valtype = self._recognize (val.type.template_argument(0)) - self.typename = re.sub('^std::(experimental::|)(fundamentals_v\d::|)(.*)', r'std::\1\3<%s>' % valtype, typename, 1) + self.typename = re.sub('^std::(experimental::|)(fundamentals_v\d::|)(.*)', r'std::\1\3<%s>' % valtype, typename, 1).replace(vers_nsp, '') self.val = val contained_value = val['_M_payload'] if self.val['_M_engaged'] else None visualizer = gdb.default_visualizer (val['_M_payload']) @@ -1021,6 +1032,7 @@ class StdVariantPrinter(SingleObjContainerPrinter): def __init__(self, typename, val): alternatives = self._template_args(val) self.typename = "%s<%s>" % (typename, ', '.join([self._recognize(alt) for alt in alternatives])) + self.typename = self.typename.replace(vers_nsp, '') self.index = val['_M_index'] if self.index >= len(alternatives): self.contained_type = None @@ -1058,7 +1070,7 @@ class StdNodeHandlePrinter(SingleObjContainerPrinter): def __init__(self, typename, val): self.value_type = val.type.template_argument(1) nodetype = val.type.template_argument(2).template_argument(0) - self.is_rb_tree_node = nodetype.name.startswith('std::_Rb_tree_node') + self.is_rb_tree_node = is_specialization_of(nodetype.name, '_Rb_tree_node') self.is_map_node = val.type.template_argument(0) != self.value_type nodeptr = val['_M_ptr'] if nodeptr: @@ -1202,7 +1214,7 @@ class Printer(object): # Add a name using _GLIBCXX_BEGIN_NAMESPACE_VERSION. def add_version(self, base, name, function): self.add(base + name, function) - self.add(base + '__7::' + name, function) + self.add(base + vers_nsp + name, function) # Add a name using _GLIBCXX_BEGIN_NAMESPACE_CONTAINER. def add_container(self, base, name, function): @@ -1322,7 +1334,7 @@ class FilteringTypePrinter(object): except: pass if self.type_obj == type_obj: - return self.name + return self.name.replace(vers_nsp, '') return None def instantiate(self): @@ -1331,6 +1343,8 @@ class FilteringTypePrinter(object): def add_one_type_printer(obj, match, name): printer = FilteringTypePrinter(match, 'std::' + name) gdb.types.register_type_printer(obj, printer) + printer = FilteringTypePrinter(match, 'std::' + vers_nsp + name) + gdb.types.register_type_printer(obj, printer) def register_type_printers(obj): global _use_type_printing @@ -1372,9 +1386,9 @@ def register_type_printers(obj): # Note that we can't have a printer for std::wstreampos, because # it shares the same underlying type as std::streampos. add_one_type_printer(obj, 'fpos', 'streampos') + add_one_type_printer(obj, 'basic_string', 'u16string') add_one_type_printer(obj, 'basic_string', 'u32string') - add_one_type_printer(obj, 'basic_string_view', 'u16string_view') add_one_type_printer(obj, 'basic_string_view', 'u32string_view') @@ -1392,47 +1406,54 @@ def register_type_printers(obj): add_one_type_printer(obj, 'discard_block_engine', 'ranlux48') add_one_type_printer(obj, 'shuffle_order_engine', 'knuth_b') + # Consider optional versioned namespace + opt_nsp = '(' + vers_nsp + ')?' + # Do not show defaulted template arguments in class templates add_one_template_type_printer(obj, 'unique_ptr', - 'unique_ptr<(.*), std::default_delete<\\1 ?> >', - 'unique_ptr<{1}>') + '{0}unique_ptr<(.*), std::{0}default_delete<\\2 ?> >'.format(opt_nsp), + 'unique_ptr<{2}>') + + add_one_template_type_printer(obj, 'basic_string', + '{0}basic_string<((un)?signed char), std::{0}char_traits<\\2 ?>, std::{0}allocator<\\2 ?> >'.format(opt_nsp), + 'basic_string<{2}>') add_one_template_type_printer(obj, 'deque', - 'deque<(.*), std::allocator<\\1 ?> >', - 'deque<{1}>') + '{0}deque<(.*), std::{0}allocator<\\2 ?> >'.format(opt_nsp), + 'deque<{2}>') add_one_template_type_printer(obj, 'forward_list', - 'forward_list<(.*), std::allocator<\\1 ?> >', - 'forward_list<{1}>') + '{0}forward_list<(.*), std::{0}allocator<\\2 ?> >'.format(opt_nsp), + 'forward_list<{2}>') add_one_template_type_printer(obj, 'list', - 'list<(.*), std::allocator<\\1 ?> >', - 'list<{1}>') + '{0}list<(.*), std::{0}allocator<\\2 ?> >'.format(opt_nsp), + 'list<{2}>') add_one_template_type_printer(obj, 'vector', - 'vector<(.*), std::allocator<\\1 ?> >', - 'vector<{1}>') + '{0}vector<(.*), std::{0}allocator<\\2 ?> >'.format(opt_nsp), + 'vector<{2}>') add_one_template_type_printer(obj, 'map', - 'map<(.*), (.*), std::less<\\1 ?>, std::allocator > >', - 'map<{1}, {2}>') + '{0}map<(.*), (.*), std::{0}less<\\2 ?>, std::{0}allocator > >'.format(opt_nsp), + 'map<{2}, {3}>') add_one_template_type_printer(obj, 'multimap', - 'multimap<(.*), (.*), std::less<\\1 ?>, std::allocator > >', - 'multimap<{1}, {2}>') + '{0}multimap<(.*), (.*), std::{0}less<\\2 ?>, std::{0}allocator > >'.format(opt_nsp), + 'multimap<{2}, {3}>') add_one_template_type_printer(obj, 'set', - 'set<(.*), std::less<\\1 ?>, std::allocator<\\1 ?> >', - 'set<{1}>') + '{0}set<(.*), std::{0}less<\\2 ?>, std::{0}allocator<\\2 ?> >'.format(opt_nsp), + 'set<{2}>') add_one_template_type_printer(obj, 'multiset', - 'multiset<(.*), std::less<\\1 ?>, std::allocator<\\1 ?> >', - 'multiset<{1}>') + '{0}multiset<(.*), std::{0}less<\\2 ?>, std::{0}allocator<\\2 ?> >'.format(opt_nsp), + 'multiset<{2}>') add_one_template_type_printer(obj, 'unordered_map', - 'unordered_map<(.*), (.*), std::hash<\\1 ?>, std::equal_to<\\1 ?>, std::allocator > >', - 'unordered_map<{1}, {2}>') + '{0}unordered_map<(.*), (.*), std::{0}hash<\\2 ?>, std::{0}equal_to<\\2 ?>, std::{0}allocator > >'.format(opt_nsp), + 'unordered_map<{2}, {3}>') add_one_template_type_printer(obj, 'unordered_multimap', - 'unordered_multimap<(.*), (.*), std::hash<\\1 ?>, std::equal_to<\\1 ?>, std::allocator > >', - 'unordered_multimap<{1}, {2}>') + '{0}unordered_multimap<(.*), (.*), std::{0}hash<\\2 ?>, std::{0}equal_to<\\2 ?>, std::{0}allocator > >'.format(opt_nsp), + 'unordered_multimap<{2}, {3}>') add_one_template_type_printer(obj, 'unordered_set', - 'unordered_set<(.*), std::hash<\\1 ?>, std::equal_to<\\1 ?>, std::allocator<\\1 ?> >', - 'unordered_set<{1}>') + '{0}unordered_set<(.*), std::{0}hash<\\2 ?>, std::{0}equal_to<\\2 ?>, std::{0}allocator<\\2 ?> >'.format(opt_nsp), + 'unordered_set<{2}>') add_one_template_type_printer(obj, 'unordered_multiset', - 'unordered_multiset<(.*), std::hash<\\1 ?>, std::equal_to<\\1 ?>, std::allocator<\\1 ?> >', - 'unordered_multiset<{1}>') + '{0}unordered_multiset<(.*), std::{0}hash<\\2 ?>, std::{0}equal_to<\\2 ?>, std::{0}allocator<\\2 ?> >'.format(opt_nsp), + 'unordered_multiset<{2}>') # strip the "fundamentals_v1" inline namespace from these types add_one_template_type_printer(obj, 'any', @@ -1466,7 +1487,7 @@ def build_libstdcxx_dictionary (): libstdcxx_printer = Printer("libstdc++-v6") # For _GLIBCXX_BEGIN_NAMESPACE_VERSION. - vers = '(__7::)?' + vers = '(' + vers_nsp + ')?' # For _GLIBCXX_BEGIN_NAMESPACE_CONTAINER. container = '(__cxx1998::' + vers + ')?' diff --git a/libstdc++-v3/python/libstdcxx/v6/xmethods.py b/libstdc++-v3/python/libstdcxx/v6/xmethods.py index def72b0..29eb339 100644 --- a/libstdc++-v3/python/libstdcxx/v6/xmethods.py +++ b/libstdc++-v3/python/libstdcxx/v6/xmethods.py @@ -148,7 +148,7 @@ class ArrayMethodsMatcher(gdb.xmethod.XMethodMatcher): self.methods = [self._method_dict[m] for m in self._method_dict] def match(self, class_type, method_name): - if not re.match('^std::array<.*>$', class_type.tag): + if not re.match('^std::(__\d+::)?array<.*>$', class_type.tag): return None method = self._method_dict.get(method_name) if method is None or not method.enabled: @@ -265,7 +265,7 @@ class DequeMethodsMatcher(gdb.xmethod.XMethodMatcher): self.methods = [self._method_dict[m] for m in self._method_dict] def match(self, class_type, method_name): - if not re.match('^std::deque<.*>$', class_type.tag): + if not re.match('^std::(__\d+::)?deque<.*>$', class_type.tag): return None method = self._method_dict.get(method_name) if method is None or not method.enabled: @@ -309,7 +309,7 @@ class ForwardListMethodsMatcher(gdb.xmethod.XMethodMatcher): self.methods = [self._method_dict[m] for m in self._method_dict] def match(self, class_type, method_name): - if not re.match('^std::forward_list<.*>$', class_type.tag): + if not re.match('^std::(__\d+::)?forward_list<.*>$', class_type.tag): return None method = self._method_dict.get(method_name) if method is None or not method.enabled: @@ -390,7 +390,7 @@ class ListMethodsMatcher(gdb.xmethod.XMethodMatcher): self.methods = [self._method_dict[m] for m in self._method_dict] def match(self, class_type, method_name): - if not re.match('^std::(__cxx11::)?list<.*>$', class_type.tag): + if not re.match('^std::(__\d+::)?(__cxx11::)?list<.*>$', class_type.tag): return None method = self._method_dict.get(method_name) if method is None or not method.enabled: @@ -505,7 +505,7 @@ class VectorMethodsMatcher(gdb.xmethod.XMethodMatcher): self.methods = [self._method_dict[m] for m in self._method_dict] def match(self, class_type, method_name): - if not re.match('^std::vector<.*>$', class_type.tag): + if not re.match('^std::(__\d+::)?vector<.*>$', class_type.tag): return None method = self._method_dict.get(method_name) if method is None or not method.enabled: @@ -554,7 +554,7 @@ class AssociativeContainerMethodsMatcher(gdb.xmethod.XMethodMatcher): self.methods = [self._method_dict[m] for m in self._method_dict] def match(self, class_type, method_name): - if not re.match('^std::%s<.*>$' % self._name, class_type.tag): + if not re.match('^std::(__\d+::)?%s<.*>$' % self._name, class_type.tag): return None method = self._method_dict.get(method_name) if method is None or not method.enabled: @@ -586,9 +586,9 @@ class UniquePtrGetWorker(gdb.xmethod.XMethodWorker): def __call__(self, obj): impl_type = obj.dereference().type.fields()[0].type.tag - if impl_type.startswith('std::__uniq_ptr_impl<'): # New implementation + if re.match('^std::(__\d+::)?__uniq_ptr_impl<.*>$', impl_type): # New implementation return obj['_M_t']['_M_t']['_M_head_impl'] - elif impl_type.startswith('std::tuple<'): + elif re.match('^std::(__\d+::)?tuple<.*>$', impl_type): return obj['_M_t']['_M_head_impl'] return None @@ -640,7 +640,7 @@ class UniquePtrMethodsMatcher(gdb.xmethod.XMethodMatcher): self.methods = [self._method_dict[m] for m in self._method_dict] def match(self, class_type, method_name): - if not re.match('^std::unique_ptr<.*>$', class_type.tag): + if not re.match('^std::(__\d+::)?unique_ptr<.*>$', class_type.tag): return None method = self._method_dict.get(method_name) if method is None or not method.enabled: diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/48362.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/48362.cc index 16ef07b..998b6d5 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/48362.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/48362.cc @@ -26,10 +26,10 @@ int main() { std::tuple<> t1; -// { dg-final { regexp-test t1 {empty std::(__7::)?tuple} } } +// { dg-final { regexp-test t1 {empty std::tuple} } } std::tuple> t2{ "Johnny", 5, {} }; -// { dg-final { regexp-test t2 {std::(__7::)?tuple containing = {\[1\] = "Johnny", \[2\] = 5, \[3\] = {> = empty std::(__7::)?tuple, }}} } } +// { dg-final { regexp-test t2 {std::tuple containing = {\[1\] = "Johnny", \[2\] = 5, \[3\] = {> = empty std::tuple, }}} } } std::cout << "\n"; return 0; // Mark SPOT diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc index 31ded8b..7a55bb7 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc @@ -166,11 +166,11 @@ holder knuth_b_holder; ustring *ustring_ptr; holder ustring_holder; -// { dg-final { whatis-test ustring_holder "holder, std::allocator > >" } } +// { dg-final { whatis-test ustring_holder "holder >" } } std::basic_string *sstring_ptr; holder< std::basic_string > sstring_holder; -// { dg-final { whatis-test sstring_holder "holder, std::allocator > >" } } +// { dg-final { whatis-test sstring_holder "holder >" } } std::vector>> *seq1_ptr; holder< std::vector>> > seq1_holder;