stdalign.in.h 4.62 KB
Newer Older
Paul Eggert's avatar
Paul Eggert committed
1 2
/* A substitute for ISO C11 <stdalign.h>.

Paul Eggert's avatar
Paul Eggert committed
3
   Copyright 2011-2019 Free Software Foundation, Inc.
Paul Eggert's avatar
Paul Eggert committed
4 5 6 7 8 9 10 11 12 13 14 15

   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, 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
Paul Eggert's avatar
Paul Eggert committed
16
   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
Paul Eggert's avatar
Paul Eggert committed
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

/* Written by Paul Eggert and Bruno Haible.  */

#ifndef _GL_STDALIGN_H
#define _GL_STDALIGN_H

/* ISO C11 <stdalign.h> for platforms that lack it.

   References:
   ISO C11 (latest free draft
   <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>)
   sections 6.5.3.4, 6.7.5, 7.15.
   C++11 (latest free draft
   <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>)
   section 18.10. */

/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment
   requirement of a structure member (i.e., slot or field) that is of
   type TYPE, as an integer constant expression.

   This differs from GCC's __alignof__ operator, which can yield a
   better-performing alignment for an object of that type.  For
   example, on x86 with GCC, __alignof__ (double) and __alignof__
   (long long) are 8, whereas alignof (double) and alignof (long long)
   are 4 unless the option '-malign-double' is used.

   The result cannot be used as a value for an 'enum' constant, if you
44 45 46
   want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc.

   Include <stddef.h> for offsetof.  */
Paul Eggert's avatar
Paul Eggert committed
47
#include <stddef.h>
48 49 50 51 52 53 54

/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
   standard headers, defines conflicting implementations of _Alignas
   and _Alignof that are no better than ours; override them.  */
#undef _Alignas
#undef _Alignof

Paul Eggert's avatar
Paul Eggert committed
55
/* GCC releases before GCC 4.9 had a bug in _Alignof.  See GCC bug 52023
Paul Eggert's avatar
Paul Eggert committed
56
   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.  */
Paul Eggert's avatar
Paul Eggert committed
57 58
#if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \
     || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9)))
59 60 61 62
# ifdef __cplusplus
#  if 201103 <= __cplusplus
#   define _Alignof(type) alignof (type)
#  else
Paul Eggert's avatar
Paul Eggert committed
63
   template <class __t> struct __alignof_helper { char __a; __t __b; };
64 65 66 67 68
#   define _Alignof(type) offsetof (__alignof_helper<type>, __b)
#  endif
# else
#  define _Alignof(type) offsetof (struct { char __a; type __b; }, __b)
# endif
Paul Eggert's avatar
Paul Eggert committed
69
#endif
Paul Eggert's avatar
Paul Eggert committed
70 71 72
#if ! (defined __cplusplus && 201103 <= __cplusplus)
# define alignof _Alignof
#endif
Paul Eggert's avatar
Paul Eggert committed
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
#define __alignof_is_defined 1

/* alignas (A), also known as _Alignas (A), aligns a variable or type
   to the alignment A, where A is an integer constant expression.  For
   example:

      int alignas (8) foo;
      struct s { int a; int alignas (8) bar; };

   aligns the address of FOO and the offset of BAR to be multiples of 8.

   A should be a power of two that is at least the type's alignment
   and at most the implementation's alignment limit.  This limit is
   2**28 on typical GNUish hosts, and 2**13 on MSVC.  To be portable
   to MSVC through at least version 10.0, A should be an integer
   constant, as MSVC does not support expressions such as 1 << 3.
   To be portable to Sun C 5.11, do not align auto variables to
   anything stricter than their default alignment.

   The following C11 requirements are not supported here:

     - If A is zero, alignas has no effect.
     - alignas can be used multiple times; the strictest one wins.
     - alignas (TYPE) is equivalent to alignas (alignof (TYPE)).

   */

100 101 102
#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
# if defined __cplusplus && 201103 <= __cplusplus
#  define _Alignas(a) alignas (a)
Paul Eggert's avatar
Paul Eggert committed
103 104 105
# elif ((defined __APPLE__ && defined __MACH__                  \
         ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__)                 \
         : __GNUC__)                                            \
Paul Eggert's avatar
Paul Eggert committed
106
        || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
Paul Eggert's avatar
Paul Eggert committed
107
        || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__)
108 109 110 111
#  define _Alignas(a) __attribute__ ((__aligned__ (a)))
# elif 1300 <= _MSC_VER
#  define _Alignas(a) __declspec (align (a))
# endif
Paul Eggert's avatar
Paul Eggert committed
112
#endif
Paul Eggert's avatar
Paul Eggert committed
113
#if ((defined _Alignas && ! (defined __cplusplus && 201103 <= __cplusplus)) \
Paul Eggert's avatar
Paul Eggert committed
114
     || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
Paul Eggert's avatar
Paul Eggert committed
115
# define alignas _Alignas
Paul Eggert's avatar
Paul Eggert committed
116 117
#endif
#if defined alignas || (defined __cplusplus && 201103 <= __cplusplus)
Paul Eggert's avatar
Paul Eggert committed
118 119 120 121
# define __alignas_is_defined 1
#endif

#endif /* _GL_STDALIGN_H */