cdefs.h revision 83526
1/* 2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Berkeley Software Design, Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 37 * $FreeBSD: head/sys/sys/cdefs.h 83526 2001-09-15 23:50:31Z obrien $ 38 */ 39 40#ifndef _SYS_CDEFS_H_ 41#define _SYS_CDEFS_H_ 42 43#if defined(__cplusplus) 44#define __BEGIN_DECLS extern "C" { 45#define __END_DECLS } 46#else 47#define __BEGIN_DECLS 48#define __END_DECLS 49#endif 50 51/* 52 * The __CONCAT macro is used to concatenate parts of symbol names, e.g. 53 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. 54 * The __CONCAT macro is a bit tricky to use if it must work in non-ANSI 55 * mode -- there must be no spaces between its arguments, and for nested 56 * __CONCAT's, all the __CONCAT's must be at the left. __CONCAT can also 57 * concatenate double-quoted strings produced by the __STRING macro, but 58 * this only works with ANSI C. 59 * 60 * __XSTRING is like __STRING, but it expands any macros in its argument 61 * first. It is only available with ANSI C. 62 */ 63#if defined(__STDC__) || defined(__cplusplus) 64#define __P(protos) protos /* full-blown ANSI C */ 65#define __CONCAT1(x,y) x ## y 66#define __CONCAT(x,y) __CONCAT1(x,y) 67#define __STRING(x) #x /* stringify without expanding x */ 68#define __XSTRING(x) __STRING(x) /* expand x, then stringify */ 69 70#define __const const /* define reserved names to standard */ 71#define __signed signed 72#define __volatile volatile 73#if defined(__cplusplus) 74#define __inline inline /* convert to C++ keyword */ 75#else 76#ifndef __GNUC__ 77#define __inline /* delete GCC keyword */ 78#endif /* !__GNUC__ */ 79#endif /* !__cplusplus */ 80 81#else /* !(__STDC__ || __cplusplus) */ 82#define __P(protos) () /* traditional C preprocessor */ 83#define __CONCAT(x,y) x/**/y 84#define __STRING(x) "x" 85 86#ifndef __GNUC__ 87#define __const /* delete pseudo-ANSI C keywords */ 88#define __inline 89#define __signed 90#define __volatile 91/* 92 * In non-ANSI C environments, new programs will want ANSI-only C keywords 93 * deleted from the program and old programs will want them left alone. 94 * When using a compiler other than gcc, programs using the ANSI C keywords 95 * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. 96 * When using "gcc -traditional", we assume that this is the intent; if 97 * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. 98 */ 99#ifndef NO_ANSI_KEYWORDS 100#define const /* delete ANSI C keywords */ 101#define inline 102#define signed 103#define volatile 104#endif /* !NO_ANSI_KEYWORDS */ 105#endif /* !__GNUC__ */ 106#endif /* !(__STDC__ || __cplusplus) */ 107 108/* 109 * Compiler-dependent macros to help declare dead (non-returning) and 110 * pure (no side effects) functions, and unused variables. They are 111 * null except for versions of gcc that are known to support the features 112 * properly (old versions of gcc-2 supported the dead and pure features 113 * in a different (wrong) way). 114 */ 115#if __GNUC__ < 2 || __GNUC__ == 2 && __GNUC_MINOR__ < 5 116#define __attribute__(x) 117#define __dead2 118#define __pure2 119#define __unused 120#endif 121#if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7 122#define __dead2 __attribute__((__noreturn__)) 123#define __pure2 __attribute__((__const__)) 124#define __unused 125#endif 126#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ == 3 127#define __dead2 __attribute__((__noreturn__)) 128#define __pure2 __attribute__((__const__)) 129#define __unused __attribute__((__unused__)) 130#endif 131 132/* 133 * Compiler-dependent macros to declare that functions take printf-like 134 * or scanf-like arguments. They are null except for versions of gcc 135 * that are known to support the features properly (old versions of gcc-2 136 * didn't permit keeping the keywords out of the application namespace). 137 */ 138#if __GNUC__ < 2 || __GNUC__ == 2 && __GNUC_MINOR__ < 7 139#define __printflike(fmtarg, firstvararg) 140#define __scanflike(fmtarg, firstvararg) 141#else 142#define __printflike(fmtarg, firstvararg) \ 143 __attribute__((__format__ (__printf__, fmtarg, firstvararg))) 144#define __scanflike(fmtarg, firstvararg) \ 145 __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) 146#endif 147 148/* Compiler-dependent macros that rely on FreeBSD-specific extensions. */ 149#if __FreeBSD_cc_version >= 300001 150#define __printf0like(fmtarg, firstvararg) \ 151 __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) 152#else 153#define __printf0like(fmtarg, firstvararg) 154#endif 155 156#ifdef __GNUC__ 157#define __strong_reference(sym,aliassym) \ 158 extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym))); 159#ifdef __ELF__ 160#ifdef __STDC__ 161#define __weak_reference(sym,alias) \ 162 __asm__(".weak " #alias); \ 163 __asm__(".equ " #alias ", " #sym) 164#define __warn_references(sym,msg) \ 165 __asm__(".section .gnu.warning." #sym); \ 166 __asm__(".asciz \"" msg "\""); \ 167 __asm__(".previous") 168#else 169#define __weak_reference(sym,alias) \ 170 __asm__(".weak alias"); \ 171 __asm__(".equ alias, sym") 172#define __warn_references(sym,msg) \ 173 __asm__(".section .gnu.warning.sym"); \ 174 __asm__(".asciz \"msg\""); \ 175 __asm__(".previous") 176#endif /* __STDC__ */ 177#else /* !__ELF__ */ 178#ifdef __STDC__ 179#define __weak_reference(sym,alias) \ 180 __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ 181 __asm__(".stabs \"_" #sym "\",1,0,0,0") 182#define __warn_references(sym,msg) \ 183 __asm__(".stabs \"" msg "\",30,0,0,0"); \ 184 __asm__(".stabs \"_" #sym "\",1,0,0,0") 185#else 186#define __weak_reference(sym,alias) \ 187 __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ 188 __asm__(".stabs \"_/**/sym\",1,0,0,0") 189#define __warn_references(sym,msg) \ 190 __asm__(".stabs msg,30,0,0,0"); \ 191 __asm__(".stabs \"_/**/sym\",1,0,0,0") 192#endif /* __STDC__ */ 193#endif /* __ELF__ */ 194#endif /* __GNUC__ */ 195 196#ifdef __GNUC__ 197#ifdef __ELF__ 198#define __IDSTRING(name,string) __asm__(".ident\t\"" string "\"") 199#else 200#define __IDSTRING(name,string) __asm__(".data\n\t.asciz\t\"" string "\"\n\t.previous") 201#endif 202#else 203/* 204 * This doesn't work in header files. But it may be better than nothing. 205 * The alternative is: #define __IDSTRING(name,string) [nothing] 206 */ 207#define __IDSTRING(name,string) static const char name[] __unused = string 208#endif 209 210#ifndef __RCSID 211#define __RCSID(s) __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) 212#endif 213 214#ifndef __FBSDID 215#if !defined(lint) && defined(STRIP_FBSDID) 216#define __FBSDID(s) __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) 217#else 218#define __FBSDID(s) 219#endif 220#endif 221 222#ifndef __RCSID_SOURCE 223#define __RCSID_SOURCE(s) __IDSTRING(__CONCAT(__rcsid_source_,__LINE__),s) 224#endif 225 226#ifndef __COPYRIGHT 227#define __COPYRIGHT(s) __IDSTRING(__CONCAT(__copyright_,__LINE__),s) 228#endif 229 230#ifndef __DECONST 231#define __DECONST(type, var) ((type)(uintptr_t)(const void *)(var)) 232#endif 233 234#ifndef __DEVOLATILE 235#define __DEVOLATILE(type, var) ((type)(uintptr_t)(volatile void *)(var)) 236#endif 237 238#ifndef __DEQUALIFY 239#define __DEQUALIFY(type, var) ((type)(uintptr_t)(const volatile void *)(var)) 240#endif 241 242#endif /* !_SYS_CDEFS_H_ */ 243