| # aligned_alloc.m4 | |
| # serial 9 | |
| dnl Copyright (C) 2020-2026 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. | |
| dnl This file is offered as-is, without any warranty. | |
| AC_DEFUN([gl_FUNC_ALIGNED_ALLOC], | |
| [ | |
| AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) | |
| AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
| dnl Persuade glibc and OpenBSD <stdlib.h> to declare aligned_alloc(). | |
| AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) | |
| gl_CHECK_FUNCS_ANDROID([aligned_alloc], [[#include <stdlib.h>]]) | |
| if test $ac_cv_func_aligned_alloc = yes; then | |
| dnl On macOS 11.1 and AIX 7.3.1, aligned_alloc returns NULL when the | |
| dnl alignment argument is smaller than sizeof (void *). | |
| dnl On Solaris 11.4, aligned_alloc returns NULL if the size is not a | |
| dnl multiple of the alignment. | |
| dnl On macOS 15, AIX 7.3, Solaris 11.4, aligned_alloc with a zero size | |
| dnl returns NULL. | |
| AC_CACHE_CHECK([whether aligned_alloc works for small alignments and sizes], | |
| [gl_cv_func_aligned_alloc_works], | |
| [AC_RUN_IFELSE( | |
| [AC_LANG_PROGRAM( | |
| [[#include <stdlib.h> | |
| /* Use paligned_alloc to test; 'volatile' prevents the compiler | |
| from optimizing the aligned_alloc call away. */ | |
| void *(*volatile paligned_alloc) (size_t, size_t) | |
| = aligned_alloc;]], | |
| [[int result = 0; | |
| { | |
| void *p = paligned_alloc (2, 18); | |
| if (p == NULL) | |
| result |= 1; | |
| } | |
| { | |
| void *p = paligned_alloc (sizeof (void *), sizeof (void *) + 1); | |
| if (p == NULL) | |
| result |= 2; | |
| } | |
| { | |
| void *p = paligned_alloc (sizeof (void *), 0); | |
| if (p == NULL) | |
| result |= 4; | |
| } | |
| return result; | |
| ]]) | |
| ], | |
| [gl_cv_func_aligned_alloc_works=yes], | |
| [gl_cv_func_aligned_alloc_works=no], | |
| [case "$host_os" in | |
| # Guess no on macOS. | |
| darwin*) gl_cv_func_aligned_alloc_works="guessing no" ;; | |
| # Guess no on AIX. | |
| aix*) gl_cv_func_aligned_alloc_works="guessing no" ;; | |
| # Guess no on Solaris. | |
| solaris*) gl_cv_func_aligned_alloc_works="guessing no" ;; | |
| # If we don't know, obey --enable-cross-guesses. | |
| *) gl_cv_func_aligned_alloc_works="$gl_cross_guess_normal" ;; | |
| esac | |
| ]) | |
| ]) | |
| case "$gl_cv_func_aligned_alloc_works" in | |
| *yes) ;; | |
| *) REPLACE_ALIGNED_ALLOC=1 ;; | |
| esac | |
| else | |
| dnl The system does not have aligned_alloc. | |
| HAVE_ALIGNED_ALLOC=0 | |
| case "$gl_cv_onwards_func_aligned_alloc" in | |
| future*) REPLACE_ALIGNED_ALLOC=1 ;; | |
| esac | |
| fi | |
| ]) |