/** @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 */
