Here comes the module 'posix_memalign'. On OpenBSD 6.0 and 6.1,
void *p;
posix_memalign (&p, 32, 2406)
produces a pointer p that is not a multiple of 32. It's fixed in OpenBSD 6.2.
2020-11-03 Bruno Haible <[email protected]>
posix_memalign: Add tests.
* tests/test-posix_memalign.c: New file.
* modules/posix_memalign-tests: New file.
posix_memalign: New module.
* lib/stdlib.in.h (posix_memalign): New declaration.
* lib/posix_memalign.c: New file.
* m4/posix_memalign.m4: New file.
* m4/stdlib_h.m4 (gl_STDLIB_H): Test whether posix_memalign is declared.
(gl_STDLIB_H_DEFAULTS): Initialize GNULIB_POSIX_MEMALIGN,
HAVE_POSIX_MEMALIGN, REPLACE_POSIX_MEMALIGN.
* modules/stdlib (Makefile.am): Substitute GNULIB_POSIX_MEMALIGN,
HAVE_POSIX_MEMALIGN, REPLACE_POSIX_MEMALIGN.
* modules/posix_memalign: New file.
* tests/test-stdlib-c++.cc (posix_memalign): Check signature.
* doc/posix-functions/posix_memalign.texi: Mention the new module and
the OpenBSD bug.
>From 419322ec4c4c6ff1df518378d86162b7a53bf2c0 Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Wed, 4 Nov 2020 02:19:08 +0100
Subject: [PATCH 1/2] posix_memalign: New module.
* lib/stdlib.in.h (posix_memalign): New declaration.
* lib/posix_memalign.c: New file.
* m4/posix_memalign.m4: New file.
* m4/stdlib_h.m4 (gl_STDLIB_H): Test whether posix_memalign is declared.
(gl_STDLIB_H_DEFAULTS): Initialize GNULIB_POSIX_MEMALIGN,
HAVE_POSIX_MEMALIGN, REPLACE_POSIX_MEMALIGN.
* modules/stdlib (Makefile.am): Substitute GNULIB_POSIX_MEMALIGN,
HAVE_POSIX_MEMALIGN, REPLACE_POSIX_MEMALIGN.
* modules/posix_memalign: New file.
* tests/test-stdlib-c++.cc (posix_memalign): Check signature.
* doc/posix-functions/posix_memalign.texi: Mention the new module and
the OpenBSD bug.
---
ChangeLog | 16 +++++++++++
doc/posix-functions/posix_memalign.texi | 5 +++-
lib/posix_memalign.c | 35 +++++++++++++++++++++++
lib/stdlib.in.h | 29 +++++++++++++++++++
m4/posix_memalign.m4 | 50 +++++++++++++++++++++++++++++++++
m4/stdlib_h.m4 | 12 +++++---
modules/posix_memalign | 28 ++++++++++++++++++
modules/stdlib | 3 ++
tests/test-stdlib-c++.cc | 5 ++++
9 files changed, 178 insertions(+), 5 deletions(-)
create mode 100644 lib/posix_memalign.c
create mode 100644 m4/posix_memalign.m4
create mode 100644 modules/posix_memalign
diff --git a/ChangeLog b/ChangeLog
index e608993..fd72d3e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
2020-11-03 Bruno Haible <[email protected]>
+ posix_memalign: New module.
+ * lib/stdlib.in.h (posix_memalign): New declaration.
+ * lib/posix_memalign.c: New file.
+ * m4/posix_memalign.m4: New file.
+ * m4/stdlib_h.m4 (gl_STDLIB_H): Test whether posix_memalign is declared.
+ (gl_STDLIB_H_DEFAULTS): Initialize GNULIB_POSIX_MEMALIGN,
+ HAVE_POSIX_MEMALIGN, REPLACE_POSIX_MEMALIGN.
+ * modules/stdlib (Makefile.am): Substitute GNULIB_POSIX_MEMALIGN,
+ HAVE_POSIX_MEMALIGN, REPLACE_POSIX_MEMALIGN.
+ * modules/posix_memalign: New file.
+ * tests/test-stdlib-c++.cc (posix_memalign): Check signature.
+ * doc/posix-functions/posix_memalign.texi: Mention the new module and
+ the OpenBSD bug.
+
+2020-11-03 Bruno Haible <[email protected]>
+
memalign: Add tests.
* tests/test-memalign.c: New file.
* modules/memalign-tests: New file.
diff --git a/doc/posix-functions/posix_memalign.texi b/doc/posix-functions/posix_memalign.texi
index 084841b..7f58c69 100644
--- a/doc/posix-functions/posix_memalign.texi
+++ b/doc/posix-functions/posix_memalign.texi
@@ -4,10 +4,13 @@
POSIX specification:@* @url{https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_memalign.html}
-Gnulib module: ---
+Gnulib module: posix_memalign
Portability problems fixed by Gnulib:
@itemize
+@item
+This function produces misaligned results on some platforms:
+OpenBSD 6.1.
@end itemize
Portability problems not fixed by Gnulib:
diff --git a/lib/posix_memalign.c b/lib/posix_memalign.c
new file mode 100644
index 0000000..ef85768
--- /dev/null
+++ b/lib/posix_memalign.c
@@ -0,0 +1,35 @@
+/* A posix_memalign() function that works around platform bugs.
+ Copyright (C) 2020 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+
+int
+posix_memalign (void **memptr, size_t alignment, size_t size)
+#undef posix_memalign
+{
+ /* Round up SIZE to the next multiple of ALIGNMENT, namely
+ (SIZE + ALIGNMENT - 1) & ~(ALIGNMENT - 1). */
+ size += alignment - 1;
+ if (size >= alignment - 1) /* no overflow? */
+ return posix_memalign (memptr, alignment, size & ~(size_t)(alignment - 1));
+ else
+ return ENOMEM;
+}
diff --git a/lib/stdlib.in.h b/lib/stdlib.in.h
index 47a1309..58e4bba 100644
--- a/lib/stdlib.in.h
+++ b/lib/stdlib.in.h
@@ -488,6 +488,35 @@ _GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
# define mktemp _mktemp
#endif
+/* Allocate memory with indefinite extent and specified alignment. */
+#if @GNULIB_POSIX_MEMALIGN@
+# if @REPLACE_POSIX_MEMALIGN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef posix_memalign
+# define posix_memalign rpl_posix_memalign
+# endif
+_GL_FUNCDECL_RPL (posix_memalign, int,
+ (void **memptr, size_t alignment, size_t size)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_memalign, int,
+ (void **memptr, size_t alignment, size_t size));
+# else
+# if @HAVE_POSIX_MEMALIGN@
+_GL_CXXALIAS_SYS (posix_memalign, int,
+ (void **memptr, size_t alignment, size_t size));
+# endif
+# endif
+# if @HAVE_POSIX_MEMALIGN@
+_GL_CXXALIASWARN (posix_memalign);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_memalign
+# if HAVE_RAW_DECL_POSIX_MEMALIGN
+_GL_WARN_ON_USE (posix_memalign, "posix_memalign is not portable - "
+ "use gnulib module posix_memalign for portability");
+# endif
+#endif
+
#if @GNULIB_POSIX_OPENPT@
/* Return an FD open to the master side of a pseudo-terminal. Flags should
include O_RDWR, and may also include O_NOCTTY. */
diff --git a/m4/posix_memalign.m4 b/m4/posix_memalign.m4
new file mode 100644
index 0000000..67c11b9
--- /dev/null
+++ b/m4/posix_memalign.m4
@@ -0,0 +1,50 @@
+# posix_memalign.m4 serial 1
+dnl Copyright (C) 2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_POSIX_MEMALIGN],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Persuade glibc <stdlib.h> to declare posix_memalign().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([posix_memalign])
+ if test $ac_cv_func_posix_memalign = yes; then
+ dnl On OpenBSD 6.1, posix_memalign (&p, 32, 2406) returns a pointer
+ dnl that is not a multiple of 32.
+ AC_CACHE_CHECK([whether posix_memalign works for large alignments],
+ [gl_cv_func_posix_memalign_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ ]],
+ [[void *p;
+ if (posix_memalign (&p, 32, 2406) == 0)
+ if (((unsigned long)p % 32) != 0)
+ return 1;
+ return 0;
+ ]])
+ ],
+ [gl_cv_func_posix_memalign_works=yes],
+ [gl_cv_func_posix_memalign_works=no],
+ [case "$host_os" in
+ # Guess no on OpenBSD.
+ openbsd*) gl_cv_func_posix_memalign_works="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_posix_memalign_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_posix_memalign_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_MEMALIGN=1 ;;
+ esac
+ else
+ dnl The system does not have posix_memalign.
+ HAVE_POSIX_MEMALIGN=0
+ fi
+])
diff --git a/m4/stdlib_h.m4 b/m4/stdlib_h.m4
index 743066a..d9b13b6 100644
--- a/m4/stdlib_h.m4
+++ b/m4/stdlib_h.m4
@@ -1,4 +1,4 @@
-# stdlib_h.m4 serial 49
+# stdlib_h.m4 serial 50
dnl Copyright (C) 2007-2020 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -24,9 +24,10 @@ AC_DEFUN([gl_STDLIB_H],
#endif
]], [_Exit atoll canonicalize_file_name getloadavg getsubopt grantpt
initstate initstate_r mbtowc mkdtemp mkostemp mkostemps mkstemp mkstemps
- posix_openpt ptsname ptsname_r qsort_r random random_r reallocarray
- realpath rpmatch secure_getenv setenv setstate setstate_r srandom
- srandom_r strtod strtold strtoll strtoull unlockpt unsetenv])
+ posix_memalign posix_openpt ptsname ptsname_r qsort_r
+ random random_r reallocarray realpath rpmatch secure_getenv setenv
+ setstate setstate_r srandom srandom_r
+ strtod strtold strtoll strtoull unlockpt unsetenv])
AC_REQUIRE([AC_C_RESTRICT])
])
@@ -56,6 +57,7 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
GNULIB_MKOSTEMPS=0; AC_SUBST([GNULIB_MKOSTEMPS])
GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP])
GNULIB_MKSTEMPS=0; AC_SUBST([GNULIB_MKSTEMPS])
+ GNULIB_POSIX_MEMALIGN=0;AC_SUBST([GNULIB_POSIX_MEMALIGN])
GNULIB_POSIX_OPENPT=0; AC_SUBST([GNULIB_POSIX_OPENPT])
GNULIB_PTSNAME=0; AC_SUBST([GNULIB_PTSNAME])
GNULIB_PTSNAME_R=0; AC_SUBST([GNULIB_PTSNAME_R])
@@ -92,6 +94,7 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS])
HAVE_MKSTEMP=1; AC_SUBST([HAVE_MKSTEMP])
HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS])
+ HAVE_POSIX_MEMALIGN=1; AC_SUBST([HAVE_POSIX_MEMALIGN])
HAVE_POSIX_OPENPT=1; AC_SUBST([HAVE_POSIX_OPENPT])
HAVE_PTSNAME=1; AC_SUBST([HAVE_PTSNAME])
HAVE_PTSNAME_R=1; AC_SUBST([HAVE_PTSNAME_R])
@@ -121,6 +124,7 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
REPLACE_MALLOC=0; AC_SUBST([REPLACE_MALLOC])
REPLACE_MBTOWC=0; AC_SUBST([REPLACE_MBTOWC])
REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP])
+ REPLACE_POSIX_MEMALIGN=0; AC_SUBST([REPLACE_POSIX_MEMALIGN])
REPLACE_PTSNAME=0; AC_SUBST([REPLACE_PTSNAME])
REPLACE_PTSNAME_R=0; AC_SUBST([REPLACE_PTSNAME_R])
REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV])
diff --git a/modules/posix_memalign b/modules/posix_memalign
new file mode 100644
index 0000000..86e8a52
--- /dev/null
+++ b/modules/posix_memalign
@@ -0,0 +1,28 @@
+Description:
+Allocate memory with indefinite extent and specified alignment.
+
+Files:
+lib/posix_memalign.c
+m4/posix_memalign.m4
+
+Depends-on:
+extensions
+stdlib
+
+configure.ac:
+gl_FUNC_POSIX_MEMALIGN
+if test $REPLACE_POSIX_MEMALIGN = 1; then
+ AC_LIBOBJ([posix_memalign])
+fi
+gl_STDLIB_MODULE_INDICATOR([posix_memalign])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/modules/stdlib b/modules/stdlib
index ea838c9..df533a9 100644
--- a/modules/stdlib
+++ b/modules/stdlib
@@ -45,6 +45,7 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
-e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \
-e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \
-e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \
+ -e 's/@''GNULIB_POSIX_MEMALIGN''@/$(GNULIB_POSIX_MEMALIGN)/g' \
-e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \
-e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \
-e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \
@@ -81,6 +82,7 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
-e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
-e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
-e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+ -e 's|@''HAVE_POSIX_MEMALIGN''@|$(HAVE_POSIX_MEMALIGN)|g' \
-e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
-e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
-e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
@@ -109,6 +111,7 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
-e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
-e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
-e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+ -e 's|@''REPLACE_POSIX_MEMALIGN''@|$(REPLACE_POSIX_MEMALIGN)|g' \
-e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
-e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
-e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
diff --git a/tests/test-stdlib-c++.cc b/tests/test-stdlib-c++.cc
index 405c814..25b1c3d 100644
--- a/tests/test-stdlib-c++.cc
+++ b/tests/test-stdlib-c++.cc
@@ -85,6 +85,11 @@ SIGNATURE_CHECK (GNULIB_NAMESPACE::mkstemp, int, (char *));
SIGNATURE_CHECK (GNULIB_NAMESPACE::mkstemps, int, (char *, int));
#endif
+#if GNULIB_TEST_POSIX_MEMALIGN && HAVE_POSIX_MEMALIGN
+SIGNATURE_CHECK (GNULIB_NAMESPACE::posix_memalign, int,
+ (void **, size_t, size_t));
+#endif
+
#if GNULIB_TEST_POSIX_OPENPT
SIGNATURE_CHECK (GNULIB_NAMESPACE::posix_openpt, int, (int));
#endif
--
2.7.4
>From 25792758360eb2383ff381d1227c3b928e0cba62 Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Wed, 4 Nov 2020 02:19:12 +0100
Subject: [PATCH 2/2] posix_memalign: Add tests.
* tests/test-posix_memalign.c: New file.
* modules/posix_memalign-tests: New file.
---
ChangeLog | 4 ++
modules/posix_memalign-tests | 12 +++++
tests/test-posix_memalign.c | 103 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 119 insertions(+)
create mode 100644 modules/posix_memalign-tests
create mode 100644 tests/test-posix_memalign.c
diff --git a/ChangeLog b/ChangeLog
index fd72d3e..e4f606e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2020-11-03 Bruno Haible <[email protected]>
+ posix_memalign: Add tests.
+ * tests/test-posix_memalign.c: New file.
+ * modules/posix_memalign-tests: New file.
+
posix_memalign: New module.
* lib/stdlib.in.h (posix_memalign): New declaration.
* lib/posix_memalign.c: New file.
diff --git a/modules/posix_memalign-tests b/modules/posix_memalign-tests
new file mode 100644
index 0000000..5136dab
--- /dev/null
+++ b/modules/posix_memalign-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-posix_memalign.c
+tests/macros.h
+
+Depends-on:
+stdint
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-posix_memalign
+check_PROGRAMS += test-posix_memalign
diff --git a/tests/test-posix_memalign.c b/tests/test-posix_memalign.c
new file mode 100644
index 0000000..a5dc652
--- /dev/null
+++ b/tests/test-posix_memalign.c
@@ -0,0 +1,103 @@
+/* Test of allocating memory with given alignment.
+
+ Copyright (C) 2020 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <[email protected]>, 2020. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+#if HAVE_POSIX_MEMALIGN
+ static size_t sizes[] =
+ { 13, 8, 17, 450, 320, 1, 99, 4, 15, 16, 2, 76, 37, 127, 2406, 641, 5781 };
+ void *aligned2_blocks[SIZEOF (sizes)];
+ void *aligned4_blocks[SIZEOF (sizes)];
+ void *aligned8_blocks[SIZEOF (sizes)];
+ void *aligned16_blocks[SIZEOF (sizes)];
+ void *aligned32_blocks[SIZEOF (sizes)];
+ void *aligned64_blocks[SIZEOF (sizes)];
+ size_t i;
+
+ for (i = 0; i < SIZEOF (sizes); i++)
+ {
+ size_t size = sizes[i];
+
+ if (sizeof (void *) <= 2)
+ {
+ ASSERT (posix_memalign (&aligned2_blocks[i], 2, size) == 0);
+ ASSERT (aligned2_blocks[i] != NULL);
+ ASSERT (((uintptr_t) aligned2_blocks[i] % 2) == 0);
+ memset (aligned2_blocks[i], 'u', size);
+ }
+
+ if (sizeof (void *) <= 4)
+ {
+ ASSERT (posix_memalign (&aligned4_blocks[i], 4, size) == 0);
+ ASSERT (aligned4_blocks[i] != NULL);
+ ASSERT (((uintptr_t) aligned4_blocks[i] % 4) == 0);
+ memset (aligned4_blocks[i], 'v', size);
+ }
+
+ ASSERT (posix_memalign (&aligned8_blocks[i], 8, size) == 0);
+ ASSERT (aligned8_blocks[i] != NULL);
+ ASSERT (((uintptr_t) aligned8_blocks[i] % 8) == 0);
+ memset (aligned8_blocks[i], 'w', size);
+
+ ASSERT (posix_memalign (&aligned16_blocks[i], 16, size) == 0);
+ ASSERT (aligned16_blocks[i] != NULL);
+ ASSERT (((uintptr_t) aligned16_blocks[i] % 16) == 0);
+ memset (aligned16_blocks[i], 'x', size);
+
+ ASSERT (posix_memalign (&aligned32_blocks[i], 32, size) == 0);
+ ASSERT (aligned32_blocks[i] != NULL);
+ ASSERT (((uintptr_t) aligned32_blocks[i] % 32) == 0);
+ memset (aligned32_blocks[i], 'y', size);
+
+ ASSERT (posix_memalign (&aligned64_blocks[i], 64, size) == 0);
+ ASSERT (aligned64_blocks[i] != NULL);
+ ASSERT (((uintptr_t) aligned64_blocks[i] % 64) == 0);
+ memset (aligned64_blocks[i], 'z', size);
+ }
+
+ for (i = 0; i < SIZEOF (sizes); i++)
+ {
+ if (sizeof (void *) <= 2)
+ free (aligned2_blocks[i]);
+ if (sizeof (void *) <= 4)
+ free (aligned4_blocks[i]);
+ free (aligned8_blocks[i]);
+ free (aligned16_blocks[i]);
+ free (aligned32_blocks[i]);
+ free (aligned64_blocks[i]);
+ }
+
+ return 0;
+#else
+ fputs ("Skipping test: function 'aligned_alloc' does not exist\n", stderr);
+ return 77;
+#endif
+}
--
2.7.4