public inbox for libstdc++@gcc.gnu.org
 help / color / mirror / Atom feed
* [PR77691] x86-vxworks malloc aligns to 8 bytes like solaris
@ 2020-05-08 20:22 Alexandre Oliva
  2020-05-09  8:51 ` Jonathan Wakely
  0 siblings, 1 reply; 6+ messages in thread
From: Alexandre Oliva @ 2020-05-08 20:22 UTC (permalink / raw)
  To: Jonathan Wakely; +Cc: gcc-patches, libstdc++


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 fix the
one test that could still fail on x86-vxworks, that expected
char-aligned requested allocation to be aligned for 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.

Tested on x86_64-linux-gnu-x-i586-vxworks7.2.  Ok to install?

(Couldn't r1->allocate(2, alignof(char)) possibly return a pointer
that's *not* aligned<max_align_t>?  Maybe we should drop the test even
if !defined(BAD_MAX_ALIGN_T).)


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): Skip align test for char-aligned alloc if
	BAD_MAX_ALIGN_T.
---
 libstdc++-v3/include/experimental/memory_resource  |    4 ++--
 .../memory_resource/new_delete_resource.cc         |    5 +++--
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/libstdc++-v3/include/experimental/memory_resource b/libstdc++-v3/include/experimental/memory_resource
index 850a78d..1c4de70 100644
--- a/libstdc++-v3/include/experimental/memory_resource
+++ b/libstdc++-v3/include/experimental/memory_resource
@@ -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
diff --git a/libstdc++-v3/testsuite/experimental/memory_resource/new_delete_resource.cc b/libstdc++-v3/testsuite/experimental/memory_resource/new_delete_resource.cc
index 8a98954..8119349 100644
--- a/libstdc++-v3/testsuite/experimental/memory_resource/new_delete_resource.cc
+++ b/libstdc++-v3/testsuite/experimental/memory_resource/new_delete_resource.cc
@@ -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,9 @@ test03()
 
   p = r1->allocate(2, alignof(char));
   VERIFY( bytes_allocated == 2 );
+#ifndef BAD_MAX_ALIGN_T
   VERIFY( aligned<max_align_t>(p) );
+#endif
   r1->deallocate(p, 2, alignof(char));
   VERIFY( bytes_allocated == 0 );
 

-- 
Alexandre Oliva, freedom fighter    he/him    https://FSFLA.org/blogs/lxo/
Free Software Evangelist              Stallman was right, but he's left :(
GNU Toolchain Engineer           Live long and free, and prosper ethically

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-05-26 11:23 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-08 20:22 [PR77691] x86-vxworks malloc aligns to 8 bytes like solaris Alexandre Oliva
2020-05-09  8:51 ` Jonathan Wakely
2020-05-13  7:49   ` Alexandre Oliva
2020-05-13  9:05     ` Jonathan Wakely
2020-05-26 10:11   ` Alexandre Oliva
2020-05-26 11:23     ` Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).