Home | History | Annotate | Download | only in sys
      1 /** @file
      2     Common declarations and definitions for Standard C Library headers.
      3 
      4     This header consolidates definitions and declarations for compiler specific
      5     features in one place in order to assist in making the remainder of the
      6     library as compiler independent as possible.
      7 
      8     Certain macro and type definitions are required to be provided by several
      9     different headers.  In order to avoid having multiple definitions, and the
     10     attendant risk of having the definitions get out of sync, they are defined in
     11     this header.
     12 
     13     Note that MdePkg/Include/Base.h is automatically included and will bring
     14     processor architecture specific definitions along with it.
     15 
     16     Throughout the library, the following macros are used instead of keywords so
     17     that the library can be easily tuned for different compilers.
     18     __inline    Defined to the appropriate keyword or not defined.
     19     __func__    Defined to __FUNC__, __FUNCTION__, or NULL as appropriate.
     20     __restrict  Defined to nothing for VC++ or to restrict for GCC and C99 compliant compilers.
     21 
     22     This file and its contents are inspired by the <sys/cdefs.h> files in Berkeley
     23     Unix.  They have been re-implemented to be specific to the EFI environment.
     24 
     25     Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
     26     This program and the accompanying materials are licensed and made available under
     27     the terms and conditions of the BSD License that accompanies this distribution.
     28     The full text of the license may be found at
     29     http://opensource.org/licenses/bsd-license.
     30 
     31     THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     32     WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     33 
     34     Portions Copyright (c) 1991, 1993
     35     The Regents of the University of California.  All rights reserved.
     36 
     37     Portions of this code are derived from software contributed to Berkeley by
     38     Berkeley Software Design, Inc.
     39     Redistribution and use in source and binary forms, with or without
     40     modification, are permitted provided that the following conditions
     41     are met:
     42       1. Redistributions of source code must retain the above copyright
     43         notice, this list of conditions and the following disclaimer.
     44       2. Redistributions in binary form must reproduce the above copyright
     45         notice, this list of conditions and the following disclaimer in the
     46         documentation and/or other materials provided with the distribution.
     47       3. Neither the name of the University nor the names of its contributors
     48         may be used to endorse or promote products derived from this software
     49         without specific prior written permission.
     50 
     51     THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     52     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     53     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     54     ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     55     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     56     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     57     OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     58     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     59     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     60     OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     61     SUCH DAMAGE.
     62 **/
     63 #ifndef _EFI_CDEFS_H
     64 #define _EFI_CDEFS_H
     65 
     66 /*
     67 * Macro to test if we're using a GNU C compiler of a specific vintage
     68 * or later, for e.g. features that appeared in a particular version
     69 * of GNU C.  Usage:
     70 *
     71 *  #if __GNUC_PREREQ__(major, minor)
     72 *  ...cool feature...
     73 *  #else
     74 *  ...delete feature...
     75 *  #endif
     76 */
     77 #ifdef __GNUC__
     78 #define __GNUC_PREREQ__(x, y)           \
     79 ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) ||      \
     80  (__GNUC__ > (x)))
     81 
     82 #define DONT_USE_STRONG_WEAK_ALIAS  1
     83 
     84 #else
     85 #define __GNUC_PREREQ__(x, y) 0
     86 #endif
     87 
     88 #include  <sys/featuretest.h>
     89 //#include <machine/_EfiCdefs.h>
     90 #ifdef __PE32__
     91 #include <sys/_EfiCdefs_PE32.h>
     92 #else
     93 #include <sys/cdefs_aout.h>
     94 #endif
     95 
     96 /* NULL is defined by the automatic inclusion of Base.h by the build tools. */
     97 
     98 #ifdef __GNUC__
     99   #define _EFI_SIZE_T_      __SIZE_TYPE__     /* sizeof() */
    100   #define _EFI_WCHAR_T      __WCHAR_TYPE__
    101   #define _EFI_WINT_T       __WINT_TYPE__
    102   //#define _EFI_WINT_MIN     (0)
    103   //#define _EFI_WINT_MAX     (0xFFFF)
    104   #define _EFI_PTRDIFF_T_   __PTRDIFF_TYPE__  /* ptr1 - ptr2 --- Must be same size as size_t */
    105 
    106 #else
    107 #define _EFI_SIZE_T_      UINTN       /* sizeof() */
    108 #define _EFI_WCHAR_T      UINT16
    109 #define _EFI_WINT_T       INT32
    110   //#define _EFI_WINT_MIN     (-2147483647)       /* wint_t   */
    111   //#define _EFI_WINT_MAX     ( 2147483647)       /* wint_t   */
    112   #define _EFI_PTRDIFF_T_   INTN       /* ptr1 - ptr2 --- Must be same size as size_t */
    113 #endif  /* __GNUC__ */
    114 
    115 #define _EFI_CLOCK_T      UINT64
    116 #define _EFI_TIME_T       INT32
    117 
    118 #if defined(__cplusplus)
    119 #define __BEGIN_DECLS   extern "C" {
    120 #define __END_DECLS   }
    121 #define __static_cast(x,y)  static_cast<x>(y)
    122 #else
    123 #define __BEGIN_DECLS
    124 #define __END_DECLS
    125 #define __static_cast(x,y)  (x)y
    126 #endif
    127 
    128   /*
    129   * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
    130   * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
    131   * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
    132   * in between its arguments.  __CONCAT can also concatenate double-quoted
    133   * strings produced by the __STRING macro, but this only works with ANSI C.
    134   */
    135 
    136 #define ___STRING(x)  __STRING(x)
    137 #define ___CONCAT(x,y)  __CONCAT(x,y)
    138 #define __CONCAT(x,y) x ## y
    139 #define __STRING(x) #x
    140 
    141 #define __const     CONST
    142 #define __signed    signed
    143 #define __volatile  volatile
    144 
    145 #if __STDC__ || defined(__cplusplus)
    146   #if defined(__cplusplus)
    147     #define __inline  inline    /* convert to C++ keyword */
    148   #else
    149     #if defined(_MSC_VER) || (!defined(__GNUC__) && !defined(__lint__))
    150       #define __inline      /* delete C99 keyword */
    151     #endif /* !__GNUC__  && !__lint__ */
    152   #endif /* !__cplusplus */
    153 #endif  /* !(__STDC__ || __cplusplus) */
    154 
    155 /* Used in NetBSD for internal auditing of the source tree. */
    156 #define __aconst
    157 
    158   /*
    159   * The following macro is used to remove const cast-away warnings
    160   * from gcc -Wcast-qual; it should be used with caution because it
    161   * can hide valid errors; in particular most valid uses are in
    162   * situations where the API requires it, not to cast away string
    163   * constants. We don't use *intptr_t on purpose here and we are
    164   * explicit about unsigned long so that we don't have additional
    165   * dependencies.
    166   */
    167 #define __UNCONST(a)  ((void *)(a))
    168 //#define __UNCONST(a)  ((void *)(PHYSICAL_ADDRESS)(const void *)(a))
    169 
    170   /*
    171   * The following macro is used to remove the volatile cast-away warnings
    172   * from gcc -Wcast-qual; as above it should be used with caution
    173   * because it can hide valid errors or warnings.  Valid uses include
    174   * making it possible to pass a volatile pointer to memset().
    175   * For the same reasons as above, we use unsigned long and not intptr_t.
    176   */
    177 #define __UNVOLATILE(a) ((void *)(PHYSICAL_ADDRESS)(volatile void *)(a))
    178 
    179   /*
    180   * GCC2 provides __extension__ to suppress warnings for various GNU C
    181   * language extensions under "-ansi -pedantic".
    182   */
    183 #if !__GNUC_PREREQ__(2, 0)
    184 #define __extension__   /* delete __extension__ if non-gcc or gcc1 */
    185 #endif
    186 
    187   /*
    188   * GCC1 and some versions of GCC2 declare dead (non-returning) and
    189   * pure (no side effects) functions using "volatile" and "const";
    190   * unfortunately, these then cause warnings under "-ansi -pedantic".
    191   * GCC2 uses a new, peculiar __attribute__((attrs)) style.  All of
    192   * these work for GNU C++ (modulo a slight glitch in the C++ grammar
    193   * in the distribution version of 2.5.5).
    194   */
    195 #if !__GNUC_PREREQ__(2, 5)
    196 #define __attribute__(x)  /* delete __attribute__ if non-gcc or gcc1 */
    197 #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
    198 #define __dead    __volatile
    199 #define __pure    __const
    200 #endif
    201 #endif
    202 
    203   /* Delete pseudo-keywords wherever they are not available or needed. */
    204 #ifndef __dead
    205 #define __dead
    206 #define __pure
    207 #endif
    208 
    209 #if __GNUC_PREREQ__(2, 7)
    210 #define __unused  __attribute__((__unused__))
    211 #define __noreturn  __attribute__((__noreturn__))
    212 #else
    213 #define __unused  /* delete */
    214 #define __noreturn  /* delete */
    215 #endif
    216 
    217 #if __GNUC_PREREQ__(3, 1)
    218 #define __used    __attribute__((__used__))
    219 #else
    220 #define __used    __unused
    221 #endif
    222 
    223 #if __GNUC_PREREQ__(2, 7)
    224 #define __packed  __attribute__((__packed__))
    225 #define __aligned(x)  __attribute__((__aligned__(x)))
    226 #define __section(x)  __attribute__((__section__(x)))
    227 #elif defined(__lint__)
    228 #define __packed  /* delete */
    229 #define __aligned(x)  /* delete */
    230 #define __section(x)  /* delete */
    231 #else
    232 #define __packed  error: no __packed for this compiler
    233 #define __aligned(x)  error: no __aligned for this compiler
    234 #define __section(x)  error: no __section for this compiler
    235 #endif
    236 
    237 /*
    238 * C99 defines the restrict type qualifier keyword, which was made available
    239 * in GCC 2.92.
    240 */
    241 #if __STDC_VERSION__ >= 199901L
    242   #define __restrict  restrict
    243 #else
    244   #if defined(_MSC_VER) || !__GNUC_PREREQ__(2, 92)
    245     #define __restrict  /* delete __restrict when not supported */
    246   #endif
    247 #endif
    248 
    249 /*
    250 * C99 defines __func__ predefined identifier, which was made available
    251 * in GCC 2.95.
    252 */
    253 #if !(__STDC_VERSION__ >= 199901L)
    254   #if defined(_MSC_VER)
    255     #define __func__    __FUNCTION__  /* Use the MS-specific predefined macro */
    256   #elif __GNUC_PREREQ__(2, 6)
    257     #define __func__  __PRETTY_FUNCTION__
    258   #elif __GNUC_PREREQ__(2, 4)
    259     #define __func__  __FUNCTION__
    260   #else
    261     #define __func__  ""
    262   #endif
    263 #endif /* !(__STDC_VERSION__ >= 199901L) */
    264 
    265 #define __RENAME(x)
    266 
    267   /*
    268   * A barrier to stop the optimizer from moving code or assume live
    269   * register values. This is gcc specific, the version is more or less
    270   * arbitrary, might work with older compilers.
    271   */
    272 #if __GNUC_PREREQ__(2, 95)
    273 #define __insn_barrier()  __asm __volatile("":::"memory")
    274 #else
    275 #define __insn_barrier()  /* */
    276 #endif
    277 
    278   /*
    279   * GNU C version 2.96 adds explicit branch prediction so that
    280   * the CPU back-end can hint the processor and also so that
    281   * code blocks can be reordered such that the predicted path
    282   * sees a more linear flow, thus improving cache behavior, etc.
    283   *
    284   * The following two macros provide us with a way to use this
    285   * compiler feature.  Use __predict_true() if you expect the expression
    286   * to evaluate to true, and __predict_false() if you expect the
    287   * expression to evaluate to false.
    288   *
    289   * A few notes about usage:
    290   *
    291   *  * Generally, __predict_false() error condition checks (unless
    292   *    you have some _strong_ reason to do otherwise, in which case
    293   *    document it), and/or __predict_true() `no-error' condition
    294   *    checks, assuming you want to optimize for the no-error case.
    295   *
    296   *  * Other than that, if you don't know the likelihood of a test
    297   *    succeeding from empirical or other `hard' evidence, don't
    298   *    make predictions.
    299   *
    300   *  * These are meant to be used in places that are run `a lot'.
    301   *    It is wasteful to make predictions in code that is run
    302   *    seldomly (e.g. at subsystem initialization time) as the
    303   *    basic block reordering that this affects can often generate
    304   *    larger code.
    305   */
    306 #if __GNUC_PREREQ__(2, 96)
    307 #define __predict_true(exp) __builtin_expect((exp) != 0, 1)
    308 #define __predict_false(exp)  __builtin_expect((exp) != 0, 0)
    309 #else
    310 #define __predict_true(exp) (exp)
    311 #define __predict_false(exp)  (exp)
    312 #endif
    313 
    314 /* find least significant bit that is set */
    315 #define __LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask))
    316 
    317 #define __SHIFTOUT(__x, __mask) (((__x) & (__mask)) / __LOWEST_SET_BIT(__mask))
    318 #define __SHIFTIN(__x, __mask) ((__x) * __LOWEST_SET_BIT(__mask))
    319 #define __SHIFTOUT_MASK(__mask) __SHIFTOUT((__mask), (__mask))
    320 
    321 #if defined(_MSC_VER)           /* Handle Microsoft VC++ compiler specifics. */
    322 
    323     /*  VC++, by default, defines wchar_t as an intrinsic type, equivalent to
    324     unsigned short.  This conflicts which Standard C Library
    325     implementations which try to define wchar_t.
    326     Make sure that this behavior has been turned off by using
    327     /Zc:wchar_t- on the command line.
    328     */
    329   #ifdef _NATIVE_WCHAR_T_DEFINED
    330   #error You must specify /Zc:wchar_t- to the compiler to turn off intrinsic wchar_t.
    331   #endif
    332 
    333   /* Get rid of pre-defined macros that are misleading in this environment. */
    334   #undef  _WIN32
    335   #undef  _WIN64
    336 
    337   // Keep compiler quiet about casting from smaller to larger types
    338   #pragma warning ( disable : 4306 )
    339 
    340   #define __STDC__            1
    341   #define __STDC_VERSION__    199409L
    342   #define __STDC_HOSTED__     1
    343 
    344 #endif  /* defined(_MSC_VER) */
    345 extern int _fltused;    // VC++ requires this if you use floating point.  KEEP for all compilers.
    346 
    347 #define _Bool BOOLEAN
    348 #define _DIAGASSERT(e)
    349 
    350 // Types used to replace long so that it will have constant length regardless of compiler.
    351 typedef  INT32   LONG32;
    352 typedef UINT32  ULONG32;
    353 typedef  INT64   LONG64;
    354 typedef UINT64  ULONG64;
    355 
    356 typedef   INTN   EFI_LONG_T;
    357 typedef  UINTN   EFI_ULONG_T;
    358 
    359 /* These types reflect the compiler's size for long */
    360 #if defined(__GNUC__)
    361   #if __GNUC_PREREQ__(4,4)
    362     /* GCC 4.4 or later */
    363     typedef   INTN    LONGN;
    364     typedef  UINTN    ULONGN;
    365   #else
    366     /* minGW gcc variant */
    367     typedef   INT32   LONGN;
    368     typedef  UINT32   ULONGN;
    369   #endif  /* __GNUC_PREREQ__(4,4) */
    370 #else   /* NOT GCC */
    371   /* Microsoft or Intel compilers */
    372   typedef   INT32   LONGN;
    373   typedef  UINT32   ULONGN;
    374 #endif  /* defined(__GNUC__) */
    375 
    376 #endif  /* _EFI_CDEFS_H */
    377