Blame lib/stdalign.in.h

Packit 8f70b4
/* A substitute for ISO C11 <stdalign.h>.
Packit 8f70b4
Packit 8f70b4
   Copyright 2011-2018 Free Software Foundation, Inc.
Packit 8f70b4
Packit 8f70b4
   This program is free software; you can redistribute it and/or modify
Packit 8f70b4
   it under the terms of the GNU General Public License as published by
Packit 8f70b4
   the Free Software Foundation; either version 3, or (at your option)
Packit 8f70b4
   any later version.
Packit 8f70b4
Packit 8f70b4
   This program is distributed in the hope that it will be useful,
Packit 8f70b4
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 8f70b4
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 8f70b4
   GNU General Public License for more details.
Packit 8f70b4
Packit 8f70b4
   You should have received a copy of the GNU General Public License
Packit 8f70b4
   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
Packit 8f70b4
Packit 8f70b4
/* Written by Paul Eggert and Bruno Haible.  */
Packit 8f70b4
Packit 8f70b4
#ifndef _GL_STDALIGN_H
Packit 8f70b4
#define _GL_STDALIGN_H
Packit 8f70b4
Packit 8f70b4
/* ISO C11 <stdalign.h> for platforms that lack it.
Packit 8f70b4
Packit 8f70b4
   References:
Packit 8f70b4
   ISO C11 (latest free draft
Packit 8f70b4
   <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>)
Packit 8f70b4
   sections 6.5.3.4, 6.7.5, 7.15.
Packit 8f70b4
   C++11 (latest free draft
Packit 8f70b4
   <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>)
Packit 8f70b4
   section 18.10. */
Packit 8f70b4
Packit 8f70b4
/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment
Packit 8f70b4
   requirement of a structure member (i.e., slot or field) that is of
Packit 8f70b4
   type TYPE, as an integer constant expression.
Packit 8f70b4
Packit 8f70b4
   This differs from GCC's __alignof__ operator, which can yield a
Packit 8f70b4
   better-performing alignment for an object of that type.  For
Packit 8f70b4
   example, on x86 with GCC, __alignof__ (double) and __alignof__
Packit 8f70b4
   (long long) are 8, whereas alignof (double) and alignof (long long)
Packit 8f70b4
   are 4 unless the option '-malign-double' is used.
Packit 8f70b4
Packit 8f70b4
   The result cannot be used as a value for an 'enum' constant, if you
Packit 8f70b4
   want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc.
Packit 8f70b4
Packit 8f70b4
   Include <stddef.h> for offsetof.  */
Packit 8f70b4
#include <stddef.h>
Packit 8f70b4
Packit 8f70b4
/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
Packit 8f70b4
   standard headers, defines conflicting implementations of _Alignas
Packit 8f70b4
   and _Alignof that are no better than ours; override them.  */
Packit 8f70b4
#undef _Alignas
Packit 8f70b4
#undef _Alignof
Packit 8f70b4
Packit 8f70b4
/* GCC releases before GCC 4.9 had a bug in _Alignof.  See GCC bug 52023
Packit 8f70b4
   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.  */
Packit 8f70b4
#if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \
Packit 8f70b4
     || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9)))
Packit 8f70b4
# ifdef __cplusplus
Packit 8f70b4
#  if 201103 <= __cplusplus
Packit 8f70b4
#   define _Alignof(type) alignof (type)
Packit 8f70b4
#  else
Packit 8f70b4
   template <class __t> struct __alignof_helper { char __a; __t __b; };
Packit 8f70b4
#   define _Alignof(type) offsetof (__alignof_helper<type>, __b)
Packit 8f70b4
#  endif
Packit 8f70b4
# else
Packit 8f70b4
#  define _Alignof(type) offsetof (struct { char __a; type __b; }, __b)
Packit 8f70b4
# endif
Packit 8f70b4
#endif
Packit 8f70b4
#if ! (defined __cplusplus && 201103 <= __cplusplus)
Packit 8f70b4
# define alignof _Alignof
Packit 8f70b4
#endif
Packit 8f70b4
#define __alignof_is_defined 1
Packit 8f70b4
Packit 8f70b4
/* alignas (A), also known as _Alignas (A), aligns a variable or type
Packit 8f70b4
   to the alignment A, where A is an integer constant expression.  For
Packit 8f70b4
   example:
Packit 8f70b4
Packit 8f70b4
      int alignas (8) foo;
Packit 8f70b4
      struct s { int a; int alignas (8) bar; };
Packit 8f70b4
Packit 8f70b4
   aligns the address of FOO and the offset of BAR to be multiples of 8.
Packit 8f70b4
Packit 8f70b4
   A should be a power of two that is at least the type's alignment
Packit 8f70b4
   and at most the implementation's alignment limit.  This limit is
Packit 8f70b4
   2**28 on typical GNUish hosts, and 2**13 on MSVC.  To be portable
Packit 8f70b4
   to MSVC through at least version 10.0, A should be an integer
Packit 8f70b4
   constant, as MSVC does not support expressions such as 1 << 3.
Packit 8f70b4
   To be portable to Sun C 5.11, do not align auto variables to
Packit 8f70b4
   anything stricter than their default alignment.
Packit 8f70b4
Packit 8f70b4
   The following C11 requirements are not supported here:
Packit 8f70b4
Packit 8f70b4
     - If A is zero, alignas has no effect.
Packit 8f70b4
     - alignas can be used multiple times; the strictest one wins.
Packit 8f70b4
     - alignas (TYPE) is equivalent to alignas (alignof (TYPE)).
Packit 8f70b4
Packit 8f70b4
   */
Packit 8f70b4
Packit 8f70b4
#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
Packit 8f70b4
# if defined __cplusplus && 201103 <= __cplusplus
Packit 8f70b4
#  define _Alignas(a) alignas (a)
Packit 8f70b4
# elif ((defined __APPLE__ && defined __MACH__                  \
Packit 8f70b4
         ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__)                 \
Packit 8f70b4
         : __GNUC__)                                            \
Packit 8f70b4
        || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
Packit 8f70b4
        || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__)
Packit 8f70b4
#  define _Alignas(a) __attribute__ ((__aligned__ (a)))
Packit 8f70b4
# elif 1300 <= _MSC_VER
Packit 8f70b4
#  define _Alignas(a) __declspec (align (a))
Packit 8f70b4
# endif
Packit 8f70b4
#endif
Packit 8f70b4
#if ((defined _Alignas && ! (defined __cplusplus && 201103 <= __cplusplus)) \
Packit 8f70b4
     || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
Packit 8f70b4
# define alignas _Alignas
Packit 8f70b4
#endif
Packit 8f70b4
#if defined alignas || (defined __cplusplus && 201103 <= __cplusplus)
Packit 8f70b4
# define __alignas_is_defined 1
Packit 8f70b4
#endif
Packit 8f70b4
Packit 8f70b4
#endif /* _GL_STDALIGN_H */