17372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*	$NetBSD: cdefs.h,v 1.58 2004/12/11 05:59:00 christos Exp $	*/
27372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
37372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
47372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Copyright (c) 1991, 1993
57372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	The Regents of the University of California.  All rights reserved.
67372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
77372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * This code is derived from software contributed to Berkeley by
87372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Berkeley Software Design, Inc.
97372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
107372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Redistribution and use in source and binary forms, with or without
117372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * modification, are permitted provided that the following conditions
127372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * are met:
137372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * 1. Redistributions of source code must retain the above copyright
147372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *    notice, this list of conditions and the following disclaimer.
157372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * 2. Redistributions in binary form must reproduce the above copyright
167372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *    notice, this list of conditions and the following disclaimer in the
177372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *    documentation and/or other materials provided with the distribution.
187372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * 3. Neither the name of the University nor the names of its contributors
197372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *    may be used to endorse or promote products derived from this software
207372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *    without specific prior written permission.
217372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
227372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
237372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
247372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
257372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
267372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
277372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
287372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
297372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
307372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
317372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
327372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * SUCH DAMAGE.
337372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
347372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	@(#)cdefs.h	8.8 (Berkeley) 1/9/95
357372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
367372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
377372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifndef	_SYS_CDEFS_H_
387372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	_SYS_CDEFS_H_
397372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
407372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
41244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh * Testing against Clang-specific extensions.
42244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh */
43244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh
44244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#ifndef __has_extension
45244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#define __has_extension         __has_feature
46244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#endif
47244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#ifndef __has_feature
48244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#define __has_feature(x)        0
49244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#endif
50244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#ifndef __has_include
51244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#define __has_include(x)        0
52244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#endif
53244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#ifndef __has_builtin
54244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#define __has_builtin(x)        0
55244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh#endif
56244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh
57244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh
58244dca2ed2a3f87b0f93d23f1bc2ea0ba9c8d783Andrew Hsieh/*
597372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Macro to test if we're using a GNU C compiler of a specific vintage
607372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * or later, for e.g. features that appeared in a particular version
617372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * of GNU C.  Usage:
627372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
6370265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh *	#if __GNUC_PREREQ(major, minor)
647372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	...cool feature...
657372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	#else
667372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	...delete feature...
677372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	#endif
687372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
697372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifdef __GNUC__
7070265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#define	__GNUC_PREREQ(x, y)						\
717372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh	((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) ||			\
727372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh	 (__GNUC__ > (x)))
737372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
7470265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#define	__GNUC_PREREQ(x, y)	0
757372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
767372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
777372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#include <sys/cdefs_elf.h>
787372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
797372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(__cplusplus)
807372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__BEGIN_DECLS		extern "C" {
817372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__END_DECLS		}
827372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__static_cast(x,y)	static_cast<x>(y)
837372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
847372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__BEGIN_DECLS
857372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__END_DECLS
867372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__static_cast(x,y)	(x)y
877372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
887372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
897372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
907372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
917372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
927372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
937372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * in between its arguments.  __CONCAT can also concatenate double-quoted
947372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * strings produced by the __STRING macro, but this only works with ANSI C.
957372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
967372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
977372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	___STRING(x)	__STRING(x)
987372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	___CONCAT(x,y)	__CONCAT(x,y)
997372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1007372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(__STDC__) || defined(__cplusplus)
1017372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__P(protos)	protos		/* full-blown ANSI C */
1027372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__CONCAT(x,y)	x ## y
1037372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__STRING(x)	#x
1047372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1057372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__const		const		/* define reserved names to standard */
1067372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__signed	signed
1077372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__volatile	volatile
1087372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(__cplusplus)
1097372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__inline	inline		/* convert to C++ keyword */
1107372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
1117372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if !defined(__GNUC__) && !defined(__lint__)
1127372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__inline			/* delete GCC keyword */
1137372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* !__GNUC__  && !__lint__ */
1147372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* !__cplusplus */
1157372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1167372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else	/* !(__STDC__ || __cplusplus) */
1177372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__P(protos)	()		/* traditional C preprocessor */
1187372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__CONCAT(x,y)	x/**/y
1197372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__STRING(x)	"x"
1207372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1217372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifndef __GNUC__
1227372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__const				/* delete pseudo-ANSI C keywords */
1237372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__inline
1247372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__signed
1257372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__volatile
1267372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif	/* !__GNUC__ */
1277372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1287372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
1297372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * In non-ANSI C environments, new programs will want ANSI-only C keywords
1307372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * deleted from the program and old programs will want them left alone.
1317372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Programs using the ANSI C keywords const, inline etc. as normal
1327372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * identifiers should define -DNO_ANSI_KEYWORDS.
1337372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
1347372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifndef	NO_ANSI_KEYWORDS
1357372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	const		__const		/* convert ANSI C keywords */
1367372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	inline		__inline
1377372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	signed		__signed
1387372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	volatile	__volatile
1397372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* !NO_ANSI_KEYWORDS */
1407372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif	/* !(__STDC__ || __cplusplus) */
1417372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1427372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
1437372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Used for internal auditing of the NetBSD source tree.
1447372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
1457372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifdef __AUDIT__
1467372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__aconst	__const
1477372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
1487372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__aconst
1497372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
1507372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1517372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
1527372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * The following macro is used to remove const cast-away warnings
1537372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * from gcc -Wcast-qual; it should be used with caution because it
1547372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * can hide valid errors; in particular most valid uses are in
1557372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * situations where the API requires it, not to cast away string
1567372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * constants. We don't use *intptr_t on purpose here and we are
1577372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * explicit about unsigned long so that we don't have additional
1587372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * dependencies.
1597372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
1607372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __UNCONST(a)	((void *)(unsigned long)(const void *)(a))
1617372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1627372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
1637372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * GCC2 provides __extension__ to suppress warnings for various GNU C
1647372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * language extensions under "-ansi -pedantic".
1657372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
16670265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if !__GNUC_PREREQ(2, 0)
1677372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__extension__		/* delete __extension__ if non-gcc or gcc1 */
1687372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
1697372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1707372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
1717372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * GCC1 and some versions of GCC2 declare dead (non-returning) and
1727372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * pure (no side effects) functions using "volatile" and "const";
1737372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * unfortunately, these then cause warnings under "-ansi -pedantic".
1747372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * GCC2 uses a new, peculiar __attribute__((attrs)) style.  All of
1757372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * these work for GNU C++ (modulo a slight glitch in the C++ grammar
1767372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * in the distribution version of 2.5.5).
1777372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
17870265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if !__GNUC_PREREQ(2, 5)
1797372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__attribute__(x)	/* delete __attribute__ if non-gcc or gcc1 */
1807372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
1817372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__dead		__volatile
1827372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__pure		__const
1837372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
1847372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
1857372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1867372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/* Delete pseudo-keywords wherever they are not available or needed. */
1877372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifndef __dead
1887372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__dead
1897372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__pure
1907372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
1917372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
19270265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(2, 7)
1937372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__unused	__attribute__((__unused__))
1947372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
1957372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__unused	/* delete */
1967372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
1977372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
1987372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __pure2 __attribute__((__const__)) /* Android-added: used by FreeBSD libm */
1997372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
20070265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(3, 1)
2017372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__used		__attribute__((__used__))
2027372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
2037372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__used		/* delete */
2047372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
2057372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
20670265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(2, 7)
2077372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__packed	__attribute__((__packed__))
2087372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__aligned(x)	__attribute__((__aligned__(x)))
2097372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__section(x)	__attribute__((__section__(x)))
2107372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif defined(__lint__)
2117372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__packed	/* delete */
2127372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__aligned(x)	/* delete */
2137372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__section(x)	/* delete */
2147372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
2157372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__packed	error: no __packed for this compiler
2167372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__aligned(x)	error: no __aligned for this compiler
2177372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__section(x)	error: no __section for this compiler
2187372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
2197372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
22070265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if !__GNUC_PREREQ(2, 8)
2217372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__extension__
2227372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
2237372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
22470265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(2, 8)
2257372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __statement(x)	__extension__(x)
2267372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif defined(lint)
2277372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __statement(x)	(0)
2287372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
2297372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __statement(x)	(x)
2307372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
2317372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
2327372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __nonnull(args) __attribute__((__nonnull__ args))
2337372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
2347372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __printflike(x, y) __attribute__((__format__(printf, x, y))) __nonnull((x))
2357372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __scanflike(x, y) __attribute__((__format__(scanf, x, y))) __nonnull((x))
2367372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
2377372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
2387372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * C99 defines the restrict type qualifier keyword, which was made available
2397372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * in GCC 2.92.
2407372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
2417372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(__STDC__VERSION__) && __STDC_VERSION__ >= 199901L
2427372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__restrict	restrict
2437372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
24470265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if !__GNUC_PREREQ(2, 92)
2457372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__restrict	/* delete __restrict when not supported */
2467372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
2477372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
2487372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
2497372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
2507372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * C99 defines __func__ predefined identifier, which was made available
2517372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * in GCC 2.95.
2527372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
2537372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if !defined(__STDC_VERSION__) || !(__STDC_VERSION__ >= 199901L)
25470265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(2, 6)
2557372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__func__	__PRETTY_FUNCTION__
25670265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#elif __GNUC_PREREQ(2, 4)
2577372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__func__	__FUNCTION__
2587372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
2597372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__func__	""
2607372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
2617372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* !(__STDC_VERSION__ >= 199901L) */
2627372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
2637372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(_KERNEL)
2647372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(NO_KERNEL_RCSIDS)
2657372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#undef __KERNEL_RCSID
2667372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__KERNEL_RCSID(_n, _s)		/* nothing */
2677372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* NO_KERNEL_RCSIDS */
2687372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* _KERNEL */
2697372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
2707372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if !defined(_STANDALONE) && !defined(_KERNEL)
2717372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifdef __GNUC__
2727372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__RENAME(x)	___RENAME(x)
2737372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
2747372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifdef __lint__
2757372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__RENAME(x)	__symbolrename(x)
2767372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
2777372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#error "No function renaming possible"
2787372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* __lint__ */
2797372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* __GNUC__ */
2807372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else /* _STANDALONE || _KERNEL */
2817372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__RENAME(x)	no renaming in kernel or standalone environment
2827372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
2837372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
2847372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
2857372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * A barrier to stop the optimizer from moving code or assume live
2867372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * register values. This is gcc specific, the version is more or less
2877372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * arbitrary, might work with older compilers.
2887372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
28970265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(2, 95)
2907372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__insn_barrier()	__asm __volatile("":::"memory")
2917372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
2927372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__insn_barrier()	/* */
2937372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
2947372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
2957372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
2967372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * GNU C version 2.96 adds explicit branch prediction so that
2977372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * the CPU back-end can hint the processor and also so that
2987372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * code blocks can be reordered such that the predicted path
2997372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * sees a more linear flow, thus improving cache behavior, etc.
3007372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3017372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * The following two macros provide us with a way to use this
3027372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * compiler feature.  Use __predict_true() if you expect the expression
3037372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * to evaluate to true, and __predict_false() if you expect the
3047372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * expression to evaluate to false.
3057372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3067372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * A few notes about usage:
3077372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3087372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	* Generally, __predict_false() error condition checks (unless
3097372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	  you have some _strong_ reason to do otherwise, in which case
3107372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	  document it), and/or __predict_true() `no-error' condition
3117372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	  checks, assuming you want to optimize for the no-error case.
3127372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3137372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	* Other than that, if you don't know the likelihood of a test
3147372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	  succeeding from empirical or other `hard' evidence, don't
3157372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	  make predictions.
3167372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3177372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	* These are meant to be used in places that are run `a lot'.
3187372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	  It is wasteful to make predictions in code that is run
3197372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	  seldomly (e.g. at subsystem initialization time) as the
3207372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	  basic block reordering that this affects can often generate
3217372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	  larger code.
3227372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
32370265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(2, 96)
3247372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__predict_true(exp)	__builtin_expect((exp) != 0, 1)
3257372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__predict_false(exp)	__builtin_expect((exp) != 0, 0)
3267372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
3277372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__predict_true(exp)	(exp)
3287372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__predict_false(exp)	(exp)
3297372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
3307372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
33170265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(2, 96)
3327372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __noreturn    __attribute__((__noreturn__))
3337372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __mallocfunc  __attribute__((malloc))
3347372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __purefunc    __attribute__((pure))
3357372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
3367372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __noreturn
3377372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __mallocfunc
3387372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __purefunc
3397372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
3407372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
34170265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(3, 1)
3427372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __always_inline __attribute__((__always_inline__))
3437372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
3447372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __always_inline
3457372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
3467372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
34770265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(3, 4)
3487372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __wur __attribute__((__warn_unused_result__))
3497372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
3507372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __wur
3517372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
3527372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
35370265c95acca4be96f4c82ad80645e67fe718094Andrew Hsieh#if __GNUC_PREREQ(4, 3)
3547372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __errordecl(name, msg) extern void name(void) __attribute__((__error__(msg)))
3557372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __warnattr(msg) __attribute__((__warning__(msg)))
3567372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
3577372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __errordecl(name, msg) extern void name(void)
3587372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __warnattr(msg)
3597372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
3607372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
3617372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
3627372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Macros for manipulating "link sets".  Link sets are arrays of pointers
3637372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * to objects, which are gathered up by the linker.
3647372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3657372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Object format-specific code has provided us with the following macros:
3667372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3677372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_add_text(set, sym)
3687372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		Add a reference to the .text symbol `sym' to `set'.
3697372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3707372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_add_rodata(set, sym)
3717372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		Add a reference to the .rodata symbol `sym' to `set'.
3727372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3737372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_add_data(set, sym)
3747372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		Add a reference to the .data symbol `sym' to `set'.
3757372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3767372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_add_bss(set, sym)
3777372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		Add a reference to the .bss symbol `sym' to `set'.
3787372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3797372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_decl(set, ptype)
3807372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		Provide an extern declaration of the set `set', which
3817372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		contains an array of the pointer type `ptype'.  This
3827372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		macro must be used by any code which wishes to reference
3837372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		the elements of a link set.
3847372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3857372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_start(set)
3867372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		This points to the first slot in the link set.
3877372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3887372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_end(set)
3897372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		This points to the (non-existent) slot after the last
3907372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		entry in the link set.
3917372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3927372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_count(set)
3937372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		Count the number of entries in link set `set'.
3947372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3957372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * In addition, we provide the following macros for accessing link sets:
3967372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
3977372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_foreach(pvar, set)
3987372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		Iterate over the link set `set'.  Because a link set is
3997372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		an array of pointers, pvar must be declared as "type **pvar",
4007372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		and the actual entry accessed as "*pvar".
4017372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
4027372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *	__link_set_entry(set, idx)
4037372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *		Access the link set entry at index `idx' from set `set'.
4047372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
4057372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__link_set_foreach(pvar, set)					\
4067372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh	for (pvar = __link_set_start(set); pvar < __link_set_end(set); pvar++)
4077372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
4087372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__link_set_entry(set, idx)	(__link_set_begin(set)[idx])
4097372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
4107372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
4117372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Some of the FreeBSD sources used in Bionic need this.
4127372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Originally, this is used to embed the rcs versions of each source file
4137372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * in the generated binary. We certainly don't want this in Bionic.
4147372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
4157372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __FBSDID(s) /* nothing */
4167372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
4177372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*-
4187372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * The following definitions are an extension of the behavior originally
4197372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * implemented in <sys/_posix.h>, but with a different level of granularity.
4207372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * POSIX.1 requires that the macros we test be defined before any standard
4217372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * header file is included.
4227372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
4237372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Here's a quick run-down of the versions:
4247372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *  defined(_POSIX_SOURCE)		1003.1-1988
4257372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *  _POSIX_C_SOURCE == 1		1003.1-1990
4267372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *  _POSIX_C_SOURCE == 2		1003.2-1992 C Language Binding Option
4277372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *  _POSIX_C_SOURCE == 199309		1003.1b-1993
4287372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *  _POSIX_C_SOURCE == 199506		1003.1c-1995, 1003.1i-1995,
4297372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *					and the omnibus ISO/IEC 9945-1: 1996
4307372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *  _POSIX_C_SOURCE == 200112		1003.1-2001
4317372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *  _POSIX_C_SOURCE == 200809		1003.1-2008
4327372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
4337372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * In addition, the X/Open Portability Guide, which is now the Single UNIX
4347372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Specification, defines a feature-test macro which indicates the version of
4357372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * that specification, and which subsumes _POSIX_C_SOURCE.
4367372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
4377372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Our macros begin with two underscores to avoid namespace screwage.
4387372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
4397372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
4407372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */
4417372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1
4427372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#undef _POSIX_C_SOURCE		/* Probably illegal, but beyond caring now. */
4437372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	_POSIX_C_SOURCE		199009
4447372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
4457372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
4467372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */
4477372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2
4487372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#undef _POSIX_C_SOURCE
4497372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	_POSIX_C_SOURCE		199209
4507372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
4517372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
4527372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
4537372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifdef _XOPEN_SOURCE
4547372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if _XOPEN_SOURCE - 0 >= 700
4557372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__XSI_VISIBLE		700
4567372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#undef _POSIX_C_SOURCE
4577372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	_POSIX_C_SOURCE		200809
4587372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif _XOPEN_SOURCE - 0 >= 600
4597372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__XSI_VISIBLE		600
4607372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#undef _POSIX_C_SOURCE
4617372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	_POSIX_C_SOURCE		200112
4627372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif _XOPEN_SOURCE - 0 >= 500
4637372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__XSI_VISIBLE		500
4647372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#undef _POSIX_C_SOURCE
4657372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	_POSIX_C_SOURCE		199506
4667372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
4677372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
4687372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
4697372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
4707372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Deal with all versions of POSIX.  The ordering relative to the tests above is
4717372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * important.
4727372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
4737372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
4747372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	_POSIX_C_SOURCE		198808
4757372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
4767372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifdef _POSIX_C_SOURCE
4777372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if _POSIX_C_SOURCE >= 200809
4787372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		200809
4797372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		1999
4807372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif _POSIX_C_SOURCE >= 200112
4817372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		200112
4827372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		1999
4837372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif _POSIX_C_SOURCE >= 199506
4847372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		199506
4857372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		1990
4867372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif _POSIX_C_SOURCE >= 199309
4877372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		199309
4887372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		1990
4897372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif _POSIX_C_SOURCE >= 199209
4907372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		199209
4917372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		1990
4927372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif _POSIX_C_SOURCE >= 199009
4937372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		199009
4947372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		1990
4957372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
4967372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		198808
4977372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		0
4987372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* _POSIX_C_SOURCE */
4997372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
5007372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*-
5017372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Deal with _ANSI_SOURCE:
5027372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * If it is defined, and no other compilation environment is explicitly
5037372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * requested, then define our internal feature-test macros to zero.  This
5047372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * makes no difference to the preprocessor (undefined symbols in preprocessing
5057372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * expressions are defined to have value zero), but makes it more convenient for
5067372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * a test program to print out the values.
5077372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
5087372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * If a program mistakenly defines _ANSI_SOURCE and some other macro such as
5097372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * _POSIX_C_SOURCE, we will assume that it wants the broader compilation
5107372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * environment (and in fact we will never get here).
5117372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
5127372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(_ANSI_SOURCE)	/* Hide almost everything. */
5137372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		0
5147372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__XSI_VISIBLE		0
5157372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__BSD_VISIBLE		0
5167372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		1990
5177372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#elif defined(_C99_SOURCE)	/* Localism to specify strict C99 env. */
5187372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		0
5197372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__XSI_VISIBLE		0
5207372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__BSD_VISIBLE		0
5217372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		1999
5227372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else				/* Default environment: show everything. */
5237372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__POSIX_VISIBLE		200809
5247372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__XSI_VISIBLE		700
5257372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__BSD_VISIBLE		1
5267372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define	__ISO_C_VISIBLE		1999
5277372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5287372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5297372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
5307372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
5317372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * Default values.
5327372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
5337372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifndef __XPG_VISIBLE
5347372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh# define __XPG_VISIBLE          700
5357372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5367372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifndef __POSIX_VISIBLE
5377372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh# define __POSIX_VISIBLE        200809
5387372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5397372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifndef __ISO_C_VISIBLE
5407372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh# define __ISO_C_VISIBLE        1999
5417372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5427372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#ifndef __BSD_VISIBLE
5437372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh# define __BSD_VISIBLE          1
5447372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5457372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
5467372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define  __BIONIC__   1
5477372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#include <android/api-level.h>
5487372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
549e003ef06f962ca294f8dc9e66ad607d15c2d7b9eAndrew Hsieh/* glibc compatibility. */
550e003ef06f962ca294f8dc9e66ad607d15c2d7b9eAndrew Hsieh#if __LP64__
551e003ef06f962ca294f8dc9e66ad607d15c2d7b9eAndrew Hsieh#define __WORDSIZE 64
552e003ef06f962ca294f8dc9e66ad607d15c2d7b9eAndrew Hsieh#else
553e003ef06f962ca294f8dc9e66ad607d15c2d7b9eAndrew Hsieh#define __WORDSIZE 32
554e003ef06f962ca294f8dc9e66ad607d15c2d7b9eAndrew Hsieh#endif
555e003ef06f962ca294f8dc9e66ad607d15c2d7b9eAndrew Hsieh
5567372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh/*
5577372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * When _FORTIFY_SOURCE is defined, automatic bounds checking is
5587372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * added to commonly used libc functions. If a buffer overrun is
5597372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * detected, the program is safely aborted.
5607372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh *
5617372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * See
5627372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh * http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html for details.
5637372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh */
5647372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
5657372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __BIONIC_FORTIFY 1
5667372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if _FORTIFY_SOURCE == 2
5677372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __bos(s) __builtin_object_size((s), 1)
5687372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
5697372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __bos(s) __builtin_object_size((s), 0)
5707372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5717372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __bos0(s) __builtin_object_size((s), 0)
5727372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
5737372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __BIONIC_FORTIFY_INLINE \
5747372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh    extern __inline__ \
5757372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh    __attribute__ ((always_inline)) \
5767372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh    __attribute__ ((gnu_inline))
5777372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5787372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __BIONIC_FORTIFY_UNKNOWN_SIZE ((size_t) -1)
5797372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
5807372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
5811b55d7b281f282232ee58da5d09d3da5969ff11dAndrew Hsieh#if defined(__ANDROID__) && !defined(__LP64__) && defined( __arm__)
5827372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __NDK_FPABI__ __attribute__((pcs("aapcs")))
5837372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
5847372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __NDK_FPABI__
5857372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5867372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
5877372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#if (!defined(_NDK_MATH_NO_SOFTFP) || _NDK_MATH_NO_SOFTFP != 1) && !defined(__clang__)
5887372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __NDK_FPABI_MATH__ __NDK_FPABI__
5897372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#else
5907372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#define __NDK_FPABI_MATH__  /* nothing */
5917372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif
5927372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh
5937372bd5a6d7d0cb636bdfdd27ca99b2d6abc0f2cAndrew Hsieh#endif /* !_SYS_CDEFS_H_ */
594