| /* Provide support for both ANSI and non-ANSI environments. */ |
| |
| /* Some ANSI environments are "broken" in the sense that __STDC__ cannot be |
| relied upon to have it's intended meaning. Therefore we must use our own |
| concoction: _HAVE_STDC. Always use _HAVE_STDC instead of __STDC__ in newlib |
| sources! |
| |
| To get a strict ANSI C environment, define macro __STRICT_ANSI__. This will |
| "comment out" the non-ANSI parts of the ANSI header files (non-ANSI header |
| files aren't affected). */ |
| |
| #ifndef _ANSIDECL_H_ |
| #define _ANSIDECL_H_ |
| |
| #include <newlib.h> |
| #include <sys/config.h> |
| |
| /* First try to figure out whether we really are in an ANSI C environment. */ |
| /* FIXME: This probably needs some work. Perhaps sys/config.h can be |
| prevailed upon to give us a clue. */ |
| |
| #ifdef __STDC__ |
| #define _HAVE_STDC |
| #endif |
| |
| /* ISO C++. */ |
| |
| #ifdef __cplusplus |
| #if !(defined(_BEGIN_STD_C) && defined(_END_STD_C)) |
| #ifdef _HAVE_STD_CXX |
| #define _BEGIN_STD_C namespace std { extern "C" { |
| #define _END_STD_C } } |
| #else |
| #define _BEGIN_STD_C extern "C" { |
| #define _END_STD_C } |
| #endif |
| #if __GNUC_PREREQ (3, 3) |
| #define _NOTHROW __attribute__ ((__nothrow__)) |
| #else |
| #define _NOTHROW throw() |
| #endif |
| #endif |
| #else |
| #define _BEGIN_STD_C |
| #define _END_STD_C |
| #define _NOTHROW |
| #endif |
| |
| #ifdef _HAVE_STDC |
| #define _PTR void * |
| #define _AND , |
| #define _NOARGS void |
| #define _CONST const |
| #define _VOLATILE volatile |
| #define _SIGNED signed |
| #define _DOTS , ... |
| #define _VOID void |
| #ifdef __CYGWIN__ |
| #define _EXFUN_NOTHROW(name, proto) __cdecl name proto _NOTHROW |
| #define _EXFUN(name, proto) __cdecl name proto |
| #define _EXPARM(name, proto) (* __cdecl name) proto |
| #define _EXFNPTR(name, proto) (__cdecl * name) proto |
| #else |
| #define _EXFUN_NOTHROW(name, proto) name proto _NOTHROW |
| #define _EXFUN(name, proto) name proto |
| #define _EXPARM(name, proto) (* name) proto |
| #define _EXFNPTR(name, proto) (* name) proto |
| #endif |
| #define _DEFUN(name, arglist, args) name(args) |
| #define _DEFUN_VOID(name) name(_NOARGS) |
| #define _CAST_VOID (void) |
| #ifndef _LONG_DOUBLE |
| #define _LONG_DOUBLE long double |
| #endif |
| #ifndef _PARAMS |
| #define _PARAMS(paramlist) paramlist |
| #endif |
| #else |
| #define _PTR char * |
| #define _AND ; |
| #define _NOARGS |
| #define _CONST |
| #define _VOLATILE |
| #define _SIGNED |
| #define _DOTS |
| #define _VOID void |
| #define _EXFUN(name, proto) name() |
| #define _EXFUN_NOTHROW(name, proto) name() |
| #define _DEFUN(name, arglist, args) name arglist args; |
| #define _DEFUN_VOID(name) name() |
| #define _CAST_VOID |
| #define _LONG_DOUBLE double |
| #ifndef _PARAMS |
| #define _PARAMS(paramlist) () |
| #endif |
| #endif |
| |
| /* Support gcc's __attribute__ facility. */ |
| |
| #ifdef __GNUC__ |
| #define _ATTRIBUTE(attrs) __attribute__ (attrs) |
| #else |
| #define _ATTRIBUTE(attrs) |
| #endif |
| |
| /* The traditional meaning of 'extern inline' for GCC is not |
| to emit the function body unless the address is explicitly |
| taken. However this behaviour is changing to match the C99 |
| standard, which uses 'extern inline' to indicate that the |
| function body *must* be emitted. Likewise, a function declared |
| without either 'extern' or 'static' defaults to extern linkage |
| (C99 6.2.2p5), and the compiler may choose whether to use the |
| inline version or call the extern linkage version (6.7.4p6). |
| If we are using GCC, but do not have the new behaviour, we need |
| to use extern inline; if we are using a new GCC with the |
| C99-compatible behaviour, or a non-GCC compiler (which we will |
| have to hope is C99, since there is no other way to achieve the |
| effect of omitting the function if it isn't referenced) we use |
| 'static inline', which c99 defines to mean more-or-less the same |
| as the Gnu C 'extern inline'. */ |
| #if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__) |
| /* We're using GCC, but without the new C99-compatible behaviour. */ |
| #define _ELIDABLE_INLINE extern __inline__ _ATTRIBUTE ((__always_inline__)) |
| #else |
| /* We're using GCC in C99 mode, or an unknown compiler which |
| we just have to hope obeys the C99 semantics of inline. */ |
| #define _ELIDABLE_INLINE static __inline__ |
| #endif |
| |
| #if __GNUC_PREREQ (3, 1) |
| #define _NOINLINE __attribute__ ((__noinline__)) |
| #define _NOINLINE_STATIC _NOINLINE static |
| #else |
| /* On non-GNU compilers and GCC prior to version 3.1 the compiler can't be |
| trusted not to inline if it is static. */ |
| #define _NOINLINE |
| #define _NOINLINE_STATIC |
| #endif |
| |
| #endif /* _ANSIDECL_H_ */ |