(root)/
m4-1.4.19/
lib/
alignof.h
       1  /* Determine alignment of types.
       2     Copyright (C) 2003-2004, 2006, 2009-2021 Free Software Foundation, Inc.
       3  
       4     This program is free software; you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation; either version 3, or (at your option)
       7     any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program; if not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  #ifndef _ALIGNOF_H
      18  #define _ALIGNOF_H
      19  
      20  #include <stddef.h>
      21  
      22  /* alignof_slot (TYPE)
      23     Determine the alignment of a structure slot (field) of a given type,
      24     at compile time.  Note that the result depends on the ABI.
      25     This is the same as alignof (TYPE) and _Alignof (TYPE), defined in
      26     <stdalign.h> if __alignof_is_defined is 1.
      27     Note: The result cannot be used as a value for an 'enum' constant,
      28     due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc.  */
      29  #if defined __cplusplus
      30    template <class type> struct alignof_helper { char __slot1; type __slot2; };
      31  # define alignof_slot(type) offsetof (alignof_helper<type>, __slot2)
      32  #else
      33  # define alignof_slot(type) offsetof (struct { char __slot1; type __slot2; }, __slot2)
      34  #endif
      35  
      36  /* alignof_type (TYPE)
      37     Determine the good alignment of an object of the given type at compile time.
      38     Note that this is not necessarily the same as alignof_slot(type).
      39     For example, with GNU C on x86 platforms and with clang on Linux/x86:
      40     alignof_type(long long) = 8, but alignof_slot(long long) = 4.
      41     And alignof_type(double) = 8, but
      42     - when -malign-double is not specified:  alignof_slot(double) = 4,
      43     - when -malign-double is specified:      alignof_slot(double) = 8.
      44     Note: The result cannot be used as a value for an 'enum' constant,
      45     due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc.  */
      46  #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
      47  # define alignof_type __alignof__
      48  #else
      49  # define alignof_type alignof_slot
      50  #endif
      51  
      52  #endif /* _ALIGNOF_H */