aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/kmp_debug.h
blob: 08d52cc04a108d96a31fb60f7d738c14b01eebaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/*
 * kmp_debug.h -- debug / assertion code for Assure library
 */

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef KMP_DEBUG_H
#define KMP_DEBUG_H

#include <stdarg.h>

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

// -----------------------------------------------------------------------------
// Build-time assertion.

// New C++11 style build assert
#define KMP_BUILD_ASSERT(expr) static_assert(expr, "Build condition error")

// -----------------------------------------------------------------------------
// Run-time assertions.

extern void __kmp_dump_debug_buffer(void);

#ifdef KMP_USE_ASSERT
extern int __kmp_debug_assert(char const *expr, char const *file, int line);
#ifdef KMP_DEBUG
#define KMP_ASSERT(cond)                                                       \
  if (!(cond)) {                                                               \
    __kmp_debug_assert(#cond, __FILE__, __LINE__);                             \
  }
#define KMP_ASSERT2(cond, msg)                                                 \
  if (!(cond)) {                                                               \
    __kmp_debug_assert((msg), __FILE__, __LINE__);                             \
  }
#define KMP_DEBUG_ASSERT(cond) KMP_ASSERT(cond)
#define KMP_DEBUG_ASSERT2(cond, msg) KMP_ASSERT2(cond, msg)
#define KMP_DEBUG_USE_VAR(x) /* Nothing (it is used!) */
#else
// Do not expose condition in release build. Use "assertion failure".
#define KMP_ASSERT(cond)                                                       \
  if (!(cond)) {                                                               \
    __kmp_debug_assert("assertion failure", __FILE__, __LINE__);               \
  }
#define KMP_ASSERT2(cond, msg) KMP_ASSERT(cond)
#define KMP_DEBUG_ASSERT(cond) /* Nothing */
#define KMP_DEBUG_ASSERT2(cond, msg) /* Nothing */
#define KMP_DEBUG_USE_VAR(x) ((void)(x))
#endif // KMP_DEBUG
#else
#define KMP_ASSERT(cond) /* Nothing */
#define KMP_ASSERT2(cond, msg) /* Nothing */
#define KMP_DEBUG_ASSERT(cond) /* Nothing */
#define KMP_DEBUG_ASSERT2(cond, msg) /* Nothing */
#define KMP_DEBUG_USE_VAR(x) ((void)(x))
#endif // KMP_USE_ASSERT

#ifdef KMP_DEBUG
extern void __kmp_debug_printf_stdout(char const *format, ...);
#endif
extern void __kmp_debug_printf(char const *format, ...);

#ifdef KMP_DEBUG

extern int kmp_a_debug;
extern int kmp_b_debug;
extern int kmp_c_debug;
extern int kmp_d_debug;
extern int kmp_e_debug;
extern int kmp_f_debug;
extern int kmp_diag;

#define KA_TRACE(d, x)                                                         \
  if (kmp_a_debug >= d) {                                                      \
    __kmp_debug_printf x;                                                      \
  }
#define KB_TRACE(d, x)                                                         \
  if (kmp_b_debug >= d) {                                                      \
    __kmp_debug_printf x;                                                      \
  }
#define KC_TRACE(d, x)                                                         \
  if (kmp_c_debug >= d) {                                                      \
    __kmp_debug_printf x;                                                      \
  }
#define KD_TRACE(d, x)                                                         \
  if (kmp_d_debug >= d) {                                                      \
    __kmp_debug_printf x;                                                      \
  }
#define KE_TRACE(d, x)                                                         \
  if (kmp_e_debug >= d) {                                                      \
    __kmp_debug_printf x;                                                      \
  }
#define KF_TRACE(d, x)                                                         \
  if (kmp_f_debug >= d) {                                                      \
    __kmp_debug_printf x;                                                      \
  }
#define K_DIAG(d, x)                                                           \
  {                                                                            \
    if (kmp_diag == d) {                                                       \
      __kmp_debug_printf_stdout x;                                             \
    }                                                                          \
  }

#define KA_DUMP(d, x)                                                          \
  if (kmp_a_debug >= d) {                                                      \
    int ks;                                                                    \
    __kmp_disable(&ks);                                                        \
    (x);                                                                       \
    __kmp_enable(ks);                                                          \
  }
#define KB_DUMP(d, x)                                                          \
  if (kmp_b_debug >= d) {                                                      \
    int ks;                                                                    \
    __kmp_disable(&ks);                                                        \
    (x);                                                                       \
    __kmp_enable(ks);                                                          \
  }
#define KC_DUMP(d, x)                                                          \
  if (kmp_c_debug >= d) {                                                      \
    int ks;                                                                    \
    __kmp_disable(&ks);                                                        \
    (x);                                                                       \
    __kmp_enable(ks);                                                          \
  }
#define KD_DUMP(d, x)                                                          \
  if (kmp_d_debug >= d) {                                                      \
    int ks;                                                                    \
    __kmp_disable(&ks);                                                        \
    (x);                                                                       \
    __kmp_enable(ks);                                                          \
  }
#define KE_DUMP(d, x)                                                          \
  if (kmp_e_debug >= d) {                                                      \
    int ks;                                                                    \
    __kmp_disable(&ks);                                                        \
    (x);                                                                       \
    __kmp_enable(ks);                                                          \
  }
#define KF_DUMP(d, x)                                                          \
  if (kmp_f_debug >= d) {                                                      \
    int ks;                                                                    \
    __kmp_disable(&ks);                                                        \
    (x);                                                                       \
    __kmp_enable(ks);                                                          \
  }

#else

#define KA_TRACE(d, x) /* nothing to do */
#define KB_TRACE(d, x) /* nothing to do */
#define KC_TRACE(d, x) /* nothing to do */
#define KD_TRACE(d, x) /* nothing to do */
#define KE_TRACE(d, x) /* nothing to do */
#define KF_TRACE(d, x) /* nothing to do */
#define K_DIAG(d, x)                                                           \
  {} /* nothing to do */

#define KA_DUMP(d, x) /* nothing to do */
#define KB_DUMP(d, x) /* nothing to do */
#define KC_DUMP(d, x) /* nothing to do */
#define KD_DUMP(d, x) /* nothing to do */
#define KE_DUMP(d, x) /* nothing to do */
#define KF_DUMP(d, x) /* nothing to do */

#endif // KMP_DEBUG

#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus

#endif /* KMP_DEBUG_H */