| /** @file | |
| Common declarations and definitions for Standard C Library headers. | |
| This header consolidates definitions and declarations for compiler specific | |
| features in one place in order to assist in making the remainder of the | |
| library as compiler independent as possible. | |
| Certain macro and type definitions are required to be provided by several | |
| different headers. In order to avoid having multiple definitions, and the | |
| attendant risk of having the definitions get out of sync, they are defined in | |
| this header. | |
| Note that MdePkg/Include/Base.h is automatically included and will bring | |
| processor architecture specific definitions along with it. | |
| Throughout the library, the following macros are used instead of keywords so | |
| that the library can be easily tuned for different compilers. | |
| __inline Defined to the appropriate keyword or not defined. | |
| __func__ Defined to __FUNC__, __FUNCTION__, or NULL as appropriate. | |
| __restrict Defined to nothing for VC++ or to restrict for GCC and C99 compliant compilers. | |
| This file and its contents are inspired by the <sys/cdefs.h> files in Berkeley | |
| Unix. They have been re-implemented to be specific to the EFI environment. | |
| Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials are licensed and made available under | |
| the terms and conditions of the BSD License that accompanies this distribution. | |
| The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license. | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| Portions Copyright (c) 1991, 1993 | |
| The Regents of the University of California. All rights reserved. | |
| Portions of this code are derived from software contributed to Berkeley by | |
| Berkeley Software Design, Inc. | |
| Redistribution and use in source and binary forms, with or without | |
| modification, are permitted provided that the following conditions | |
| are met: | |
| 1. Redistributions of source code must retain the above copyright | |
| notice, this list of conditions and the following disclaimer. | |
| 2. Redistributions in binary form must reproduce the above copyright | |
| notice, this list of conditions and the following disclaimer in the | |
| documentation and/or other materials provided with the distribution. | |
| 3. Neither the name of the University nor the names of its contributors | |
| may be used to endorse or promote products derived from this software | |
| without specific prior written permission. | |
| THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
| FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| SUCH DAMAGE. | |
| **/ | |
| #ifndef _EFI_CDEFS_H | |
| #define _EFI_CDEFS_H | |
| /* | |
| * Macro to test if we're using a GNU C compiler of a specific vintage | |
| * or later, for e.g. features that appeared in a particular version | |
| * of GNU C. Usage: | |
| * | |
| * #if __GNUC_PREREQ__(major, minor) | |
| * ...cool feature... | |
| * #else | |
| * ...delete feature... | |
| * #endif | |
| */ | |
| #ifdef __GNUC__ | |
| #define __GNUC_PREREQ__(x, y) \ | |
| ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \ | |
| (__GNUC__ > (x))) | |
| #define DONT_USE_STRONG_WEAK_ALIAS 1 | |
| #else | |
| #define __GNUC_PREREQ__(x, y) 0 | |
| #endif | |
| #include <sys/featuretest.h> | |
| //#include <machine/_EfiCdefs.h> | |
| #ifdef __PE32__ | |
| #include <sys/_EfiCdefs_PE32.h> | |
| #else | |
| #include <sys/cdefs_aout.h> | |
| #endif | |
| /* NULL is defined by the automatic inclusion of Base.h by the build tools. */ | |
| #ifdef __GNUC__ | |
| #define _EFI_SIZE_T_ __SIZE_TYPE__ /* sizeof() */ | |
| #define _EFI_WCHAR_T __WCHAR_TYPE__ | |
| #define _EFI_WINT_T __WINT_TYPE__ | |
| //#define _EFI_WINT_MIN (0) | |
| //#define _EFI_WINT_MAX (0xFFFF) | |
| #define _EFI_PTRDIFF_T_ __PTRDIFF_TYPE__ /* ptr1 - ptr2 --- Must be same size as size_t */ | |
| #else | |
| #define _EFI_SIZE_T_ UINTN /* sizeof() */ | |
| #define _EFI_WCHAR_T UINT16 | |
| #define _EFI_WINT_T INT32 | |
| //#define _EFI_WINT_MIN (-2147483647) /* wint_t */ | |
| //#define _EFI_WINT_MAX ( 2147483647) /* wint_t */ | |
| #define _EFI_PTRDIFF_T_ INTN /* ptr1 - ptr2 --- Must be same size as size_t */ | |
| #endif /* __GNUC__ */ | |
| #define _EFI_CLOCK_T UINT64 | |
| #define _EFI_TIME_T INT32 | |
| #if defined(__cplusplus) | |
| #define __BEGIN_DECLS extern "C" { | |
| #define __END_DECLS } | |
| #define __static_cast(x,y) static_cast<x>(y) | |
| #else | |
| #define __BEGIN_DECLS | |
| #define __END_DECLS | |
| #define __static_cast(x,y) (x)y | |
| #endif | |
| /* | |
| * The __CONCAT macro is used to concatenate parts of symbol names, e.g. | |
| * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. | |
| * The __CONCAT macro is a bit tricky -- make sure you don't put spaces | |
| * in between its arguments. __CONCAT can also concatenate double-quoted | |
| * strings produced by the __STRING macro, but this only works with ANSI C. | |
| */ | |
| #define ___STRING(x) __STRING(x) | |
| #define ___CONCAT(x,y) __CONCAT(x,y) | |
| #define __CONCAT(x,y) x ## y | |
| #define __STRING(x) #x | |
| #define __const CONST | |
| #define __signed signed | |
| #define __volatile volatile | |
| #if __STDC__ || defined(__cplusplus) | |
| #if defined(__cplusplus) | |
| #define __inline inline /* convert to C++ keyword */ | |
| #else | |
| #if defined(_MSC_VER) || (!defined(__GNUC__) && !defined(__lint__)) | |
| #define __inline /* delete C99 keyword */ | |
| #endif /* !__GNUC__ && !__lint__ */ | |
| #endif /* !__cplusplus */ | |
| #endif /* !(__STDC__ || __cplusplus) */ | |
| /* Used in NetBSD for internal auditing of the source tree. */ | |
| #define __aconst | |
| /* | |
| * The following macro is used to remove const cast-away warnings | |
| * from gcc -Wcast-qual; it should be used with caution because it | |
| * can hide valid errors; in particular most valid uses are in | |
| * situations where the API requires it, not to cast away string | |
| * constants. We don't use *intptr_t on purpose here and we are | |
| * explicit about unsigned long so that we don't have additional | |
| * dependencies. | |
| */ | |
| #define __UNCONST(a) ((void *)(a)) | |
| //#define __UNCONST(a) ((void *)(PHYSICAL_ADDRESS)(const void *)(a)) | |
| /* | |
| * The following macro is used to remove the volatile cast-away warnings | |
| * from gcc -Wcast-qual; as above it should be used with caution | |
| * because it can hide valid errors or warnings. Valid uses include | |
| * making it possible to pass a volatile pointer to memset(). | |
| * For the same reasons as above, we use unsigned long and not intptr_t. | |
| */ | |
| #define __UNVOLATILE(a) ((void *)(PHYSICAL_ADDRESS)(volatile void *)(a)) | |
| /* | |
| * GCC2 provides __extension__ to suppress warnings for various GNU C | |
| * language extensions under "-ansi -pedantic". | |
| */ | |
| #if !__GNUC_PREREQ__(2, 0) | |
| #define __extension__ /* delete __extension__ if non-gcc or gcc1 */ | |
| #endif | |
| /* | |
| * GCC1 and some versions of GCC2 declare dead (non-returning) and | |
| * pure (no side effects) functions using "volatile" and "const"; | |
| * unfortunately, these then cause warnings under "-ansi -pedantic". | |
| * GCC2 uses a new, peculiar __attribute__((attrs)) style. All of | |
| * these work for GNU C++ (modulo a slight glitch in the C++ grammar | |
| * in the distribution version of 2.5.5). | |
| */ | |
| #if !__GNUC_PREREQ__(2, 5) | |
| #define __attribute__(x) /* delete __attribute__ if non-gcc or gcc1 */ | |
| #if defined(__GNUC__) && !defined(__STRICT_ANSI__) | |
| #define __dead __volatile | |
| #define __pure __const | |
| #endif | |
| #endif | |
| /* Delete pseudo-keywords wherever they are not available or needed. */ | |
| #ifndef __dead | |
| #define __dead | |
| #define __pure | |
| #endif | |
| #if __GNUC_PREREQ__(2, 7) | |
| #define __unused __attribute__((__unused__)) | |
| #define __noreturn __attribute__((__noreturn__)) | |
| #else | |
| #define __unused /* delete */ | |
| #define __noreturn /* delete */ | |
| #endif | |
| #if __GNUC_PREREQ__(3, 1) | |
| #define __used __attribute__((__used__)) | |
| #else | |
| #define __used __unused | |
| #endif | |
| #if __GNUC_PREREQ__(2, 7) | |
| #define __packed __attribute__((__packed__)) | |
| #define __aligned(x) __attribute__((__aligned__(x))) | |
| #define __section(x) __attribute__((__section__(x))) | |
| #elif defined(__lint__) | |
| #define __packed /* delete */ | |
| #define __aligned(x) /* delete */ | |
| #define __section(x) /* delete */ | |
| #else | |
| #define __packed error: no __packed for this compiler | |
| #define __aligned(x) error: no __aligned for this compiler | |
| #define __section(x) error: no __section for this compiler | |
| #endif | |
| /* | |
| * C99 defines the restrict type qualifier keyword, which was made available | |
| * in GCC 2.92. | |
| */ | |
| #if __STDC_VERSION__ >= 199901L | |
| #define __restrict restrict | |
| #else | |
| #if defined(_MSC_VER) || !__GNUC_PREREQ__(2, 92) | |
| #define __restrict /* delete __restrict when not supported */ | |
| #endif | |
| #endif | |
| /* | |
| * C99 defines __func__ predefined identifier, which was made available | |
| * in GCC 2.95. | |
| */ | |
| #if !(__STDC_VERSION__ >= 199901L) | |
| #if defined(_MSC_VER) | |
| #define __func__ __FUNCTION__ /* Use the MS-specific predefined macro */ | |
| #elif __GNUC_PREREQ__(2, 6) | |
| #define __func__ __PRETTY_FUNCTION__ | |
| #elif __GNUC_PREREQ__(2, 4) | |
| #define __func__ __FUNCTION__ | |
| #else | |
| #define __func__ "" | |
| #endif | |
| #endif /* !(__STDC_VERSION__ >= 199901L) */ | |
| #define __RENAME(x) | |
| /* | |
| * A barrier to stop the optimizer from moving code or assume live | |
| * register values. This is gcc specific, the version is more or less | |
| * arbitrary, might work with older compilers. | |
| */ | |
| #if __GNUC_PREREQ__(2, 95) | |
| #define __insn_barrier() __asm __volatile("":::"memory") | |
| #else | |
| #define __insn_barrier() /* */ | |
| #endif | |
| /* | |
| * GNU C version 2.96 adds explicit branch prediction so that | |
| * the CPU back-end can hint the processor and also so that | |
| * code blocks can be reordered such that the predicted path | |
| * sees a more linear flow, thus improving cache behavior, etc. | |
| * | |
| * The following two macros provide us with a way to use this | |
| * compiler feature. Use __predict_true() if you expect the expression | |
| * to evaluate to true, and __predict_false() if you expect the | |
| * expression to evaluate to false. | |
| * | |
| * A few notes about usage: | |
| * | |
| * * Generally, __predict_false() error condition checks (unless | |
| * you have some _strong_ reason to do otherwise, in which case | |
| * document it), and/or __predict_true() `no-error' condition | |
| * checks, assuming you want to optimize for the no-error case. | |
| * | |
| * * Other than that, if you don't know the likelihood of a test | |
| * succeeding from empirical or other `hard' evidence, don't | |
| * make predictions. | |
| * | |
| * * These are meant to be used in places that are run `a lot'. | |
| * It is wasteful to make predictions in code that is run | |
| * seldomly (e.g. at subsystem initialization time) as the | |
| * basic block reordering that this affects can often generate | |
| * larger code. | |
| */ | |
| #if __GNUC_PREREQ__(2, 96) | |
| #define __predict_true(exp) __builtin_expect((exp) != 0, 1) | |
| #define __predict_false(exp) __builtin_expect((exp) != 0, 0) | |
| #else | |
| #define __predict_true(exp) (exp) | |
| #define __predict_false(exp) (exp) | |
| #endif | |
| /* find least significant bit that is set */ | |
| #define __LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask)) | |
| #define __SHIFTOUT(__x, __mask) (((__x) & (__mask)) / __LOWEST_SET_BIT(__mask)) | |
| #define __SHIFTIN(__x, __mask) ((__x) * __LOWEST_SET_BIT(__mask)) | |
| #define __SHIFTOUT_MASK(__mask) __SHIFTOUT((__mask), (__mask)) | |
| #if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ | |
| /* VC++, by default, defines wchar_t as an intrinsic type, equivalent to | |
| unsigned short. This conflicts which Standard C Library | |
| implementations which try to define wchar_t. | |
| Make sure that this behavior has been turned off by using | |
| /Zc:wchar_t- on the command line. | |
| */ | |
| #ifdef _NATIVE_WCHAR_T_DEFINED | |
| #error You must specify /Zc:wchar_t- to the compiler to turn off intrinsic wchar_t. | |
| #endif | |
| /* Get rid of pre-defined macros that are misleading in this environment. */ | |
| #undef _WIN32 | |
| #undef _WIN64 | |
| // Keep compiler quiet about casting from smaller to larger types | |
| #pragma warning ( disable : 4306 ) | |
| #define __STDC__ 1 | |
| #define __STDC_VERSION__ 199409L | |
| #define __STDC_HOSTED__ 1 | |
| #endif /* defined(_MSC_VER) */ | |
| extern int _fltused; // VC++ requires this if you use floating point. KEEP for all compilers. | |
| #define _Bool BOOLEAN | |
| #define _DIAGASSERT(e) | |
| // Types used to replace long so that it will have constant length regardless of compiler. | |
| typedef INT32 LONG32; | |
| typedef UINT32 ULONG32; | |
| typedef INT64 LONG64; | |
| typedef UINT64 ULONG64; | |
| typedef INTN EFI_LONG_T; | |
| typedef UINTN EFI_ULONG_T; | |
| /* These types reflect the compiler's size for long */ | |
| #if defined(__GNUC__) | |
| #if __GNUC_PREREQ__(4,4) | |
| /* GCC 4.4 or later */ | |
| typedef INTN LONGN; | |
| typedef UINTN ULONGN; | |
| #else | |
| /* minGW gcc variant */ | |
| typedef INT32 LONGN; | |
| typedef UINT32 ULONGN; | |
| #endif /* __GNUC_PREREQ__(4,4) */ | |
| #else /* NOT GCC */ | |
| /* Microsoft or Intel compilers */ | |
| typedef INT32 LONGN; | |
| typedef UINT32 ULONGN; | |
| #endif /* defined(__GNUC__) */ | |
| #endif /* _EFI_CDEFS_H */ |