[PATCH 1/2] libstdc++: Replace padding bits with a bit-field in __format::_Spec
Hans-Peter Nilsson
hp@axis.com
Thu Feb 1 16:16:47 GMT 2024
> From: Jonathan Wakely <jwakely@redhat.com>
> Cc: Hans-Peter Nilsson <hp@axis.com>
> Date: Thu, 1 Feb 2024 15:36:50 +0000
> I plan to push this to trunk soon.
>
> CC HP for visibility of the change affecting cris-elf. In practice it
> shouldn't make any difference to any sensible code. It only affects
> C++20 mode (and later), and only changes the size of std::formatter
> objects which are typically only created by the library headers
> themselves, and only on the stack (when using std::format and other new
> C++20 APIs related to it).
>
> -- >8 --
>
> This ensures that the unused bits will be zero-initialized reliably, and
> so can be used later by assigning them values in formatter
> specializations. For example, formatters for std::chrono will need to
> use an extra bit for a boolean to optimize the conversions between
> locale encodings and UTF-8.
>
> This will result in an ABI change for targets that use 1-byte alignment
> for all integral types, e.g. cris-elf.
Thanks for the heads-up, but don't worry about ABI changes
for cris-elf.
Not speaking for other platforms with default-packed layout
or where ABI structure layout alignment implies a change due
to PCC_BITFIELD_TYPE_MATTERS and the "unsigned long"
bitfield type.
That last one may matter though.
> We can't do that once C++20
> support is non-experimental and ABI stable, so do it now before GCC 14
> is released.
>
> libstdc++-v3/ChangeLog:
>
> * include/std/format (__format::_Spec::_M_reserved): Define a
> new bit-field member in place of padding bits.
> ---
> libstdc++-v3/include/std/format | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
> index 0eca8b58bfa..6c958bc11a5 100644
> --- a/libstdc++-v3/include/std/format
> +++ b/libstdc++-v3/include/std/format
> @@ -406,6 +406,7 @@ namespace __format
> _WidthPrec _M_width_kind : 2;
> _WidthPrec _M_prec_kind : 2;
> _Pres_type _M_type : 4;
> + unsigned long _M_reserved : 17;
> unsigned short _M_width;
> unsigned short _M_prec;
> char32_t _M_fill = ' ';
> --
> 2.43.0
>
More information about the Libstdc++
mailing list