libstdc++: Fix gdb pretty printers when dealing with std::string
Since revision 33b43b0d8c
std::string and other
similar typedef are ambiguous from a gdb point of view because it matches both
std::basic_string<char> and std::__cxx11::basic_string<char> symbols. For those
typedef add a workaround to accept the substitution as long as the same regardless
of __cxx11 namespace.
Also avoid to register printers for types in std::__cxx11::__8:: namespace, there is
no such symbols.
libstdc++-v3/ChangeLog:
* python/libstdcxx/v6/printers.py (Printer.add_version): Do not add version
namespace for __cxx11 symbols.
(add_one_template_type_printer): Likewise.
(add_one_type_printer): Likewise.
(FilteringTypePrinter._recognizer.recognize): Add a workaround for std::string & al
ambiguous typedef matching both std:: and std::__cxx11:: symbols.
* testsuite/libstdc++-prettyprinters/cxx17.cc: Remove obsolete
\#define _GLIBCXX_USE_CXX11_ABI 0.
* testsuite/libstdc++-prettyprinters/simple.cc: Likewise. Adapt test to accept
std::__cxx11::list.
* testsuite/libstdc++-prettyprinters/simple11.cc: Likewise.
* testsuite/libstdc++-prettyprinters/whatis.cc: Likewise.
* testsuite/libstdc++-prettyprinters/80276.cc: Likewise and remove xfail for c++20
and debug mode.
* testsuite/libstdc++-prettyprinters/libfundts.cc: Likewise.
This commit is contained in:
parent
4223101506
commit
4347fea9c2
7 changed files with 23 additions and 27 deletions
|
@ -1857,7 +1857,7 @@ class Printer(object):
|
|||
# Add a name using _GLIBCXX_BEGIN_NAMESPACE_VERSION.
|
||||
def add_version(self, base, name, function):
|
||||
self.add(base + name, function)
|
||||
if _versioned_namespace:
|
||||
if _versioned_namespace and not '__cxx11' in base:
|
||||
vbase = re.sub('^(std|__gnu_cxx)::', r'\g<0>%s' % _versioned_namespace, base)
|
||||
self.add(vbase + name, function)
|
||||
|
||||
|
@ -2026,7 +2026,7 @@ def add_one_template_type_printer(obj, name, defargs):
|
|||
printer = TemplateTypePrinter('std::__debug::'+name, defargs)
|
||||
gdb.types.register_type_printer(obj, printer)
|
||||
|
||||
if _versioned_namespace:
|
||||
if _versioned_namespace and not '__cxx11' in name:
|
||||
# Add second type printer for same type in versioned namespace:
|
||||
ns = 'std::' + _versioned_namespace
|
||||
# PR 86112 Cannot use dict comprehension here:
|
||||
|
@ -2084,6 +2084,21 @@ class FilteringTypePrinter(object):
|
|||
pass
|
||||
if self.type_obj == type_obj:
|
||||
return strip_inline_namespaces(self.name)
|
||||
|
||||
if self.type_obj is None:
|
||||
return None
|
||||
|
||||
# Workaround ambiguous typedefs matching both std:: and std::__cxx11:: symbols.
|
||||
ambiguous = False
|
||||
for ch in ('', 'w', 'u8', 'u16', 'u32'):
|
||||
if self.name == 'std::' + ch + 'string':
|
||||
ambiguous = True
|
||||
break
|
||||
|
||||
if ambiguous:
|
||||
if self.type_obj.tag.replace('__cxx11::', '') == type_obj.tag.replace('__cxx11::', ''):
|
||||
return strip_inline_namespaces(self.name)
|
||||
|
||||
return None
|
||||
|
||||
def instantiate(self):
|
||||
|
@ -2093,7 +2108,7 @@ class FilteringTypePrinter(object):
|
|||
def add_one_type_printer(obj, match, name):
|
||||
printer = FilteringTypePrinter('std::' + match, 'std::' + name)
|
||||
gdb.types.register_type_printer(obj, printer)
|
||||
if _versioned_namespace:
|
||||
if _versioned_namespace and not '__cxx11' in match:
|
||||
ns = 'std::' + _versioned_namespace
|
||||
printer = FilteringTypePrinter(ns + match, ns + name)
|
||||
gdb.types.register_type_printer(obj, printer)
|
||||
|
|
|
@ -18,9 +18,6 @@
|
|||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// Type printers only recognize the old std::string for now.
|
||||
#define _GLIBCXX_USE_CXX11_ABI 0
|
||||
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <memory>
|
||||
|
@ -46,7 +43,7 @@ main()
|
|||
// { dg-final { whatis-regexp-test p1 "std::unique_ptr<std::(__debug::)?vector<std::unique_ptr<std::(__debug::)?vector<int>\\*>>>" } }
|
||||
// { dg-final { whatis-regexp-test p2 "std::unique_ptr<std::(__debug::)?vector<std::unique_ptr<std::(__debug::)?set<int>\\*>>\\\[\\\]>" } }
|
||||
// { dg-final { whatis-regexp-test p3 "std::unique_ptr<std::(__debug::)?set<std::unique_ptr<std::(__debug::)?vector<int>\\*>>\\\[10\\\]>" } }
|
||||
// { dg-final { whatis-regexp-test p4 "std::unique_ptr<std::(__debug::)?vector<std::unique_ptr<std::(__debug::)?list<std::string>\\\[\\\]>>\\\[99\\\]>" { xfail { c++20 || debug_mode } } } }
|
||||
// { dg-final { whatis-regexp-test p4 "std::unique_ptr<std::(__debug::)?vector<std::unique_ptr<std::(__debug::)?list<std::string>\\\[\\\]>>\\\[99\\\]>" } }
|
||||
|
||||
placeholder(&p1); // Mark SPOT
|
||||
placeholder(&p2);
|
||||
|
|
|
@ -18,9 +18,6 @@
|
|||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// Type printers only recognize the old std::string for now.
|
||||
#define _GLIBCXX_USE_CXX11_ABI 0
|
||||
|
||||
#include <filesystem>
|
||||
#include <any>
|
||||
#include <optional>
|
||||
|
|
|
@ -18,9 +18,6 @@
|
|||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// Type printers only recognize the old std::string for now.
|
||||
#define _GLIBCXX_USE_CXX11_ABI 0
|
||||
|
||||
#include <experimental/any>
|
||||
#include <experimental/optional>
|
||||
#include <experimental/string_view>
|
||||
|
@ -50,7 +47,7 @@ main()
|
|||
om = std::map<int, double>{ {1, 2.}, {3, 4.}, {5, 6.} };
|
||||
// { dg-final { regexp-test om {std::experimental::optional<std::(__debug::)?map<int, double>> containing std::(__debug::)?map with 3 elements = {\[1\] = 2, \[3\] = 4, \[5\] = 6}} } }
|
||||
optional<std::string> os{ "stringy" };
|
||||
// { dg-final { note-test os {std::experimental::optional<std::string> = {[contained value] = "stringy"}} { xfail { c++20 || debug_mode } } } }
|
||||
// { dg-final { note-test os {std::experimental::optional<std::string> = {[contained value] = "stringy"}} } }
|
||||
|
||||
any a;
|
||||
// { dg-final { note-test a {std::experimental::any [no contained value]} } }
|
||||
|
@ -61,7 +58,7 @@ main()
|
|||
any ap = (void*)nullptr;
|
||||
// { dg-final { note-test ap {std::experimental::any containing void * = {[contained value] = 0x0}} } }
|
||||
any as = *os;
|
||||
// { dg-final { note-test as {std::experimental::any containing std::string = {[contained value] = "stringy"}} { xfail { c++20 || debug_mode } } } }
|
||||
// { dg-final { note-test as {std::experimental::any containing std::string = {[contained value] = "stringy"}} } }
|
||||
any as2("stringiest");
|
||||
// { dg-final { regexp-test as2 {std::experimental::any containing const char \* = {\[contained value\] = 0x[[:xdigit:]]+ "stringiest"}} } }
|
||||
any am = *om;
|
||||
|
|
|
@ -20,9 +20,6 @@
|
|||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// Type printers only recognize the old std::string for now.
|
||||
#define _GLIBCXX_USE_CXX11_ABI 0
|
||||
|
||||
#include <string>
|
||||
#include <deque>
|
||||
#include <bitset>
|
||||
|
@ -65,7 +62,7 @@ main()
|
|||
std::list<std::string> lst;
|
||||
lst.push_back("one");
|
||||
lst.push_back("two");
|
||||
// { dg-final { regexp-test lst {std::(__debug::)?list = {\[0\] = "one", \[1\] = "two"}} } }
|
||||
// { dg-final { regexp-test lst {std::(__cxx11::)?(__debug::)?list = {\[0\] = "one", \[1\] = "two"}} } }
|
||||
|
||||
std::list<int>::iterator lstiter0;
|
||||
// { dg-final { note-test lstiter0 {non-dereferenceable iterator for std::list} } }
|
||||
|
|
|
@ -20,9 +20,6 @@
|
|||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// Type printers only recognize the old std::string for now.
|
||||
#define _GLIBCXX_USE_CXX11_ABI 0
|
||||
|
||||
#include <string>
|
||||
#include <deque>
|
||||
#include <bitset>
|
||||
|
@ -61,7 +58,7 @@ main()
|
|||
std::list<std::string> lst;
|
||||
lst.push_back("one");
|
||||
lst.push_back("two");
|
||||
// { dg-final { regexp-test lst {std::(__debug::)?list = {\[0\] = "one", \[1\] = "two"}} } }
|
||||
// { dg-final { regexp-test lst {std::(__cxx11::)?(__debug::)?list = {\[0\] = "one", \[1\] = "two"}} } }
|
||||
|
||||
std::list<std::string>::iterator lstiter = lst.begin();
|
||||
tem = *lstiter;
|
||||
|
|
|
@ -18,10 +18,6 @@
|
|||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// GDB can't find global variables using the abi_tag attribute.
|
||||
// https://sourceware.org/bugzilla/show_bug.cgi?id=19436
|
||||
#define _GLIBCXX_USE_CXX11_ABI 0
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <regex>
|
||||
|
|
Loading…
Add table
Reference in a new issue