Update.
[platform/upstream/glibc.git] / misc / sys / cdefs.h
index f9dcce4..3174a85 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
+/* Copyright (C) 1992,93,94,95,96,97,98,99, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
    Boston, MA 02111-1307, USA.  */
 
 #ifndef        _SYS_CDEFS_H
-
 #define        _SYS_CDEFS_H    1
-#include <features.h>
+
+/* We are almost always included from features.h. */
+#ifndef _FEATURES_H
+# include <features.h>
+#endif
+
+/* The GNU libc does not support any K&R compilers or the traditional mode
+   of ISO C compilers anymore.  Check for some of the combinations not
+   anymore supported.  */
+#if defined __GNUC__ && !defined __STDC__
+# error "You need a ISO C conforming compiler to use the glibc headers"
+#endif
 
 /* Some user header file might have defined this before.  */
 #undef __P
+#undef __PMT
 
 #ifdef __GNUC__
 
-#define        __P(args)       args    /* GCC can always grok prototypes.  */
-#define        __DOTS          , ...
+/* GCC can always grok prototypes.  For C++ programs we add throw()
+   to help it optimize the function calls.  But this works only with
+   gcc 2.8.x and egcs.  */
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+#  define __THROW      throw ()
+# else
+#  define __THROW
+# endif
+# define __P(args)     args __THROW
+/* This macro will be used for functions which might take C++ callback
+   functions.  */
+# define __PMT(args)   args
 
 #else  /* Not GCC.  */
 
-#define        __inline                /* No inline functions.  */
-
-#if (defined (__STDC__) && __STDC__) || defined (__cplusplus)
-
-#define        __P(args)       args
-#define        __const         const
-#define        __signed        signed
-#define        __volatile      volatile
-#define        __DOTS          , ...
-
-#else  /* Not ANSI C or C++.  */
+# define __inline              /* No inline functions.  */
 
-#define        __P(args)       ()      /* No prototypes.  */
-#define        __const                 /* No ANSI C keywords.  */
-#define        __signed
-#define        __volatile
-#define        __DOTS
+# define __THROW
+# define __P(args)     args
+# define __PMT(args)   args
 
-#endif /* ANSI C or C++.  */
+# define __const       const
+# define __signed      signed
+# define __volatile    volatile
 
 #endif /* GCC.  */
 
 /* For these things, GCC behaves the ANSI way normally,
    and the non-ANSI way under -traditional.  */
 
-#if defined (__STDC__) && __STDC__
-
-#define        __CONCAT(x,y)   x ## y
-#define        __STRING(x)     #x
+#define __CONCAT(x,y)  x ## y
+#define __STRING(x)    #x
 
 /* This is not a typedef so `const __ptr_t' does the right thing.  */
 #define __ptr_t void *
 #define __long_double_t  long double
 
+
+/* C++ needs to know that types and declarations are C, not C++.  */
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS   }
 #else
+# define __BEGIN_DECLS
+# define __END_DECLS
+#endif
 
-#define        __CONCAT(x,y)   x/**/y
-#define        __STRING(x)     "x"
 
-#define __ptr_t char *
-#define __long_double_t  long double
+/* Support for bounded pointers.  */
+#ifndef __BOUNDED_POINTERS__
+# define __bounded     /* nothing */
+# define __unbounded   /* nothing */
+# define __ptrvalue    /* nothing */
+#endif
+
 
-/* The BSD header files use the ANSI keywords unmodified (this means that
-   old programs may lose if they use the new keywords as identifiers), but
-   those names are not available under -traditional.  We define them to
-   their __ versions, which are taken care of above.  */
-#ifdef __USE_BSD
-#define        const           __const
-#define        signed          __signed
-#define        volatile        __volatile
+/* __asm__ ("xyz") is used throughout the headers to rename functions
+   at the assembly language level.  This is wrapped by the __REDIRECT
+   macro, in order to support compilers that can do this some other
+   way.  When compilers don't support asm-names at all, we have to do
+   preprocessor tricks instead (which don't have exactly the right
+   semantics, but it's the best we can do).
+
+   Example:
+   int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
+
+#if defined __GNUC__ && __GNUC__ >= 2
+
+# define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
+# define __ASMNAME(cname)  __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
+# define __ASMNAME2(prefix, cname) __STRING (prefix) cname
+
+/*
+#elif __SOME_OTHER_COMPILER__
+
+# define __REDIRECT(name, proto, alias) name proto; \
+       _Pragma("let " #name " = " #alias)
+*/
+#endif
+
+/* GCC has various useful declarations that can be made with the
+   `__attribute__' syntax.  All of the ways we use this do fine if
+   they are omitted for compilers that don't understand it. */
+#if !defined __GNUC__ || __GNUC__ < 2
+# define __attribute__(xyz)    /* Ignore */
 #endif
 
-#endif /* __STDC__ */
+/* At some point during the gcc 2.96 development the `malloc' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.  */
+#if __GNUC_PREREQ (2,96)
+# define __attribute_malloc__ __attribute__ ((__malloc__))
+#else
+# define __attribute_malloc__ /* Ignore */
+#endif
 
+/* At some point during the gcc 2.96 development the `pure' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.  */
+#if __GNUC_PREREQ (2,96)
+# define __attribute_pure__ __attribute__ ((__pure__))
+#else
+# define __attribute_pure__ /* Ignore */
+#endif
 
-/* C++ needs to know that types and declarations are C, not C++.  */
-#ifdef __cplusplus
-#define        __BEGIN_DECLS   extern "C" {
-#define        __END_DECLS     }
+/* At some point during the gcc 2.8 development the `format_arg' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.  */
+#if __GNUC_PREREQ (2,8)
+# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
 #else
-#define        __BEGIN_DECLS
-#define        __END_DECLS
+# define __attribute_format_arg__(x) /* Ignore */
 #endif
 
-/* GCC2 has various useful declarations that can be made with the
-   `__attribute__' syntax.  All of the ways we use this do fine if
-   they are omitted for compilers that don't understand it.  */
-#if !defined (__GNUC__) || __GNUC__ < 2
-#define __attribute__(xyz)     /* Ignore.  */
+/* It is possible to compile containing GCC extensions even if GCC is
+   run in pedantic mode if the uses are carefully marked using the
+   `__extension__' keyword.  But this is not generally available before
+   version 2.8.  */
+#if !__GNUC_PREREQ (2,8)
+# define __extension__         /* Ignore */
 #endif
 
+/* __restrict is known in EGCS 1.2 and above. */
+#if !__GNUC_PREREQ (2,92)
+# define __restrict    /* Ignore */
+#endif
 
-/* For now no version of gcc knows the `restrict' keyword.  Define it
-   for now unconditionally to the empty string.  */
-#define __restrict
+/* ISO C99 also allows to declare arrays as non-overlapping.  The syntax is
+     array_name[restrict]
+   But gcc so far does not support this syntax.  We define a separate macro
+   for this which can be enabled if the underlying compiler supports it.  */
+#define __restrict_arr
 
 #endif  /* sys/cdefs.h */