X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/2d21ac55c334faf3a56e5634905ed6987fc787d4..cc8bc92ae4a8e9f1a1ab61bf83d34ad8150b3405:/osfmk/kern/assert.h diff --git a/osfmk/kern/assert.h b/osfmk/kern/assert.h index 1b528a4b3..f35eadc43 100644 --- a/osfmk/kern/assert.h +++ b/osfmk/kern/assert.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + * Copyright (c) 2000-2016 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -73,24 +73,73 @@ __BEGIN_DECLS extern void Assert( const char *file, int line, - const char *expression); + const char *expression) __attribute__((noinline)); + +extern int kext_assertions_enable; + +#define __Panic(fmt, args...) panic(fmt, ##args) + __END_DECLS -#if MACH_ASSERT +#ifndef APPLE_KEXT_ASSERTIONS +#define APPLE_KEXT_ASSERTIONS 0 +#endif + +#if MACH_ASSERT #define assert(ex) \ - ((ex) ? (void)0 : Assert(__FILE__, __LINE__, # ex)) -#define assert_static(x) assert(x) + (__builtin_expect(!!((ex)), 1L) ? (void)0 : Assert(__FILE__, __LINE__, # ex)) +#define assertf(ex, fmt, args...) \ + (__builtin_expect(!!((ex)), 1L) ? (void)0 : __Panic("%s:%d Assertion failed: %s : " fmt, __FILE__, __LINE__, # ex, ##args)) +#define __assert_only + +#elif APPLE_KEXT_ASSERTIONS && !XNU_KERNEL_PRIVATE /* MACH_ASSERT */ +#define assert(ex) \ + (__builtin_expect(!!(((!kext_assertions_enable) || (ex))), 1L) ? (void)0 : Assert(__FILE__, __LINE__, # ex)) +#define assertf(ex, fmt, args...) \ + (__builtin_expect(!!(((!kext_assertions_enable) || (ex))), 1L) ? (void)0 : __Panic("%s:%d Assertion failed: %s : " fmt, __FILE__, __LINE__, # ex, ##args)) #define __assert_only -#else /* MACH_ASSERT */ +#else /* APPLE_KEXT_ASSERTIONS && !XNU_KERNEL_PRIVATE */ #define assert(ex) ((void)0) -#define assert_static(ex) do {} while (0) - +#define assertf(ex, fmt, args...) ((void)0) #define __assert_only __unused #endif /* MACH_ASSERT */ +/* + * static_assert is a C11 / C++0x / C++1z feature. + * + * Beginning with C++0x, it is a keyword and should not be #defined + * + * static_assert is not disabled by MACH_ASSERT or NDEBUG + */ + +#ifndef __cplusplus + #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define _STATIC_ASSERT_OVERLOADED_MACRO(_1, _2, NAME, ...) NAME + #define static_assert(...) _STATIC_ASSERT_OVERLOADED_MACRO(__VA_ARGS__, _static_assert_2_args, _static_assert_1_arg)(__VA_ARGS__) + + #define _static_assert_2_args(ex, str) _Static_assert((ex), str) + #define _static_assert_1_arg(ex) _Static_assert((ex), #ex) + #endif +#else + #if !defined(__cpp_static_assert) + /* pre C++11 support */ + #define _STATIC_ASSERT_OVERLOADED_MACRO(_1, _2, NAME, ...) NAME + #define static_assert(...) _STATIC_ASSERT_OVERLOADED_MACRO(__VA_ARGS__, _static_assert_2_args, _static_assert_1_arg)(__VA_ARGS__) + + #define _static_assert_2_args(ex, str) _Static_assert((ex), str) + #define _static_assert_1_arg(ex) _Static_assert((ex), #ex) + #else + /* + * C++11 only supports the 2 argument version of static_assert. + * C++1z has added support for the 1 argument version. + */ + #define _static_assert_1_arg(ex) static_assert((ex), #ex) + #endif +#endif + #endif /* _KERN_ASSERT_H_ */