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? Why would we put effort into supporting this? 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 > >
