x86-vxworks malloc aligns to 8 bytes like solaris
Vxworks 7's malloc, like Solaris', only ensures 8-byte alignment of returned pointers on 32-bit x86, though GCC's stddef.h defines max_align_t with 16-byte alignment for __float128. This patch enables on x86-vxworks the same memory_resource workaround used for x86-solaris. The testsuite also had a workaround, defining BAD_MAX_ALIGN_T and xfailing the test; extend those to x86-vxworks as well, and remove the check for char-aligned requested allocation to be aligned like max_align_t. With that change, the test passes on x86-vxworks; I'm guessing that's the same reason for the test not to pass on x86-solaris (and on x86_64-solaris -m32), so with the fix, I'm tentatively removing the xfail. for libstdc++-v3/ChangeLog PR libstdc++/77691 * include/experimental/memory_resource (__resource_adaptor_imp::do_allocate): Handle max_align_t on x86-vxworks as on x86-solaris. (__resource_adaptor_imp::do_deallocate): Likewise. * testsuite/experimental/memory_resource/new_delete_resource.cc: Drop xfail. (BAD_MAX_ALIGN_T): Define on x86-vxworks as on x86-solaris. (test03): Drop max-align test for char-aligned alloc.
This commit is contained in:
parent
a7b7818f3d
commit
883246530f
|
@ -1,3 +1,15 @@
|
|||
2020-05-13 Alexandre Oliva <oliva@adacore.com>
|
||||
|
||||
PR libstdc++/77691
|
||||
* include/experimental/memory_resource
|
||||
(__resource_adaptor_imp::do_allocate): Handle max_align_t on
|
||||
x86-vxworks as on x86-solaris.
|
||||
(__resource_adaptor_imp::do_deallocate): Likewise.
|
||||
* testsuite/experimental/memory_resource/new_delete_resource.cc:
|
||||
Drop xfail.
|
||||
(BAD_MAX_ALIGN_T): Define on x86-vxworks as on x86-solaris.
|
||||
(test03): Drop max-align test for char-aligned alloc.
|
||||
|
||||
2020-05-08 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* include/bits/atomic_base.h (atomic_flag): Implement test member
|
||||
|
|
|
@ -413,7 +413,7 @@ namespace pmr {
|
|||
do_allocate(size_t __bytes, size_t __alignment) override
|
||||
{
|
||||
// Cannot use max_align_t on 32-bit Solaris x86, see PR libstdc++/77691
|
||||
#if ! (defined __sun__ && defined __i386__)
|
||||
#if ! ((defined __sun__ || defined __VXWORKS__) && defined __i386__)
|
||||
if (__alignment == alignof(max_align_t))
|
||||
return _M_allocate<alignof(max_align_t)>(__bytes);
|
||||
#endif
|
||||
|
@ -439,7 +439,7 @@ namespace pmr {
|
|||
do_deallocate(void* __ptr, size_t __bytes, size_t __alignment) noexcept
|
||||
override
|
||||
{
|
||||
#if ! (defined __sun__ && defined __i386__)
|
||||
#if ! ((defined __sun__ || defined __VXWORKS__) && defined __i386__)
|
||||
if (__alignment == alignof(max_align_t))
|
||||
return (void) _M_deallocate<alignof(max_align_t)>(__ptr, __bytes);
|
||||
#endif
|
||||
|
|
|
@ -17,13 +17,12 @@
|
|||
|
||||
// { dg-do run { target c++14 } }
|
||||
// { dg-require-cstdint "" }
|
||||
// { dg-xfail-run-if "PR libstdc++/77691" { { i?86-*-solaris2.* x86_64-*-solaris2.* } && ilp32 } }
|
||||
|
||||
#include <experimental/memory_resource>
|
||||
#include <cstdlib>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
#if defined __sun__ && defined __i386__
|
||||
#if (defined __sun__ || defined __VXWORKS__) && defined __i386__
|
||||
// See PR libstdc++/77691
|
||||
# define BAD_MAX_ALIGN_T 1
|
||||
#endif
|
||||
|
@ -128,7 +127,6 @@ test03()
|
|||
|
||||
p = r1->allocate(2, alignof(char));
|
||||
VERIFY( bytes_allocated == 2 );
|
||||
VERIFY( aligned<max_align_t>(p) );
|
||||
r1->deallocate(p, 2, alignof(char));
|
||||
VERIFY( bytes_allocated == 0 );
|
||||
|
||||
|
|
Loading…
Reference in New Issue