111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*	$NetBSD: cdefs.h,v 1.58 2004/12/11 05:59:00 christos Exp $	*/
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1991, 1993
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	The Regents of the University of California.  All rights reserved.
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This code is derived from software contributed to Berkeley by
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Berkeley Software Design, Inc.
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Redistribution and use in source and binary forms, with or without
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modification, are permitted provided that the following conditions
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * are met:
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1. Redistributions of source code must retain the above copyright
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer.
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 2. Redistributions in binary form must reproduce the above copyright
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer in the
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    documentation and/or other materials provided with the distribution.
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 3. Neither the name of the University nor the names of its contributors
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    may be used to endorse or promote products derived from this software
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    without specific prior written permission.
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * SUCH DAMAGE.
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	@(#)cdefs.h	8.8 (Berkeley) 1/9/95
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef	_SYS_CDEFS_H_
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_SYS_CDEFS_H_
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Testing against Clang-specific extensions.
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __has_extension
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __has_extension         __has_feature
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __has_feature
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __has_feature(x)        0
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __has_include
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __has_include(x)        0
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __has_builtin
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __has_builtin(x)        0
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Macro to test if we're using a GNU C compiler of a specific vintage
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or later, for e.g. features that appeared in a particular version
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * of GNU C.  Usage:
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	#if __GNUC_PREREQ(major, minor)
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	...cool feature...
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	#else
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	...delete feature...
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	#endif
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __GNUC__
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__GNUC_PREREQ(x, y)						\
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) ||			\
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 (__GNUC__ > (x)))
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__GNUC_PREREQ(x, y)	0
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/cdefs_elf.h>
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__cplusplus)
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__BEGIN_DECLS		extern "C" {
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__END_DECLS		}
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__static_cast(x,y)	static_cast<x>(y)
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__BEGIN_DECLS
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__END_DECLS
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__static_cast(x,y)	(x)y
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in between its arguments.  __CONCAT can also concatenate double-quoted
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * strings produced by the __STRING macro, but this only works with ANSI C.
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	___STRING(x)	__STRING(x)
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	___CONCAT(x,y)	__CONCAT(x,y)
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__STDC__) || defined(__cplusplus)
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__P(protos)	protos		/* full-blown ANSI C */
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__CONCAT(x,y)	x ## y
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__STRING(x)	#x
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__const		const		/* define reserved names to standard */
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__signed	signed
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__volatile	volatile
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__cplusplus)
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__inline	inline		/* convert to C++ keyword */
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(__GNUC__) && !defined(__lint__)
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__inline			/* delete GCC keyword */
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* !__GNUC__  && !__lint__ */
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* !__cplusplus */
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else	/* !(__STDC__ || __cplusplus) */
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__P(protos)	()		/* traditional C preprocessor */
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__CONCAT(x,y)	x/**/y
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__STRING(x)	"x"
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __GNUC__
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__const				/* delete pseudo-ANSI C keywords */
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__inline
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__signed
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__volatile
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif	/* !__GNUC__ */
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * In non-ANSI C environments, new programs will want ANSI-only C keywords
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * deleted from the program and old programs will want them left alone.
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Programs using the ANSI C keywords const, inline etc. as normal
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * identifiers should define -DNO_ANSI_KEYWORDS.
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef	NO_ANSI_KEYWORDS
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	const		__const		/* convert ANSI C keywords */
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	inline		__inline
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	signed		__signed
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	volatile	__volatile
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* !NO_ANSI_KEYWORDS */
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif	/* !(__STDC__ || __cplusplus) */
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Used for internal auditing of the NetBSD source tree.
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __AUDIT__
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__aconst	__const
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__aconst
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The following macro is used to remove const cast-away warnings
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * from gcc -Wcast-qual; it should be used with caution because it
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * can hide valid errors; in particular most valid uses are in
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * situations where the API requires it, not to cast away string
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * constants. We don't use *intptr_t on purpose here and we are
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * explicit about unsigned long so that we don't have additional
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * dependencies.
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __UNCONST(a)	((void *)(unsigned long)(const void *)(a))
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * GCC2 provides __extension__ to suppress warnings for various GNU C
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * language extensions under "-ansi -pedantic".
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !__GNUC_PREREQ(2, 0)
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__extension__		/* delete __extension__ if non-gcc or gcc1 */
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * GCC1 and some versions of GCC2 declare dead (non-returning) and
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * pure (no side effects) functions using "volatile" and "const";
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * unfortunately, these then cause warnings under "-ansi -pedantic".
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * GCC2 uses a new, peculiar __attribute__((attrs)) style.  All of
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * these work for GNU C++ (modulo a slight glitch in the C++ grammar
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in the distribution version of 2.5.5).
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !__GNUC_PREREQ(2, 5)
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__attribute__(x)	/* delete __attribute__ if non-gcc or gcc1 */
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__dead		__volatile
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__pure		__const
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* Delete pseudo-keywords wherever they are not available or needed. */
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __dead
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__dead
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__pure
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(2, 7)
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__unused	__attribute__((__unused__))
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__unused	/* delete */
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __pure2 __attribute__((__const__)) /* Android-added: used by FreeBSD libm */
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(3, 1)
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__used		__attribute__((__used__))
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__used		/* delete */
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(2, 7)
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__packed	__attribute__((__packed__))
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__aligned(x)	__attribute__((__aligned__(x)))
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__section(x)	__attribute__((__section__(x)))
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined(__lint__)
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__packed	/* delete */
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__aligned(x)	/* delete */
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__section(x)	/* delete */
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__packed	error: no __packed for this compiler
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__aligned(x)	error: no __aligned for this compiler
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__section(x)	error: no __section for this compiler
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !__GNUC_PREREQ(2, 8)
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__extension__
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(2, 8)
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __statement(x)	__extension__(x)
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined(lint)
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __statement(x)	(0)
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __statement(x)	(x)
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __nonnull(args) __attribute__((__nonnull__ args))
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __printflike(x, y) __attribute__((__format__(printf, x, y))) __nonnull((x))
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __scanflike(x, y) __attribute__((__format__(scanf, x, y))) __nonnull((x))
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * C99 defines the restrict type qualifier keyword, which was made available
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in GCC 2.92.
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__STDC__VERSION__) && __STDC_VERSION__ >= 199901L
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__restrict	restrict
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !__GNUC_PREREQ(2, 92)
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__restrict	/* delete __restrict when not supported */
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * C99 defines __func__ predefined identifier, which was made available
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in GCC 2.95.
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(__STDC_VERSION__) || !(__STDC_VERSION__ >= 199901L)
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(2, 6)
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__func__	__PRETTY_FUNCTION__
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif __GNUC_PREREQ(2, 4)
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__func__	__FUNCTION__
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__func__	""
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* !(__STDC_VERSION__ >= 199901L) */
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(_KERNEL)
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(NO_KERNEL_RCSIDS)
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef __KERNEL_RCSID
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__KERNEL_RCSID(_n, _s)		/* nothing */
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* NO_KERNEL_RCSIDS */
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _KERNEL */
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(_STANDALONE) && !defined(_KERNEL)
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __GNUC__
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__RENAME(x)	___RENAME(x)
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __lint__
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__RENAME(x)	__symbolrename(x)
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#error "No function renaming possible"
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* __lint__ */
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* __GNUC__ */
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else /* _STANDALONE || _KERNEL */
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__RENAME(x)	no renaming in kernel or standalone environment
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * A barrier to stop the optimizer from moving code or assume live
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * register values. This is gcc specific, the version is more or less
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * arbitrary, might work with older compilers.
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(2, 95)
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__insn_barrier()	__asm __volatile("":::"memory")
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__insn_barrier()	/* */
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * GNU C version 2.96 adds explicit branch prediction so that
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the CPU back-end can hint the processor and also so that
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * code blocks can be reordered such that the predicted path
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * sees a more linear flow, thus improving cache behavior, etc.
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The following two macros provide us with a way to use this
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * compiler feature.  Use __predict_true() if you expect the expression
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * to evaluate to true, and __predict_false() if you expect the
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * expression to evaluate to false.
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * A few notes about usage:
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	* Generally, __predict_false() error condition checks (unless
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	  you have some _strong_ reason to do otherwise, in which case
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	  document it), and/or __predict_true() `no-error' condition
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	  checks, assuming you want to optimize for the no-error case.
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	* Other than that, if you don't know the likelihood of a test
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	  succeeding from empirical or other `hard' evidence, don't
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	  make predictions.
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	* These are meant to be used in places that are run `a lot'.
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	  It is wasteful to make predictions in code that is run
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	  seldomly (e.g. at subsystem initialization time) as the
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	  basic block reordering that this affects can often generate
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	  larger code.
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(2, 96)
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__predict_true(exp)	__builtin_expect((exp) != 0, 1)
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__predict_false(exp)	__builtin_expect((exp) != 0, 0)
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__predict_true(exp)	(exp)
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__predict_false(exp)	(exp)
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(2, 96)
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __noreturn    __attribute__((__noreturn__))
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __mallocfunc  __attribute__((malloc))
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __purefunc    __attribute__((pure))
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __noreturn
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __mallocfunc
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __purefunc
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(3, 1)
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __always_inline __attribute__((__always_inline__))
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __always_inline
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(3, 4)
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __wur __attribute__((__warn_unused_result__))
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __wur
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __GNUC_PREREQ(4, 3)
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __errordecl(name, msg) extern void name(void) __attribute__((__error__(msg)))
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __warnattr(msg) __attribute__((__warning__(msg)))
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __errordecl(name, msg) extern void name(void)
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __warnattr(msg)
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Macros for manipulating "link sets".  Link sets are arrays of pointers
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * to objects, which are gathered up by the linker.
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Object format-specific code has provided us with the following macros:
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_add_text(set, sym)
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		Add a reference to the .text symbol `sym' to `set'.
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_add_rodata(set, sym)
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		Add a reference to the .rodata symbol `sym' to `set'.
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_add_data(set, sym)
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		Add a reference to the .data symbol `sym' to `set'.
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_add_bss(set, sym)
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		Add a reference to the .bss symbol `sym' to `set'.
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_decl(set, ptype)
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		Provide an extern declaration of the set `set', which
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		contains an array of the pointer type `ptype'.  This
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		macro must be used by any code which wishes to reference
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		the elements of a link set.
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_start(set)
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		This points to the first slot in the link set.
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_end(set)
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		This points to the (non-existent) slot after the last
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		entry in the link set.
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_count(set)
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		Count the number of entries in link set `set'.
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * In addition, we provide the following macros for accessing link sets:
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_foreach(pvar, set)
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		Iterate over the link set `set'.  Because a link set is
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		an array of pointers, pvar must be declared as "type **pvar",
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		and the actual entry accessed as "*pvar".
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	__link_set_entry(set, idx)
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		Access the link set entry at index `idx' from set `set'.
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_foreach(pvar, set)					\
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	for (pvar = __link_set_start(set); pvar < __link_set_end(set); pvar++)
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_entry(set, idx)	(__link_set_begin(set)[idx])
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Some of the FreeBSD sources used in Bionic need this.
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Originally, this is used to embed the rcs versions of each source file
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in the generated binary. We certainly don't want this in Bionic.
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __FBSDID(s) /* nothing */
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*-
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The following definitions are an extension of the behavior originally
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * implemented in <sys/_posix.h>, but with a different level of granularity.
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * POSIX.1 requires that the macros we test be defined before any standard
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * header file is included.
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Here's a quick run-down of the versions:
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  defined(_POSIX_SOURCE)		1003.1-1988
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  _POSIX_C_SOURCE == 1		1003.1-1990
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  _POSIX_C_SOURCE == 2		1003.2-1992 C Language Binding Option
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  _POSIX_C_SOURCE == 199309		1003.1b-1993
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  _POSIX_C_SOURCE == 199506		1003.1c-1995, 1003.1i-1995,
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *					and the omnibus ISO/IEC 9945-1: 1996
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  _POSIX_C_SOURCE == 200112		1003.1-2001
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  _POSIX_C_SOURCE == 200809		1003.1-2008
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * In addition, the X/Open Portability Guide, which is now the Single UNIX
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Specification, defines a feature-test macro which indicates the version of
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * that specification, and which subsumes _POSIX_C_SOURCE.
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Our macros begin with two underscores to avoid namespace screwage.
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _POSIX_C_SOURCE		/* Probably illegal, but beyond caring now. */
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_POSIX_C_SOURCE		199009
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _POSIX_C_SOURCE
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_POSIX_C_SOURCE		199209
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _XOPEN_SOURCE
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if _XOPEN_SOURCE - 0 >= 700
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__XSI_VISIBLE		700
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _POSIX_C_SOURCE
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_POSIX_C_SOURCE		200809
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif _XOPEN_SOURCE - 0 >= 600
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__XSI_VISIBLE		600
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _POSIX_C_SOURCE
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_POSIX_C_SOURCE		200112
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif _XOPEN_SOURCE - 0 >= 500
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__XSI_VISIBLE		500
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _POSIX_C_SOURCE
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_POSIX_C_SOURCE		199506
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Deal with all versions of POSIX.  The ordering relative to the tests above is
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * important.
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_POSIX_C_SOURCE		198808
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _POSIX_C_SOURCE
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if _POSIX_C_SOURCE >= 200809
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		200809
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		1999
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif _POSIX_C_SOURCE >= 200112
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		200112
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		1999
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif _POSIX_C_SOURCE >= 199506
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		199506
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		1990
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif _POSIX_C_SOURCE >= 199309
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		199309
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		1990
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif _POSIX_C_SOURCE >= 199209
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		199209
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		1990
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif _POSIX_C_SOURCE >= 199009
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		199009
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		1990
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		198808
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		0
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _POSIX_C_SOURCE */
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*-
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Deal with _ANSI_SOURCE:
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If it is defined, and no other compilation environment is explicitly
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * requested, then define our internal feature-test macros to zero.  This
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * makes no difference to the preprocessor (undefined symbols in preprocessing
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * expressions are defined to have value zero), but makes it more convenient for
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * a test program to print out the values.
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If a program mistakenly defines _ANSI_SOURCE and some other macro such as
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * _POSIX_C_SOURCE, we will assume that it wants the broader compilation
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * environment (and in fact we will never get here).
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(_ANSI_SOURCE)	/* Hide almost everything. */
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		0
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__XSI_VISIBLE		0
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__BSD_VISIBLE		0
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		1990
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined(_C99_SOURCE)	/* Localism to specify strict C99 env. */
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		0
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__XSI_VISIBLE		0
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__BSD_VISIBLE		0
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		1999
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else				/* Default environment: show everything. */
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__POSIX_VISIBLE		200809
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__XSI_VISIBLE		700
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__BSD_VISIBLE		1
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__ISO_C_VISIBLE		1999
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Default values.
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __XPG_VISIBLE
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define __XPG_VISIBLE          700
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __POSIX_VISIBLE
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define __POSIX_VISIBLE        200809
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __ISO_C_VISIBLE
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define __ISO_C_VISIBLE        1999
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __BSD_VISIBLE
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define __BSD_VISIBLE          1
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define  __BIONIC__   1
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <android/api-level.h>
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* glibc compatibility. */
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __LP64__
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __WORDSIZE 64
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __WORDSIZE 32
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * When _FORTIFY_SOURCE is defined, automatic bounds checking is
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * added to commonly used libc functions. If a buffer overrun is
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * detected, the program is safely aborted.
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * See
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html for details.
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __BIONIC_FORTIFY 1
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if _FORTIFY_SOURCE == 2
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __bos(s) __builtin_object_size((s), 1)
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __bos(s) __builtin_object_size((s), 0)
57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __bos0(s) __builtin_object_size((s), 0)
57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __BIONIC_FORTIFY_INLINE \
57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    extern __inline__ \
57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __attribute__ ((always_inline)) \
57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __attribute__ ((gnu_inline))
57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __BIONIC_FORTIFY_UNKNOWN_SIZE ((size_t) -1)
57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* __NDK_FPABI__ or __NDK_FPABI_MATH__ are applied to APIs taking or returning float or
58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   [long] double, to ensure even at the presence of -mhard-float (which implies
58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   -mfloat-abi=hard), calling to 32-bit Android native APIs still follow -mfloat-abi=softfp.
58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   __NDK_FPABI_MATH__ is applied to APIs in math.h.  It normally equals to __NDK_FPABI__,
58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   but allows use of customized libm.a compiled with -mhard-float by -D_NDK_MATH_NO_SOFTFP=1
58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   NOTE: Disable for clang for now unless _NDK_MATH_NO_SOFTFP=1, because clang before 3.4 doesn't
58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert         allow change of calling convension for builtin and produces error message reads:
58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           a.i:564:6: error: function declared 'aapcs' here was previously declared without calling convention
59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           int  sin(double d) __attribute__((pcs("aapcs")));
59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                ^
59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           a.i:564:6: note: previous declaration is here
59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__ANDROID__) && !defined(__LP64__) && defined( __arm__)
59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __NDK_FPABI__ __attribute__((pcs("aapcs")))
59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __NDK_FPABI__
59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if (!defined(_NDK_MATH_NO_SOFTFP) || _NDK_MATH_NO_SOFTFP != 1) && !defined(__clang__)
60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __NDK_FPABI_MATH__ __NDK_FPABI__
60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __NDK_FPABI_MATH__  /* nothing */
60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* !_SYS_CDEFS_H_ */
608