blob: abc923edc64bbfdf448eecdeebd1eae027946bbb [file] [log] [blame]
Jim Cownie5e8470a2013-09-27 10:38:44 +00001/*
2 * kmp_debug.h -- debug / assertion code for Assure library
Jim Cownie5e8470a2013-09-27 10:38:44 +00003 */
4
5
6//===----------------------------------------------------------------------===//
7//
8// The LLVM Compiler Infrastructure
9//
10// This file is dual licensed under the MIT and the University of Illinois Open
11// Source Licenses. See LICENSE.txt for details.
12//
13//===----------------------------------------------------------------------===//
14
15
16#ifndef KMP_DEBUG_H
17#define KMP_DEBUG_H
18
19#include <stdarg.h>
20
21#ifdef __cplusplus
22 extern "C" {
23#endif // __cplusplus
24
25// -------------------------------------------------------------------------------------------------
26// Build-time assertion.
27// -------------------------------------------------------------------------------------------------
28
29/*
30 Build-time assertion can do compile-time checking of data structure sizes, etc. This works by
31 declaring a negative-length array if the conditional expression evaluates to false. In that
32 case, the compiler issues a syntax error and stops the compilation. If the expression is
33 true, we get an extraneous static single character array in the scope of the macro.
34
35 Usage:
36
37 KMP_BUILD_ASSERT( sizeof( some_t ) <= 32 );
38 KMP_BUILD_ASSERT( offsetof( some_t, field ) % 8 == 0 );
39
40 Do not use _KMP_BUILD_ASSERT and __KMP_BUILD_ASSERT directly, it is working guts.
41*/
42
Jonathan Peytoncf82a162015-06-08 20:18:10 +000043#define __KMP_BUILD_ASSERT( expr, suffix ) typedef char __kmp_build_check_##suffix[ (expr) ? 1 : -1 ]
Jim Cownie5e8470a2013-09-27 10:38:44 +000044#define _KMP_BUILD_ASSERT( expr, suffix ) __KMP_BUILD_ASSERT( (expr), suffix )
Jonathan Peyton9919dfc2015-06-11 17:36:16 +000045#ifdef KMP_USE_ASSERT
46 #define KMP_BUILD_ASSERT( expr ) _KMP_BUILD_ASSERT( (expr), __LINE__ )
47#else
48 #define KMP_BUILD_ASSERT( expr ) /* nothing to do */
49#endif
Jim Cownie5e8470a2013-09-27 10:38:44 +000050
51// -------------------------------------------------------------------------------------------------
52// Run-time assertions.
53// -------------------------------------------------------------------------------------------------
54
55extern void __kmp_dump_debug_buffer( void );
56
57#ifdef KMP_USE_ASSERT
58 extern int __kmp_debug_assert( char const * expr, char const * file, int line );
59 #ifdef KMP_DEBUG
60 #define KMP_ASSERT( cond ) ( (cond) ? 0 : __kmp_debug_assert( #cond, __FILE__, __LINE__ ) )
61 #define KMP_ASSERT2( cond, msg ) ( (cond) ? 0 : __kmp_debug_assert( (msg), __FILE__, __LINE__ ) )
62 #define KMP_DEBUG_ASSERT( cond ) KMP_ASSERT( cond )
63 #define KMP_DEBUG_ASSERT2( cond, msg ) KMP_ASSERT2( cond, msg )
64 #else
65 // Do not expose condition in release build. Use "assertion failure".
66 #define KMP_ASSERT( cond ) ( (cond) ? 0 : __kmp_debug_assert( "assertion failure", __FILE__, __LINE__ ) )
67 #define KMP_ASSERT2( cond, msg ) KMP_ASSERT( cond )
68 #define KMP_DEBUG_ASSERT( cond ) 0
69 #define KMP_DEBUG_ASSERT2( cond, msg ) 0
70 #endif // KMP_DEBUG
71#else
72 #define KMP_ASSERT( cond ) 0
73 #define KMP_ASSERT2( cond, msg ) 0
74 #define KMP_DEBUG_ASSERT( cond ) 0
75 #define KMP_DEBUG_ASSERT2( cond, msg ) 0
76#endif // KMP_USE_ASSERT
77
78#ifdef KMP_DEBUG
79 extern void __kmp_debug_printf_stdout( char const * format, ... );
80#endif
81extern void __kmp_debug_printf( char const * format, ... );
82
83#ifdef KMP_DEBUG
84
85 extern int kmp_a_debug;
86 extern int kmp_b_debug;
87 extern int kmp_c_debug;
88 extern int kmp_d_debug;
89 extern int kmp_e_debug;
90 extern int kmp_f_debug;
91 extern int kmp_diag;
92
93 #define KA_TRACE(d,x) if (kmp_a_debug >= d) { __kmp_debug_printf x ; }
94 #define KB_TRACE(d,x) if (kmp_b_debug >= d) { __kmp_debug_printf x ; }
95 #define KC_TRACE(d,x) if (kmp_c_debug >= d) { __kmp_debug_printf x ; }
96 #define KD_TRACE(d,x) if (kmp_d_debug >= d) { __kmp_debug_printf x ; }
97 #define KE_TRACE(d,x) if (kmp_e_debug >= d) { __kmp_debug_printf x ; }
98 #define KF_TRACE(d,x) if (kmp_f_debug >= d) { __kmp_debug_printf x ; }
99 #define K_DIAG(d,x) {if (kmp_diag == d) { __kmp_debug_printf_stdout x ; } }
100
101 #define KA_DUMP(d,x) if (kmp_a_debug >= d) { int ks; __kmp_disable(&ks); (x) ; __kmp_enable(ks); }
102 #define KB_DUMP(d,x) if (kmp_b_debug >= d) { int ks; __kmp_disable(&ks); (x) ; __kmp_enable(ks); }
103 #define KC_DUMP(d,x) if (kmp_c_debug >= d) { int ks; __kmp_disable(&ks); (x) ; __kmp_enable(ks); }
104 #define KD_DUMP(d,x) if (kmp_d_debug >= d) { int ks; __kmp_disable(&ks); (x) ; __kmp_enable(ks); }
105 #define KE_DUMP(d,x) if (kmp_e_debug >= d) { int ks; __kmp_disable(&ks); (x) ; __kmp_enable(ks); }
106 #define KF_DUMP(d,x) if (kmp_f_debug >= d) { int ks; __kmp_disable(&ks); (x) ; __kmp_enable(ks); }
107
108#else
109
110 #define KA_TRACE(d,x) /* nothing to do */
111 #define KB_TRACE(d,x) /* nothing to do */
112 #define KC_TRACE(d,x) /* nothing to do */
113 #define KD_TRACE(d,x) /* nothing to do */
114 #define KE_TRACE(d,x) /* nothing to do */
115 #define KF_TRACE(d,x) /* nothing to do */
116 #define K_DIAG(d,x) {}/* nothing to do */
117
118 #define KA_DUMP(d,x) /* nothing to do */
119 #define KB_DUMP(d,x) /* nothing to do */
120 #define KC_DUMP(d,x) /* nothing to do */
121 #define KD_DUMP(d,x) /* nothing to do */
122 #define KE_DUMP(d,x) /* nothing to do */
123 #define KF_DUMP(d,x) /* nothing to do */
124
125#endif // KMP_DEBUG
126
127#ifdef __cplusplus
128 } // extern "C"
129#endif // __cplusplus
130
131#endif /* KMP_DEBUG_H */