diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-10-06 20:05:48 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-10-21 00:19:20 +0100 |
commit | 8a9a59311551e833ca064de44ac23b193e1b704d (patch) | |
tree | 1d91ec3b267277e45d849261406337c1c4fa5a3f /support | |
parent | aa783f9a7b774d67487daa9376095738aef5cf88 (diff) | |
download | glibc-8a9a59311551e833ca064de44ac23b193e1b704d.tar glibc-8a9a59311551e833ca064de44ac23b193e1b704d.tar.gz glibc-8a9a59311551e833ca064de44ac23b193e1b704d.tar.bz2 glibc-8a9a59311551e833ca064de44ac23b193e1b704d.zip |
Add alloc_align attribute to memalign et al
GCC 4.9.0 added the alloc_align attribute to say that a function
argument specifies the alignment of the returned pointer. Clang supports
the attribute too. Using the attribute can allow a compiler to generate
better code if it knows the returned pointer has a minimum alignment.
See https://gcc.gnu.org/PR60092 for more details.
GCC implicitly knows the semantics of aligned_alloc and posix_memalign,
but not the obsolete memalign. As a result, GCC generates worse code
when memalign is used, compared to aligned_alloc. Clang knows about
aligned_alloc and memalign, but not posix_memalign.
This change adds a new __attribute_alloc_align__ macro to <sys/cdefs.h>
and then uses it on memalign (where it helps GCC) and aligned_alloc
(where GCC and Clang already know the semantics, but it doesn't hurt)
and xposix_memalign. It can't be used on posix_memalign because that
doesn't return a pointer (the allocated pointer is returned via a void**
parameter instead).
Unlike the alloc_size attribute, alloc_align only allows a single
argument. That means the new __attribute_alloc_align__ macro doesn't
really need to be used with double parentheses to protect a comma
between its arguments. For consistency with __attribute_alloc_size__
this patch defines it the same way, so that double parentheses are
required.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'support')
-rw-r--r-- | support/support.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/support/support.h b/support/support.h index 0ee454da6d..10a4a36848 100644 --- a/support/support.h +++ b/support/support.h @@ -1,5 +1,6 @@ /* Common extra functions. Copyright (C) 2016-2021 Free Software Foundation, Inc. + Copyright The GNU Toolchain Authors. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -104,8 +105,8 @@ extern void *xrealloc (void *o, size_t n) extern char *xstrdup (const char *) __attribute_malloc__ __attr_dealloc_free __returns_nonnull; void *xposix_memalign (size_t alignment, size_t n) - __attribute_malloc__ __attribute_alloc_size__ ((2)) __attr_dealloc_free - __returns_nonnull; + __attribute_malloc__ __attribute_alloc_align__ ((1)) + __attribute_alloc_size__ ((2)) __attr_dealloc_free __returns_nonnull; char *xasprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2), malloc)) __attr_dealloc_free __returns_nonnull; |