[PATCH] PR libstdc++/77691 fix resource_adaptor failures due to max_align_t bugs

Jonathan Wakely jwakely@redhat.com
Wed May 22 22:30:00 GMT 2019


On 22/05/19 23:17 +0100, Jonathan Wakely wrote:
>On 22/05/19 21:40 +0100, Jonathan Wakely wrote:
>>Remove the hardcoded whitelist of allocators expected to return memory
>>aligned to alignof(max_align_t), because that doesn't work when the
>>platform's malloc() and GCC's max_align_t do not agree what the largest
>>fundamental alignment is. It's also sub-optimal for user-defined
>>allocators that return memory suitable for any fundamental alignment.
>>
>>Instead use a hardcoded list of alignments that are definitely supported
>>by the platform malloc, and use a copy of the allocator rebound to a POD
>>type with the requested alignment. Only allocate an oversized
>>buffer to use with std::align for alignments larger than any of the
>>hardcoded values.
>>
>>For 32-bit Solaris x86 do not include alignof(max_align_t) in the
>>hardcoded values.
>>
>>	PR libstdc++/77691
>>	* include/experimental/memory_resource: Add system header pragma.
>>	(__resource_adaptor_common::__guaranteed_alignment): Remove.
>>	(__resource_adaptor_common::_Types)
>>	(__resource_adaptor_common::__new_list)
>>	(__resource_adaptor_common::_New_list)
>>	(__resource_adaptor_common::_Alignments)
>>	(__resource_adaptor_common::_Fund_align_types): New utilities for
>>	creating a list of types with fundamental alignments.
>>	(__resource_adaptor_imp::do_allocate): Call new _M_allocate function.
>>	(__resource_adaptor_imp::do_deallocate): Call new _M_deallocate
>>	function.
>>	(__resource_adaptor_imp::_M_allocate): New function that first tries
>>	to use an allocator rebound to a type with a fundamental alignment.
>>	(__resource_adaptor_imp::_M_deallocate): Likewise for deallocation.
>>	* testsuite/experimental/memory_resource/new_delete_resource.cc:
>>	Adjust expected allocation sizes.
>>	* testsuite/experimental/memory_resource/resource_adaptor.cc: Remove
>>	xfail.
>
>Gah, that's the wrong ChangeLog, from an earlier version of the patch.
>The right one is in the ChangeLog file, but the svn commit has the
>wrong info, sorry.
>
>The correct one is:
>
>       PR libstdc++/77691
>       * include/experimental/memory_resource: Add system header pragma and
>       do not define anything unless compiled as C++14 or later.
>       (__resource_adaptor_common::__guaranteed_alignment): Remove.
>       (__resource_adaptor_imp::do_allocate): If the requested alignment
>       is a fundamental alignment then either allocate directly from _M_alloc
>       or call the new _M_allocate function.
>       (__resource_adaptor_imp::do_deallocate): Likewise for deallocation.
>       (__resource_adaptor_imp::_M_allocate): New function that uses a copy
>       of the allocator rebound to a POD type with the specified alignment.
>       (__resource_adaptor_imp::_M_deallocate): Likewise for deallocation.
>       * testsuite/experimental/memory_resource/new_delete_resource.cc:
>       Adjust expected allocation sizes.
>       * testsuite/experimental/memory_resource/resource_adaptor.cc: Remove
>       xfail for Solaris x86.

Double-gah, the tests are failing for 32-bit x86-linux, but not on my
machine. Presumably because glibc malloc only used to guarantee 8-byte
alignment until fairly recently.




More information about the Libstdc++ mailing list