Hash :
b1fcec6d
Author :
Date :
2025-09-10T23:22:53
Remove support for IRIX. * all-modules: Update comments. * build-aux/install-reloc: Likewise. * build-aux/reloc-ldflags: Likewise. * gnulib-tool: Likewise. * gnulib-tool.py: Likewise. * gnulib-tool.sh: Likewise. * lib/aligned-malloc.h: Likewise. * lib/boot-time.c: Likewise. * lib/c32is-impl.h: Likewise. * lib/c32srtombs-state.c: Likewise. * lib/c32to-impl.h: Likewise. * lib/c32width.c: Likewise. * lib/errno.in.h: Likewise. * lib/euidaccess.c: Likewise. * lib/fbufmode.c: Likewise. * lib/fenv-except-state-get.c: Likewise. * lib/fenv-except-state-set.c: Likewise. * lib/fenv-except-tracking-clear.c: Likewise. * lib/fenv-except-tracking-set.c: Likewise. * lib/fenv-except-tracking-test.c: Likewise. * lib/fenv-except-trapping.c: Likewise. * lib/fenv-round.c: Likewise. * lib/fflush.c: Likewise. * lib/fileblocks.c: Likewise. * lib/forkpty.c: Likewise. * lib/fpending.c: Likewise. * lib/fpurge.c: Likewise. * lib/freadable.c: Likewise. * lib/freadahead.c: Likewise. * lib/freading.c: Likewise. * lib/freadptr.c: Likewise. * lib/freadseek.c: Likewise. * lib/fseeko.c: Likewise. * lib/fseterr.c: Likewise. * lib/fsusage.c: Likewise. * lib/fwritable.c: Likewise. * lib/fwriting.c: Likewise. * lib/getdomainname.c: Likewise. * lib/idpriv-drop.c: Likewise. * lib/idpriv-droptemp.c: Likewise. * lib/limits.in.h: Likewise. * lib/mbrtoc16.c: Likewise. * lib/mbrtoc32.c: Likewise. * lib/mbsrtoc32s-state.c: Likewise. * lib/mbsrtowcs-state.c: Likewise. * lib/mbtowc-lock.h: Likewise. * lib/minmax.h: Likewise. * lib/netdb.in.h: Likewise. * lib/pipe-filter-ii.c: Likewise. * lib/posix_openpt.c: Likewise. * lib/ptsname_r.c: Likewise. * lib/readutmp.c: Likewise. * lib/readutmp.h: Likewise. * lib/resource-ext.h: Likewise. * lib/safe-read.h: Likewise. * lib/safe-write.h: Likewise. * lib/save-cwd.c: Likewise. * lib/stdbool.in.h: Likewise. * lib/striconv.c: Likewise. * lib/striconveh.c: Likewise. * lib/termcap.h: Likewise. * lib/terminfo.h: Likewise. * lib/unistd.in.h: Likewise. * lib/vasnprintf.c: Likewise. * lib/wcrtomb.c: Likewise. * lib/wcsrtombs-state.c: Likewise. * m4/fenv-environment.m4: Likewise. * m4/fenv-exceptions-state.m4: Likewise. * m4/fenv-exceptions-tracking.m4: Likewise. * m4/fenv-rounding.m4: Likewise. * m4/fmod.m4: Likewise. * m4/getdomainname.m4: Likewise. * m4/getloadavg.m4: Likewise. * m4/getopt.m4: Likewise. * m4/hypot.m4: Likewise. * m4/hypotf.m4: Likewise. * m4/hypotl.m4: Likewise. * m4/iconv.m4: Likewise. * m4/intl-thread-locale.m4: Likewise. * m4/largefile.m4: Likewise. * m4/libdl.m4: Likewise. * m4/locale-ja.m4: Likewise. * m4/locale_h.m4: Likewise. * m4/log.m4: Likewise. * m4/log10.m4: Likewise. * m4/log10f.m4: Likewise. * m4/logf.m4: Likewise. * m4/modf.m4: Likewise. * m4/modff.m4: Likewise. * m4/modfl.m4: Likewise. * m4/pthread-rwlock.m4: Likewise. * m4/semaphore.m4: Likewise. * m4/socklen.m4: Likewise. * m4/stdint.m4: Likewise. * m4/strtod.m4: Likewise. * m4/strtof.m4: Likewise. * m4/strtold.m4: Likewise. * modules/sigsegv: Likewise. * posix-modules: Likewise. * pygnulib/GLImport.py: Likewise. * tests/init.sh: Likewise. * tests/test-echo.sh: Likewise. * tests/test-isatty.c: Likewise. * tests/test-math-h.c: Likewise. * tests/test-nonblocking-pipe.h: Likewise. * tests/test-nonblocking-socket.h: Likewise. * tests/test-strtod.h: Likewise. * tests/test-strtof.h: Likewise. * tests/test-strtold.h: Likewise. * tests/test-vasnprintf.c: Likewise. * tests/test-vasnwprintf.c: Likewise.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
/* Allocate memory with indefinite extent and specified alignment.
Copyright (C) 2020-2025 Free Software Foundation, Inc.
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This file 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
/* Written by Bruno Haible <bruno@clisp.org>, 2020. */
/* Before including this file, you need to define the following macro:
ALIGNMENT A constant expression that evaluates to the desired alignment
(a power of 2).
And you also need to #include <stdint.h> and <stdlib.h>. */
/* aligned_malloc allocates a block of memory of SIZE bytes, aligned on a
boundary of ALIGNMENT bytes.
The block can be freed through aligned_free(), NOT through free().
Upon failure, it returns NULL. */
/* This module exists instead of a posix_memalign(), aligned_alloc(), or
memalign() emulation, because we can't reasonably emulate posix_memalign(),
aligned_alloc(), or memalign():
If malloc() returned p, only free (p) is allowed, not free (p + 1),
free (p + 2), free (p + 4), free (p + 8), or similar.
We can use posix_memalign(), a POSIX function.
We can also use aligned_alloc(), an ISO C11 and POSIX function. But it's
a bit more awkward to use.
On older systems, we can alternatively use memalign() instead. In the
Solaris documentation of memalign() it is not specified how a memory block
returned by memalign() can be freed, but it actually can be freed with
free(). */
/* This file uses MALLOC_ALIGNMENT, HAVE_POSIX_MEMALIGN, HAVE_ALIGNED_ALLOC,
HAVE_MEMALIGN. */
#if !_GL_CONFIG_H_INCLUDED
#error "Please include config.h first."
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if !defined ALIGNMENT
# error "ALIGNMENT is not defined"
#endif
#if !((ALIGNMENT) > 0 && ((ALIGNMENT) & ((ALIGNMENT) - 1)) == 0)
# error "ALIGNMENT is not a power of 2"
#endif
#if ((ALIGNMENT) <= MALLOC_ALIGNMENT) || HAVE_POSIX_MEMALIGN || HAVE_ALIGNED_ALLOC || HAVE_MEMALIGN
# if defined aligned_free || (__GNUC__ >= 11 && !defined __clang__)
/* The caller wants an inline function, not a macro,
or we can use GCC's -Wmismatched-dealloc warning. */
static inline void
aligned_free (void *q)
{
free (q);
}
# else
# define aligned_free free
# endif
# if (ALIGNMENT) <= MALLOC_ALIGNMENT
/* Simply use malloc. */
# if defined aligned_malloc || (__GNUC__ >= 11 && !defined __clang__)
/* The caller wants an inline function, not a macro,
or GCC's -Wmismatched-dealloc warning might be in effect. */
static inline
/*_GL_ATTRIBUTE_DEALLOC (aligned_free, 1)*/
void *
aligned_malloc (size_t size)
{
return malloc (size);
}
# else
# define aligned_malloc malloc
# endif
# elif HAVE_POSIX_MEMALIGN
/* Use posix_memalign.
This is OK since ALIGNMENT > MALLOC_ALIGNMENT >= sizeof (void *). */
static inline
/*_GL_ATTRIBUTE_DEALLOC (aligned_free, 1)*/
void *
aligned_malloc (size_t size)
{
void *p;
int ret = posix_memalign (&p, (ALIGNMENT), size);
if (ret == 0)
return p;
else
return NULL;
}
# elif HAVE_ALIGNED_ALLOC
/* Use aligned_alloc. */
static inline
/*_GL_ATTRIBUTE_DEALLOC (aligned_free, 1)*/
void *
aligned_malloc (size_t size)
{
/* Round up SIZE to the next multiple of ALIGNMENT,
namely (SIZE + ALIGNMENT - 1) & ~(ALIGNMENT - 1). */
size += (ALIGNMENT) - 1;
if (size >= (ALIGNMENT) - 1) /* no overflow? */
{
size &= ~(size_t)((ALIGNMENT) - 1);
return aligned_alloc ((ALIGNMENT), size);
}
return NULL;
}
# elif HAVE_MEMALIGN /* HP-UX, Solaris <= 10 */
/* Use memalign. */
static inline
/*_GL_ATTRIBUTE_DEALLOC (aligned_free, 1)*/
void *
aligned_malloc (size_t size)
{
return memalign ((ALIGNMENT), size);
}
# endif
#else
/* Use malloc and waste a bit of memory. */
static inline void
aligned_free (void *q)
{
if (q != NULL)
{
if ((uintptr_t) q & ((ALIGNMENT) - 1))
/* Argument not aligned as expected. */
abort ();
else
{
void *p = ((void **) q)[-1];
if (!((uintptr_t) p <= (uintptr_t) q
&& (uintptr_t) q - (uintptr_t) p >= MALLOC_ALIGNMENT
&& (uintptr_t) q - (uintptr_t) p <= (ALIGNMENT)))
abort ();
free (p);
}
}
}
static inline
/*_GL_ATTRIBUTE_DEALLOC (aligned_free, 1)*/
void *
aligned_malloc (size_t size)
{
size += (ALIGNMENT);
if (size >= (ALIGNMENT)) /* no overflow? */
{
void *p = malloc (size);
if (p != NULL)
{
/* Go to the next multiple of ALIGNMENT. */
void *q =
(void *) (((uintptr_t) p + (ALIGNMENT)) & -(intptr_t)(ALIGNMENT));
/* Now q - p <= ALIGNMENT and
q - p >= MALLOC_ALIGNMENT >= sizeof (void *).
This is enough to store a back pointer to p. */
((void **) q)[-1] = p;
return q;
}
}
return NULL;
}
#endif
#ifdef __cplusplus
}
#endif