Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/openmp/runtime/src/kmp_debug.cpp
35258 views
1
/*
2
* kmp_debug.cpp -- debug utilities for the Guide 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
#include "kmp.h"
14
#include "kmp_debug.h" /* really necessary? */
15
#include "kmp_i18n.h"
16
#include "kmp_io.h"
17
18
#ifdef KMP_DEBUG
19
void __kmp_debug_printf_stdout(char const *format, ...) {
20
va_list ap;
21
va_start(ap, format);
22
23
__kmp_vprintf(kmp_out, format, ap);
24
25
va_end(ap);
26
}
27
#endif
28
29
void __kmp_debug_printf(char const *format, ...) {
30
va_list ap;
31
va_start(ap, format);
32
33
__kmp_vprintf(kmp_err, format, ap);
34
35
va_end(ap);
36
}
37
38
#ifdef KMP_USE_ASSERT
39
int __kmp_debug_assert(char const *msg, char const *file, int line) {
40
41
if (file == NULL) {
42
file = KMP_I18N_STR(UnknownFile);
43
} else {
44
// Remove directories from path, leave only file name. File name is enough,
45
// there is no need in bothering developers and customers with full paths.
46
char const *slash = strrchr(file, '/');
47
if (slash != NULL) {
48
file = slash + 1;
49
}
50
}
51
52
#ifdef KMP_DEBUG
53
__kmp_acquire_bootstrap_lock(&__kmp_stdio_lock);
54
__kmp_debug_printf("Assertion failure at %s(%d): %s.\n", file, line, msg);
55
__kmp_release_bootstrap_lock(&__kmp_stdio_lock);
56
#ifdef USE_ASSERT_BREAK
57
#if KMP_OS_WINDOWS
58
DebugBreak();
59
#endif
60
#endif // USE_ASSERT_BREAK
61
#ifdef USE_ASSERT_STALL
62
/* __kmp_infinite_loop(); */
63
for (;;)
64
;
65
#endif // USE_ASSERT_STALL
66
#ifdef USE_ASSERT_SEG
67
{
68
int volatile *ZERO = (int *)0;
69
++(*ZERO);
70
}
71
#endif // USE_ASSERT_SEG
72
#endif
73
74
__kmp_fatal(KMP_MSG(AssertionFailure, file, line), KMP_HNT(SubmitBugReport),
75
__kmp_msg_null);
76
77
return 0;
78
79
} // __kmp_debug_assert
80
81
#endif // KMP_USE_ASSERT
82
83
/* Dump debugging buffer to stderr */
84
void __kmp_dump_debug_buffer(void) {
85
if (__kmp_debug_buffer != NULL) {
86
int i;
87
int dc = __kmp_debug_count;
88
char *db = &__kmp_debug_buffer[(dc % __kmp_debug_buf_lines) *
89
__kmp_debug_buf_chars];
90
char *db_end =
91
&__kmp_debug_buffer[__kmp_debug_buf_lines * __kmp_debug_buf_chars];
92
char *db2;
93
94
__kmp_acquire_bootstrap_lock(&__kmp_stdio_lock);
95
__kmp_printf_no_lock("\nStart dump of debugging buffer (entry=%d):\n",
96
dc % __kmp_debug_buf_lines);
97
98
for (i = 0; i < __kmp_debug_buf_lines; i++) {
99
100
if (*db != '\0') {
101
/* Fix up where no carriage return before string termination char */
102
for (db2 = db + 1; db2 < db + __kmp_debug_buf_chars - 1; db2++) {
103
if (*db2 == '\0') {
104
if (*(db2 - 1) != '\n') {
105
*db2 = '\n';
106
*(db2 + 1) = '\0';
107
}
108
break;
109
}
110
}
111
/* Handle case at end by shortening the printed message by one char if
112
* necessary */
113
if (db2 == db + __kmp_debug_buf_chars - 1 && *db2 == '\0' &&
114
*(db2 - 1) != '\n') {
115
*(db2 - 1) = '\n';
116
}
117
118
__kmp_printf_no_lock("%4d: %.*s", i, __kmp_debug_buf_chars, db);
119
*db = '\0'; /* only let it print once! */
120
}
121
122
db += __kmp_debug_buf_chars;
123
if (db >= db_end)
124
db = __kmp_debug_buffer;
125
}
126
127
__kmp_printf_no_lock("End dump of debugging buffer (entry=%d).\n\n",
128
(dc + i - 1) % __kmp_debug_buf_lines);
129
__kmp_release_bootstrap_lock(&__kmp_stdio_lock);
130
}
131
}
132
133