On Thu, 5 Feb 2026 at 10:52, Tomasz Kaminski <[email protected]> wrote:
>
>
>
> On Thu, Feb 5, 2026 at 11:41 AM Jonathan Wakely <[email protected]> wrote:
>>
>> 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.
>
> I am confused about the configuration that this is aiming to address? Someone
> having a GCC 16 installation (so they pick up new pretty-printers), but using
> GDB-8 to debug the produced binary?

Right.

> Why would we put effort into supporting
> this?

Because RHEL 8 comes with GDB 8.2

>
> Outside of that patch LGTM.
>
>>  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