1/*
2 * kmp_debug.h -- debug / assertion code for Assure library
3 */
4
5//===----------------------------------------------------------------------===//
6//
7// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8// See https://llvm.org/LICENSE.txt for license information.
9// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef KMP_DEBUG_H
14#define KMP_DEBUG_H
15
16#include <stdarg.h>
17
18#ifdef __cplusplus
19extern "C" {
20#endif // __cplusplus
21
22// -----------------------------------------------------------------------------
23// Build-time assertion.
24
25// New C++11 style build assert
26#define KMP_BUILD_ASSERT(expr) static_assert(expr, "Build condition error")
27
28// -----------------------------------------------------------------------------
29// Run-time assertions.
30
31extern void __kmp_dump_debug_buffer(void);
32
33#ifdef KMP_USE_ASSERT
34extern int __kmp_debug_assert(char const *expr, char const *file, int line);
35#ifdef KMP_DEBUG
36#define KMP_ASSERT(cond)                                                       \
37  if (!(cond)) {                                                               \
38    __kmp_debug_assert(#cond, __FILE__, __LINE__);                             \
39  }
40#define KMP_ASSERT2(cond, msg)                                                 \
41  if (!(cond)) {                                                               \
42    __kmp_debug_assert((msg), __FILE__, __LINE__);                             \
43  }
44#define KMP_DEBUG_ASSERT(cond) KMP_ASSERT(cond)
45#define KMP_DEBUG_ASSERT2(cond, msg) KMP_ASSERT2(cond, msg)
46#define KMP_DEBUG_USE_VAR(x) /* Nothing (it is used!) */
47#else
48// Do not expose condition in release build. Use "assertion failure".
49#define KMP_ASSERT(cond)                                                       \
50  if (!(cond)) {                                                               \
51    __kmp_debug_assert("assertion failure", __FILE__, __LINE__);               \
52  }
53#define KMP_ASSERT2(cond, msg) KMP_ASSERT(cond)
54#define KMP_DEBUG_ASSERT(cond) /* Nothing */
55#define KMP_DEBUG_ASSERT2(cond, msg) /* Nothing */
56#define KMP_DEBUG_USE_VAR(x) ((void)(x))
57#endif // KMP_DEBUG
58#else
59#define KMP_ASSERT(cond) /* Nothing */
60#define KMP_ASSERT2(cond, msg) /* Nothing */
61#define KMP_DEBUG_ASSERT(cond) /* Nothing */
62#define KMP_DEBUG_ASSERT2(cond, msg) /* Nothing */
63#define KMP_DEBUG_USE_VAR(x) ((void)(x))
64#endif // KMP_USE_ASSERT
65
66#ifdef KMP_DEBUG
67extern void __kmp_debug_printf_stdout(char const *format, ...);
68#endif
69extern void __kmp_debug_printf(char const *format, ...);
70
71#ifdef KMP_DEBUG
72
73extern int kmp_a_debug;
74extern int kmp_b_debug;
75extern int kmp_c_debug;
76extern int kmp_d_debug;
77extern int kmp_e_debug;
78extern int kmp_f_debug;
79extern int kmp_diag;
80
81#define KA_TRACE(d, x)                                                         \
82  if (kmp_a_debug >= d) {                                                      \
83    __kmp_debug_printf x;                                                      \
84  }
85#define KB_TRACE(d, x)                                                         \
86  if (kmp_b_debug >= d) {                                                      \
87    __kmp_debug_printf x;                                                      \
88  }
89#define KC_TRACE(d, x)                                                         \
90  if (kmp_c_debug >= d) {                                                      \
91    __kmp_debug_printf x;                                                      \
92  }
93#define KD_TRACE(d, x)                                                         \
94  if (kmp_d_debug >= d) {                                                      \
95    __kmp_debug_printf x;                                                      \
96  }
97#define KE_TRACE(d, x)                                                         \
98  if (kmp_e_debug >= d) {                                                      \
99    __kmp_debug_printf x;                                                      \
100  }
101#define KF_TRACE(d, x)                                                         \
102  if (kmp_f_debug >= d) {                                                      \
103    __kmp_debug_printf x;                                                      \
104  }
105#define K_DIAG(d, x)                                                           \
106  {                                                                            \
107    if (kmp_diag == d) {                                                       \
108      __kmp_debug_printf_stdout x;                                             \
109    }                                                                          \
110  }
111
112#define KA_DUMP(d, x)                                                          \
113  if (kmp_a_debug >= d) {                                                      \
114    int ks;                                                                    \
115    __kmp_disable(&ks);                                                        \
116    (x);                                                                       \
117    __kmp_enable(ks);                                                          \
118  }
119#define KB_DUMP(d, x)                                                          \
120  if (kmp_b_debug >= d) {                                                      \
121    int ks;                                                                    \
122    __kmp_disable(&ks);                                                        \
123    (x);                                                                       \
124    __kmp_enable(ks);                                                          \
125  }
126#define KC_DUMP(d, x)                                                          \
127  if (kmp_c_debug >= d) {                                                      \
128    int ks;                                                                    \
129    __kmp_disable(&ks);                                                        \
130    (x);                                                                       \
131    __kmp_enable(ks);                                                          \
132  }
133#define KD_DUMP(d, x)                                                          \
134  if (kmp_d_debug >= d) {                                                      \
135    int ks;                                                                    \
136    __kmp_disable(&ks);                                                        \
137    (x);                                                                       \
138    __kmp_enable(ks);                                                          \
139  }
140#define KE_DUMP(d, x)                                                          \
141  if (kmp_e_debug >= d) {                                                      \
142    int ks;                                                                    \
143    __kmp_disable(&ks);                                                        \
144    (x);                                                                       \
145    __kmp_enable(ks);                                                          \
146  }
147#define KF_DUMP(d, x)                                                          \
148  if (kmp_f_debug >= d) {                                                      \
149    int ks;                                                                    \
150    __kmp_disable(&ks);                                                        \
151    (x);                                                                       \
152    __kmp_enable(ks);                                                          \
153  }
154
155#else
156
157#define KA_TRACE(d, x) /* nothing to do */
158#define KB_TRACE(d, x) /* nothing to do */
159#define KC_TRACE(d, x) /* nothing to do */
160#define KD_TRACE(d, x) /* nothing to do */
161#define KE_TRACE(d, x) /* nothing to do */
162#define KF_TRACE(d, x) /* nothing to do */
163#define K_DIAG(d, x)                                                           \
164  {} /* nothing to do */
165
166#define KA_DUMP(d, x) /* nothing to do */
167#define KB_DUMP(d, x) /* nothing to do */
168#define KC_DUMP(d, x) /* nothing to do */
169#define KD_DUMP(d, x) /* nothing to do */
170#define KE_DUMP(d, x) /* nothing to do */
171#define KF_DUMP(d, x) /* nothing to do */
172
173#endif // KMP_DEBUG
174
175#ifdef __cplusplus
176} // extern "C"
177#endif // __cplusplus
178
179#endif /* KMP_DEBUG_H */
180