* [PATCH] libstdc++: Add pretty printer for std::span
@ 2022-04-04 10:52 Philipp Fent
2022-04-04 11:39 ` Jonathan Wakely
2022-04-14 15:49 ` Jonathan Wakely
0 siblings, 2 replies; 7+ messages in thread
From: Philipp Fent @ 2022-04-04 10:52 UTC (permalink / raw)
To: libstdc++, gcc-patches; +Cc: Philipp Fent
This improves the debug output for C++20 spans.
Before:
{static extent = 18446744073709551615, _M_ptr = 0x7fffffffb9a8,
_M_extent = {_M_extent_value = 2}}
Now with StdSpanPrinter:
std::span of length 2 = {1, 2}
---
libstdc++-v3/python/libstdcxx/v6/printers.py | 38 +++++++++++++++++++
.../libstdc++-prettyprinters/cxx20.cc | 11 ++++++
2 files changed, 49 insertions(+)
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index f7a7f9961..6d8b765f2 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -1654,6 +1654,43 @@ class StdRegexStatePrinter:
s = "{}, {}={}".format(s, v, self.val['_M_' + v])
return "{%s}" % (s)
+class StdSpanPrinter:
+ "Print a std::span"
+
+ class _iterator(Iterator):
+ def __init__(self, begin, size):
+ self.count = 0
+ self.begin = begin
+ self.size = size
+
+ def __iter__ (self):
+ return self
+
+ def __next__ (self):
+ if self.count == self.size:
+ raise StopIteration
+
+ count = self.count
+ self.count = self.count + 1
+ return '[%d]' % count, (self.begin + count).dereference()
+
+ def __init__(self, typename, val):
+ self.typename = typename
+ self.val = val
+ if val.type.template_argument(1) == gdb.parse_and_eval('static_cast<std::size_t>(-1)'):
+ self.size = val['_M_extent']['_M_extent_value']
+ else:
+ self.size = val.type.template_argument(1)
+
+ def to_string(self):
+ return '%s of length %d' % (self.typename, self.size)
+
+ def children(self):
+ return self._iterator(self.val['_M_ptr'], self.size)
+
+ def display_hint(self):
+ return 'array'
+
# A "regular expression" printer which conforms to the
# "SubPrettyPrinter" protocol from gdb.printing.
class RxPrinter(object):
@@ -2170,6 +2207,7 @@ def build_libstdcxx_dictionary ():
libstdcxx_printer.add_version('std::', 'partial_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'weak_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'strong_ordering', StdCmpCatPrinter)
+ libstdcxx_printer.add_version('std::', 'span', StdSpanPrinter)
# Extensions.
libstdcxx_printer.add_version('__gnu_cxx::', 'slist', StdSlistPrinter)
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
index b0de25c27..76023df93 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
@@ -18,8 +18,10 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
+#include <array>
#include <compare>
#include <iostream>
+#include <span>
struct X
{
@@ -54,6 +56,15 @@ main()
auto c10 = 0.0 <=> __builtin_nan("");
// { dg-final { note-test c10 "std::partial_ordering::unordered" } }
+ auto il = {1, 2};
+ auto s1 = std::span(il);
+ static_assert(s1.extent == std::size_t(-1));
+// { dg-final { note-test s1 {std::span of length 2 = {1, 2}} } }
+ auto a = std::array{3, 4};
+ auto s2 = std::span(a);
+ static_assert(s2.extent == std::size_t(2));
+// { dg-final { note-test s2 {std::span of length 2 = {3, 4}} } }
+
std::cout << "\n";
return 0; // Mark SPOT
}
--
2.35.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] libstdc++: Add pretty printer for std::span
2022-04-04 10:52 [PATCH] libstdc++: Add pretty printer for std::span Philipp Fent
@ 2022-04-04 11:39 ` Jonathan Wakely
2022-04-19 9:34 ` Philipp Fent
2022-04-14 15:49 ` Jonathan Wakely
1 sibling, 1 reply; 7+ messages in thread
From: Jonathan Wakely @ 2022-04-04 11:39 UTC (permalink / raw)
To: Philipp Fent; +Cc: libstdc++, gcc-patches
On Mon, 4 Apr 2022 at 11:54, Philipp Fent via Libstdc++
<libstdc++@gcc.gnu.org> wrote:
>
> This improves the debug output for C++20 spans.
> Before:
> {static extent = 18446744073709551615, _M_ptr = 0x7fffffffb9a8,
> _M_extent = {_M_extent_value = 2}}
> Now with StdSpanPrinter:
> std::span of length 2 = {1, 2}
Nice, thanks. I'll get this committed in time for GCC 12 (and backport
it to release branches too).
> ---
> libstdc++-v3/python/libstdcxx/v6/printers.py | 38 +++++++++++++++++++
> .../libstdc++-prettyprinters/cxx20.cc | 11 ++++++
> 2 files changed, 49 insertions(+)
>
> diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
> index f7a7f9961..6d8b765f2 100644
> --- a/libstdc++-v3/python/libstdcxx/v6/printers.py
> +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
> @@ -1654,6 +1654,43 @@ class StdRegexStatePrinter:
> s = "{}, {}={}".format(s, v, self.val['_M_' + v])
> return "{%s}" % (s)
>
> +class StdSpanPrinter:
> + "Print a std::span"
> +
> + class _iterator(Iterator):
> + def __init__(self, begin, size):
> + self.count = 0
> + self.begin = begin
> + self.size = size
> +
> + def __iter__ (self):
> + return self
> +
> + def __next__ (self):
> + if self.count == self.size:
> + raise StopIteration
> +
> + count = self.count
> + self.count = self.count + 1
> + return '[%d]' % count, (self.begin + count).dereference()
> +
> + def __init__(self, typename, val):
> + self.typename = typename
> + self.val = val
> + if val.type.template_argument(1) == gdb.parse_and_eval('static_cast<std::size_t>(-1)'):
> + self.size = val['_M_extent']['_M_extent_value']
> + else:
> + self.size = val.type.template_argument(1)
> +
> + def to_string(self):
> + return '%s of length %d' % (self.typename, self.size)
> +
> + def children(self):
> + return self._iterator(self.val['_M_ptr'], self.size)
> +
> + def display_hint(self):
> + return 'array'
> +
> # A "regular expression" printer which conforms to the
> # "SubPrettyPrinter" protocol from gdb.printing.
> class RxPrinter(object):
> @@ -2170,6 +2207,7 @@ def build_libstdcxx_dictionary ():
> libstdcxx_printer.add_version('std::', 'partial_ordering', StdCmpCatPrinter)
> libstdcxx_printer.add_version('std::', 'weak_ordering', StdCmpCatPrinter)
> libstdcxx_printer.add_version('std::', 'strong_ordering', StdCmpCatPrinter)
> + libstdcxx_printer.add_version('std::', 'span', StdSpanPrinter)
>
> # Extensions.
> libstdcxx_printer.add_version('__gnu_cxx::', 'slist', StdSlistPrinter)
> diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
> index b0de25c27..76023df93 100644
> --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
> +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
> @@ -18,8 +18,10 @@
> // with this library; see the file COPYING3. If not see
> // <http://www.gnu.org/licenses/>.
>
> +#include <array>
> #include <compare>
> #include <iostream>
> +#include <span>
>
> struct X
> {
> @@ -54,6 +56,15 @@ main()
> auto c10 = 0.0 <=> __builtin_nan("");
> // { dg-final { note-test c10 "std::partial_ordering::unordered" } }
>
> + auto il = {1, 2};
> + auto s1 = std::span(il);
> + static_assert(s1.extent == std::size_t(-1));
> +// { dg-final { note-test s1 {std::span of length 2 = {1, 2}} } }
> + auto a = std::array{3, 4};
> + auto s2 = std::span(a);
> + static_assert(s2.extent == std::size_t(2));
> +// { dg-final { note-test s2 {std::span of length 2 = {3, 4}} } }
> +
> std::cout << "\n";
> return 0; // Mark SPOT
> }
> --
> 2.35.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] libstdc++: Add pretty printer for std::span
2022-04-04 10:52 [PATCH] libstdc++: Add pretty printer for std::span Philipp Fent
2022-04-04 11:39 ` Jonathan Wakely
@ 2022-04-14 15:49 ` Jonathan Wakely
1 sibling, 0 replies; 7+ messages in thread
From: Jonathan Wakely @ 2022-04-14 15:49 UTC (permalink / raw)
To: Philipp Fent; +Cc: libstdc++, gcc Patches
On Mon, 4 Apr 2022 at 11:54, Philipp Fent via Libstdc++
<libstdc++@gcc.gnu.org> wrote:
>
> This improves the debug output for C++20 spans.
> Before:
> {static extent = 18446744073709551615, _M_ptr = 0x7fffffffb9a8,
> _M_extent = {_M_extent_value = 2}}
> Now with StdSpanPrinter:
> std::span of length 2 = {1, 2}
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] libstdc++: Add pretty printer for std::span
2022-04-04 11:39 ` Jonathan Wakely
@ 2022-04-19 9:34 ` Philipp Fent
2022-04-19 10:28 ` Jonathan Wakely
0 siblings, 1 reply; 7+ messages in thread
From: Philipp Fent @ 2022-04-19 9:34 UTC (permalink / raw)
To: Jonathan Wakely; +Cc: libstdc++, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 389 bytes --]
On 04.04.22 13:39, Jonathan Wakely wrote:
> Nice, thanks. I'll get this committed in time for GCC 12 (and backport
> it to release branches too).
I've attached a rebased patch for trunk and tested it on x86_64-linux.
I also backported it for the release branches, gcc-11 tests also pass,
on gcc-10 the prettyprinters testsuite reports "unsupported", and gcc-9
didn't have std::span yet.
[-- Attachment #2: gcc-10-libstdc-Add-pretty-printer-for-std-span.patch --]
[-- Type: text/x-patch, Size: 3705 bytes --]
From 0f4ae81980ea1181aca4deca0508628f9f30e72b Mon Sep 17 00:00:00 2001
From: Philipp Fent <fent@in.tum.de>
Date: Mon, 4 Apr 2022 12:52:57 +0200
Subject: [PATCH] libstdc++: Add pretty printer for std::span
This improves the debug output for C++20 spans.
Before:
{static extent = 18446744073709551615, _M_ptr = 0x7fffffffb9a8,
_M_extent = {_M_extent_value = 2}}
Now with StdSpanPrinter:
std::span of length 2 = {1, 2}
---
libstdc++-v3/python/libstdcxx/v6/printers.py | 38 +++++++++++++++++++
.../libstdc++-prettyprinters/cxx20.cc | 11 ++++++
2 files changed, 49 insertions(+)
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index 74c629a710c..790d83fecff 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -1535,6 +1535,43 @@ class StdErrorCodePrinter:
pass
return '%s = {"%s": %s}' % (self.typename, category, strval)
+class StdSpanPrinter:
+ "Print a std::span"
+
+ class _iterator(Iterator):
+ def __init__(self, begin, size):
+ self.count = 0
+ self.begin = begin
+ self.size = size
+
+ def __iter__ (self):
+ return self
+
+ def __next__ (self):
+ if self.count == self.size:
+ raise StopIteration
+
+ count = self.count
+ self.count = self.count + 1
+ return '[%d]' % count, (self.begin + count).dereference()
+
+ def __init__(self, typename, val):
+ self.typename = typename
+ self.val = val
+ if val.type.template_argument(1) == gdb.parse_and_eval('static_cast<std::size_t>(-1)'):
+ self.size = val['_M_extent']['_M_extent_value']
+ else:
+ self.size = val.type.template_argument(1)
+
+ def to_string(self):
+ return '%s of length %d' % (self.typename, self.size)
+
+ def children(self):
+ return self._iterator(self.val['_M_ptr'], self.size)
+
+ def display_hint(self):
+ return 'array'
+
# A "regular expression" printer which conforms to the
# "SubPrettyPrinter" protocol from gdb.printing.
class RxPrinter(object):
@@ -2043,6 +2080,7 @@ def build_libstdcxx_dictionary ():
libstdcxx_printer.add_version('std::', 'partial_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'weak_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'strong_ordering', StdCmpCatPrinter)
+ libstdcxx_printer.add_version('std::', 'span', StdSpanPrinter)
# Extensions.
libstdcxx_printer.add_version('__gnu_cxx::', 'slist', StdSlistPrinter)
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
index 9a868c4baf7..0887f1868f2 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
@@ -18,8 +18,10 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
+#include <array>
#include <compare>
#include <iostream>
+#include <span>
struct X
{
@@ -54,6 +56,15 @@ main()
auto c10 = 0.0 <=> __builtin_nan("");
// { dg-final { note-test c10 "std::partial_ordering::unordered" } }
+ auto il = {1, 2};
+ auto s1 = std::span(il);
+ static_assert(s1.extent == std::size_t(-1));
+// { dg-final { note-test s1 {std::span of length 2 = {1, 2}} } }
+ auto a = std::array{3, 4};
+ auto s2 = std::span(a);
+ static_assert(s2.extent == std::size_t(2));
+// { dg-final { note-test s2 {std::span of length 2 = {3, 4}} } }
+
std::cout << "\n";
return 0; // Mark SPOT
}
--
2.35.3
[-- Attachment #3: trunk-libstdc-Add-pretty-printer-for-std-span.patch --]
[-- Type: text/x-patch, Size: 3706 bytes --]
From c4331b7532dc2825429e82e46fda1a04dd943bd4 Mon Sep 17 00:00:00 2001
From: Philipp Fent <fent@in.tum.de>
Date: Mon, 4 Apr 2022 12:52:57 +0200
Subject: [PATCH] libstdc++: Add pretty printer for std::span
This improves the debug output for C++20 spans.
Before:
{static extent = 18446744073709551615, _M_ptr = 0x7fffffffb9a8,
_M_extent = {_M_extent_value = 2}}
Now with StdSpanPrinter:
std::span of length 2 = {1, 2}
---
libstdc++-v3/python/libstdcxx/v6/printers.py | 38 +++++++++++++++++++
.../libstdc++-prettyprinters/cxx20.cc | 11 ++++++
2 files changed, 49 insertions(+)
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index f7a7f9961a7..6d8b765f2da 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -1654,6 +1654,43 @@ class StdRegexStatePrinter:
s = "{}, {}={}".format(s, v, self.val['_M_' + v])
return "{%s}" % (s)
+class StdSpanPrinter:
+ "Print a std::span"
+
+ class _iterator(Iterator):
+ def __init__(self, begin, size):
+ self.count = 0
+ self.begin = begin
+ self.size = size
+
+ def __iter__ (self):
+ return self
+
+ def __next__ (self):
+ if self.count == self.size:
+ raise StopIteration
+
+ count = self.count
+ self.count = self.count + 1
+ return '[%d]' % count, (self.begin + count).dereference()
+
+ def __init__(self, typename, val):
+ self.typename = typename
+ self.val = val
+ if val.type.template_argument(1) == gdb.parse_and_eval('static_cast<std::size_t>(-1)'):
+ self.size = val['_M_extent']['_M_extent_value']
+ else:
+ self.size = val.type.template_argument(1)
+
+ def to_string(self):
+ return '%s of length %d' % (self.typename, self.size)
+
+ def children(self):
+ return self._iterator(self.val['_M_ptr'], self.size)
+
+ def display_hint(self):
+ return 'array'
+
# A "regular expression" printer which conforms to the
# "SubPrettyPrinter" protocol from gdb.printing.
class RxPrinter(object):
@@ -2170,6 +2207,7 @@ def build_libstdcxx_dictionary ():
libstdcxx_printer.add_version('std::', 'partial_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'weak_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'strong_ordering', StdCmpCatPrinter)
+ libstdcxx_printer.add_version('std::', 'span', StdSpanPrinter)
# Extensions.
libstdcxx_printer.add_version('__gnu_cxx::', 'slist', StdSlistPrinter)
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
index b0de25c27ec..76023df93fa 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
@@ -18,8 +18,10 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
+#include <array>
#include <compare>
#include <iostream>
+#include <span>
struct X
{
@@ -54,6 +56,15 @@ main()
auto c10 = 0.0 <=> __builtin_nan("");
// { dg-final { note-test c10 "std::partial_ordering::unordered" } }
+ auto il = {1, 2};
+ auto s1 = std::span(il);
+ static_assert(s1.extent == std::size_t(-1));
+// { dg-final { note-test s1 {std::span of length 2 = {1, 2}} } }
+ auto a = std::array{3, 4};
+ auto s2 = std::span(a);
+ static_assert(s2.extent == std::size_t(2));
+// { dg-final { note-test s2 {std::span of length 2 = {3, 4}} } }
+
std::cout << "\n";
return 0; // Mark SPOT
}
--
2.35.3
[-- Attachment #4: gcc-11-libstdc-Add-pretty-printer-for-std-span.patch --]
[-- Type: text/x-patch, Size: 3680 bytes --]
From 46f06331e14922a8d704b38a47e8b82e2a2dc8c5 Mon Sep 17 00:00:00 2001
From: Philipp Fent <fent@in.tum.de>
Date: Mon, 4 Apr 2022 12:52:57 +0200
Subject: [PATCH] libstdc++: Add pretty printer for std::span
This improves the debug output for C++20 spans.
Before:
{static extent = 18446744073709551615, _M_ptr = 0x7fffffffb9a8,
_M_extent = {_M_extent_value = 2}}
Now with StdSpanPrinter:
std::span of length 2 = {1, 2}
---
libstdc++-v3/python/libstdcxx/v6/printers.py | 37 +++++++++++++++++++
.../libstdc++-prettyprinters/cxx20.cc | 11 ++++++
2 files changed, 48 insertions(+)
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index b5b523c4b5a..4ae5d8d3029 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -1625,6 +1625,42 @@ class StdErrorCodePrinter:
name = alt_name
return '%s = {%s: %s}' % (self.typename, name, strval)
+class StdSpanPrinter:
+ "Print a std::span"
+
+ class _iterator(Iterator):
+ def __init__(self, begin, size):
+ self.count = 0
+ self.begin = begin
+ self.size = size
+
+ def __iter__ (self):
+ return self
+
+ def __next__ (self):
+ if self.count == self.size:
+ raise StopIteration
+
+ count = self.count
+ self.count = self.count + 1
+ return '[%d]' % count, (self.begin + count).dereference()
+
+ def __init__(self, typename, val):
+ self.typename = typename
+ self.val = val
+ if val.type.template_argument(1) == gdb.parse_and_eval('static_cast<std::size_t>(-1)'):
+ self.size = val['_M_extent']['_M_extent_value']
+ else:
+ self.size = val.type.template_argument(1)
+
+ def to_string(self):
+ return '%s of length %d' % (self.typename, self.size)
+
+ def children(self):
+ return self._iterator(self.val['_M_ptr'], self.size)
+
+ def display_hint(self):
+ return 'array'
# A "regular expression" printer which conforms to the
# "SubPrettyPrinter" protocol from gdb.printing.
@@ -2138,6 +2174,7 @@ def build_libstdcxx_dictionary ():
libstdcxx_printer.add_version('std::', 'partial_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'weak_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'strong_ordering', StdCmpCatPrinter)
+ libstdcxx_printer.add_version('std::', 'span', StdSpanPrinter)
# Extensions.
libstdcxx_printer.add_version('__gnu_cxx::', 'slist', StdSlistPrinter)
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
index d9b47114d57..c0eded2302a 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
@@ -18,8 +18,10 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
+#include <array>
#include <compare>
#include <iostream>
+#include <span>
struct X
{
@@ -54,6 +56,15 @@ main()
auto c10 = 0.0 <=> __builtin_nan("");
// { dg-final { note-test c10 "std::partial_ordering::unordered" } }
+ auto il = {1, 2};
+ auto s1 = std::span(il);
+ static_assert(s1.extent == std::size_t(-1));
+// { dg-final { note-test s1 {std::span of length 2 = {1, 2}} } }
+ auto a = std::array{3, 4};
+ auto s2 = std::span(a);
+ static_assert(s2.extent == std::size_t(2));
+// { dg-final { note-test s2 {std::span of length 2 = {3, 4}} } }
+
std::cout << "\n";
return 0; // Mark SPOT
}
--
2.35.3
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] libstdc++: Add pretty printer for std::span
2022-04-19 9:34 ` Philipp Fent
@ 2022-04-19 10:28 ` Jonathan Wakely
2022-04-19 11:32 ` Philipp Fent
0 siblings, 1 reply; 7+ messages in thread
From: Jonathan Wakely @ 2022-04-19 10:28 UTC (permalink / raw)
To: Philipp Fent; +Cc: libstdc++, gcc-patches
On Tue, 19 Apr 2022 at 10:34, Philipp Fent wrote:
>
> On 04.04.22 13:39, Jonathan Wakely wrote:
> > Nice, thanks. I'll get this committed in time for GCC 12 (and backport
> > it to release branches too).
>
> I've attached a rebased patch for trunk and tested it on x86_64-linux.
> I also backported it for the release branches, gcc-11 tests also pass,
> on gcc-10 the prettyprinters testsuite reports "unsupported", and gcc-9
> didn't have std::span yet.
Thanks, but we still need the DCO sign-off as I mailed about last week.
There's no need for you to provide the backported patches, I will take
care of that.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] libstdc++: Add pretty printer for std::span
2022-04-19 10:28 ` Jonathan Wakely
@ 2022-04-19 11:32 ` Philipp Fent
2022-04-19 11:36 ` Jonathan Wakely
0 siblings, 1 reply; 7+ messages in thread
From: Philipp Fent @ 2022-04-19 11:32 UTC (permalink / raw)
To: Jonathan Wakely; +Cc: libstdc++, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 273 bytes --]
On 19.04.22 12:28, Jonathan Wakely wrote:
> Thanks, but we still need the DCO sign-off as I mailed about last week.
Thanks for the clarification, your last mail didn't appear to have
content, so I might have missed that part. I've now added my DCO sign-off.
Best
Philipp
[-- Attachment #2: libstdc-Add-pretty-printer-for-std-span.patch --]
[-- Type: text/x-patch, Size: 3752 bytes --]
From 64b6779c2694f57981e15b9c1dfa59b192e99a16 Mon Sep 17 00:00:00 2001
From: Philipp Fent <fent@in.tum.de>
Date: Mon, 4 Apr 2022 12:52:57 +0200
Subject: [PATCH] libstdc++: Add pretty printer for std::span
This improves the debug output for C++20 spans.
Before:
{static extent = 18446744073709551615, _M_ptr = 0x7fffffffb9a8,
_M_extent = {_M_extent_value = 2}}
Now with StdSpanPrinter:
std::span of length 2 = {1, 2}
Signed-off-by: Philipp Fent <fent@in.tum.de>
---
libstdc++-v3/python/libstdcxx/v6/printers.py | 38 +++++++++++++++++++
.../libstdc++-prettyprinters/cxx20.cc | 11 ++++++
2 files changed, 49 insertions(+)
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index f7a7f9961a7..6d8b765f2da 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -1654,6 +1654,43 @@ class StdRegexStatePrinter:
s = "{}, {}={}".format(s, v, self.val['_M_' + v])
return "{%s}" % (s)
+class StdSpanPrinter:
+ "Print a std::span"
+
+ class _iterator(Iterator):
+ def __init__(self, begin, size):
+ self.count = 0
+ self.begin = begin
+ self.size = size
+
+ def __iter__ (self):
+ return self
+
+ def __next__ (self):
+ if self.count == self.size:
+ raise StopIteration
+
+ count = self.count
+ self.count = self.count + 1
+ return '[%d]' % count, (self.begin + count).dereference()
+
+ def __init__(self, typename, val):
+ self.typename = typename
+ self.val = val
+ if val.type.template_argument(1) == gdb.parse_and_eval('static_cast<std::size_t>(-1)'):
+ self.size = val['_M_extent']['_M_extent_value']
+ else:
+ self.size = val.type.template_argument(1)
+
+ def to_string(self):
+ return '%s of length %d' % (self.typename, self.size)
+
+ def children(self):
+ return self._iterator(self.val['_M_ptr'], self.size)
+
+ def display_hint(self):
+ return 'array'
+
# A "regular expression" printer which conforms to the
# "SubPrettyPrinter" protocol from gdb.printing.
class RxPrinter(object):
@@ -2170,6 +2207,7 @@ def build_libstdcxx_dictionary ():
libstdcxx_printer.add_version('std::', 'partial_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'weak_ordering', StdCmpCatPrinter)
libstdcxx_printer.add_version('std::', 'strong_ordering', StdCmpCatPrinter)
+ libstdcxx_printer.add_version('std::', 'span', StdSpanPrinter)
# Extensions.
libstdcxx_printer.add_version('__gnu_cxx::', 'slist', StdSlistPrinter)
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
index b0de25c27ec..76023df93fa 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx20.cc
@@ -18,8 +18,10 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
+#include <array>
#include <compare>
#include <iostream>
+#include <span>
struct X
{
@@ -54,6 +56,15 @@ main()
auto c10 = 0.0 <=> __builtin_nan("");
// { dg-final { note-test c10 "std::partial_ordering::unordered" } }
+ auto il = {1, 2};
+ auto s1 = std::span(il);
+ static_assert(s1.extent == std::size_t(-1));
+// { dg-final { note-test s1 {std::span of length 2 = {1, 2}} } }
+ auto a = std::array{3, 4};
+ auto s2 = std::span(a);
+ static_assert(s2.extent == std::size_t(2));
+// { dg-final { note-test s2 {std::span of length 2 = {3, 4}} } }
+
std::cout << "\n";
return 0; // Mark SPOT
}
--
2.35.3
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] libstdc++: Add pretty printer for std::span
2022-04-19 11:32 ` Philipp Fent
@ 2022-04-19 11:36 ` Jonathan Wakely
0 siblings, 0 replies; 7+ messages in thread
From: Jonathan Wakely @ 2022-04-19 11:36 UTC (permalink / raw)
To: Philipp Fent; +Cc: Jonathan Wakely, libstdc++, gcc-patches
On Tue, 19 Apr 2022 at 12:33, Philipp Fent via Libstdc++
<libstdc++@gcc.gnu.org> wrote:
>
> On 19.04.22 12:28, Jonathan Wakely wrote:
> > Thanks, but we still need the DCO sign-off as I mailed about last week.
>
> Thanks for the clarification, your last mail didn't appear to have
> content, so I might have missed that part. I've now added my DCO sign-off.
Huh, I see no content in my sent copy either. Weird. I distinctly
remember pasting the https://gcc.gnu.org/dco.html link into the email,
but gmail must have had other ideas. Sorry about that!
Thanks for the sign-off, I'll get this committed today.
The GCC 11 backport will have to wait a few days because the branch is
currently frozen for the 11.3 release.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-04-19 11:36 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-04 10:52 [PATCH] libstdc++: Add pretty printer for std::span Philipp Fent
2022-04-04 11:39 ` Jonathan Wakely
2022-04-19 9:34 ` Philipp Fent
2022-04-19 10:28 ` Jonathan Wakely
2022-04-19 11:32 ` Philipp Fent
2022-04-19 11:36 ` Jonathan Wakely
2022-04-14 15:49 ` Jonathan Wakely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).