/ duct-tape / xnu / osfmk / kern / assert.h
assert.h
  1  /*
  2   * Copyright (c) 2000-2016 Apple Inc. All rights reserved.
  3   *
  4   * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  5   *
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. The rights granted to you under the License
 10   * may not be used to create, or enable the creation or redistribution of,
 11   * unlawful or unlicensed copies of an Apple operating system, or to
 12   * circumvent, violate, or enable the circumvention or violation of, any
 13   * terms of an Apple operating system software license agreement.
 14   *
 15   * Please obtain a copy of the License at
 16   * http://www.opensource.apple.com/apsl/ and read it before using this file.
 17   *
 18   * The Original Code and all software distributed under the License are
 19   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 20   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 21   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 22   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 23   * Please see the License for the specific language governing rights and
 24   * limitations under the License.
 25   *
 26   * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 27   */
 28  /*
 29   * @OSF_COPYRIGHT@
 30   */
 31  /*
 32   * Mach Operating System
 33   * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
 34   * All Rights Reserved.
 35   *
 36   * Permission to use, copy, modify and distribute this software and its
 37   * documentation is hereby granted, provided that both the copyright
 38   * notice and this permission notice appear in all copies of the
 39   * software, derivative works or modified versions, and any portions
 40   * thereof, and that both notices appear in supporting documentation.
 41   *
 42   * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 43   * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 44   * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 45   *
 46   * Carnegie Mellon requests users of this software to return to
 47   *
 48   *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 49   *  School of Computer Science
 50   *  Carnegie Mellon University
 51   *  Pittsburgh PA 15213-3890
 52   *
 53   * any improvements or extensions that they make and grant Carnegie Mellon
 54   * the rights to redistribute these changes.
 55   */
 56  /*
 57   */
 58  
 59  #ifndef _KERN_ASSERT_H_
 60  #define _KERN_ASSERT_H_
 61  
 62  /*	assert.h	4.2	85/01/21	*/
 63  
 64  #include <kern/macro_help.h>
 65  #include <sys/cdefs.h>
 66  
 67  #ifdef  MACH_KERNEL_PRIVATE
 68  #include <mach_assert.h>
 69  #endif
 70  
 71  __BEGIN_DECLS
 72  /* Assert error */
 73  #if !CONFIG_NONFATAL_ASSERTS
 74  __abortlike
 75  #endif
 76  extern void     Assert(
 77  	const char      *file,
 78  	int             line,
 79  	const char      *expression) __attribute__((noinline));
 80  
 81  extern int kext_assertions_enable;
 82  
 83  #define __Panic(fmt, args...) panic(fmt, ##args)
 84  
 85  __END_DECLS
 86  
 87  #ifndef APPLE_KEXT_ASSERTIONS
 88  #define APPLE_KEXT_ASSERTIONS   0
 89  #endif
 90  
 91  #if     MACH_ASSERT || defined(__DARLING__)
 92  
 93  #define assert(ex)  \
 94  	(__builtin_expect(!!((ex)), 1L) ? (void)0 : Assert(__FILE__, __LINE__, # ex))
 95  #define assertf(ex, fmt, args...) \
 96  	(__builtin_expect(!!((ex)), 1L) ? (void)0 : __Panic("%s:%d Assertion failed: %s : " fmt, __FILE__, __LINE__, # ex, ##args))
 97  #define __assert_only
 98  
 99  #elif APPLE_KEXT_ASSERTIONS && !XNU_KERNEL_PRIVATE      /* MACH_ASSERT */
100  
101  #define assert(ex)  \
102  	(__builtin_expect(!!(((!kext_assertions_enable) || (ex))), 1L) ? (void)0 : Assert(__FILE__, __LINE__, # ex))
103  #define assertf(ex, fmt, args...) \
104  	(__builtin_expect(!!(((!kext_assertions_enable) || (ex))), 1L) ? (void)0 : __Panic("%s:%d Assertion failed: %s : " fmt, __FILE__, __LINE__, # ex, ##args))
105  #define __assert_only
106  
107  #else                           /* APPLE_KEXT_ASSERTIONS && !XNU_KERNEL_PRIVATE */
108  
109  #define assert(ex) ((void)0)
110  #define assertf(ex, fmt, args...) ((void)0)
111  #define __assert_only __unused
112  
113  #endif  /* MACH_ASSERT */
114  
115  /*
116   * static_assert is a C11 / C++0x / C++1z feature.
117   *
118   * Beginning with C++0x, it is a keyword and should not be #defined
119   *
120   * static_assert is not disabled by MACH_ASSERT or NDEBUG
121   */
122  
123  #ifndef __cplusplus
124  	#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
125  		#define _STATIC_ASSERT_OVERLOADED_MACRO(_1, _2, NAME, ...) NAME
126  		#define static_assert(...) _STATIC_ASSERT_OVERLOADED_MACRO(__VA_ARGS__, _static_assert_2_args, _static_assert_1_arg)(__VA_ARGS__)
127  
128  		#define _static_assert_2_args(ex, str) _Static_assert((ex), str)
129  		#define _static_assert_1_arg(ex) _Static_assert((ex), #ex)
130  	#endif
131  #else
132  	#if !defined(__cpp_static_assert)
133  /* pre C++11 support */
134  		#define _STATIC_ASSERT_OVERLOADED_MACRO(_1, _2, NAME, ...) NAME
135  		#define static_assert(...) _STATIC_ASSERT_OVERLOADED_MACRO(__VA_ARGS__, _static_assert_2_args, _static_assert_1_arg)(__VA_ARGS__)
136  
137  		#define _static_assert_2_args(ex, str) _Static_assert((ex), str)
138  		#define _static_assert_1_arg(ex) _Static_assert((ex), #ex)
139  	#else
140  /*
141   * C++11 only supports the 2 argument version of static_assert.
142   * C++1z has added support for the 1 argument version.
143   */
144  		#define _static_assert_1_arg(ex) static_assert((ex), #ex)
145  	#endif
146  #endif
147  
148  #endif  /* _KERN_ASSERT_H_ */