This pretty printer was updated for GCC 16 to match a change to
std::atomic<shared_ptr<T>>.  But the gdb.Type.is_scalar property was
added in GDB 12.1, so we get an error for older GDB versions.

This adds a workaround for older GDB versions. The gdb.Type.tag property
is None for scalar types, and should always be defined for the
std::atomic class template. Another option would be to use the
is_specialization_of function defined in printers.py, but just checking
for the tag is simpler.

libstdc++-v3/ChangeLog:

        * python/libstdcxx/v6/printers.py (SharedPointerPrinter): Only
        use gdb.Type.is_scalar if supported.
---

Tested x86_64-linux, using both GDB 8 and GDB 16, and also tested a
binary with the GCC 15 std::atomic<shared_ptr> can be printed by the GCC
16 printers.py.

 libstdc++-v3/python/libstdcxx/v6/printers.py | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py 
b/libstdc++-v3/python/libstdcxx/v6/printers.py
index 8bb7dd2ad600..be7e7a256065 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -292,9 +292,15 @@ class SharedPointerPrinter(printer_base):
         if self._typename == 'std::atomic':
             # A tagged pointer is stored as uintptr_t.
             val = self._val['_M_refcount']['_M_val']
-            if val.type.is_scalar: # GCC 16 stores uintptr_t
+            # GCC 16 stores it directly as uintptr_t
+            # GCC 12-15 stores std::atomic<uintptr_t>
+            if hasattr(val.type, 'is_scalar'): # Added in GDB 12.1
+                val_is_uintptr = val.type.is_scalar
+            else:
+                val_is_uintptr = val.type.tag is None
+            if val_is_uintptr:
                 ptr_val = val
-            else: # GCC 12-15 stores std::atomic<uintptr_t>
+            else:
                 ptr_val = val['_M_i']
             ptr_val = ptr_val - (ptr_val % 2)  # clear lock bit
             ptr_type = find_type(self._val['_M_refcount'].type, 'pointer')
-- 
2.52.0

Reply via email to