forked from M-Labs/nac3
83 lines
2.6 KiB
C
83 lines
2.6 KiB
C
/* Provide support for both ANSI and non-ANSI environments. */
|
|
|
|
/* 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>
|
|
|
|
/* 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
|
|
|
|
#ifndef _LONG_DOUBLE
|
|
#define _LONG_DOUBLE long double
|
|
#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_ */
|