aboutsummaryrefslogtreecommitdiff
path: root/final/runtime/src/kmp_debug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'final/runtime/src/kmp_debug.cpp')
-rw-r--r--final/runtime/src/kmp_debug.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/final/runtime/src/kmp_debug.cpp b/final/runtime/src/kmp_debug.cpp
new file mode 100644
index 0000000..50d3876
--- /dev/null
+++ b/final/runtime/src/kmp_debug.cpp
@@ -0,0 +1,132 @@
+/*
+ * kmp_debug.cpp -- debug utilities for the Guide library
+ */
+
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "kmp.h"
+#include "kmp_debug.h" /* really necessary? */
+#include "kmp_i18n.h"
+#include "kmp_io.h"
+
+#ifdef KMP_DEBUG
+void __kmp_debug_printf_stdout(char const *format, ...) {
+ va_list ap;
+ va_start(ap, format);
+
+ __kmp_vprintf(kmp_out, format, ap);
+
+ va_end(ap);
+}
+#endif
+
+void __kmp_debug_printf(char const *format, ...) {
+ va_list ap;
+ va_start(ap, format);
+
+ __kmp_vprintf(kmp_err, format, ap);
+
+ va_end(ap);
+}
+
+#ifdef KMP_USE_ASSERT
+int __kmp_debug_assert(char const *msg, char const *file, int line) {
+
+ if (file == NULL) {
+ file = KMP_I18N_STR(UnknownFile);
+ } else {
+ // Remove directories from path, leave only file name. File name is enough,
+ // there is no need in bothering developers and customers with full paths.
+ char const *slash = strrchr(file, '/');
+ if (slash != NULL) {
+ file = slash + 1;
+ }
+ }
+
+#ifdef KMP_DEBUG
+ __kmp_acquire_bootstrap_lock(&__kmp_stdio_lock);
+ __kmp_debug_printf("Assertion failure at %s(%d): %s.\n", file, line, msg);
+ __kmp_release_bootstrap_lock(&__kmp_stdio_lock);
+#ifdef USE_ASSERT_BREAK
+#if KMP_OS_WINDOWS
+ DebugBreak();
+#endif
+#endif // USE_ASSERT_BREAK
+#ifdef USE_ASSERT_STALL
+ /* __kmp_infinite_loop(); */
+ for (;;)
+ ;
+#endif // USE_ASSERT_STALL
+#ifdef USE_ASSERT_SEG
+ {
+ int volatile *ZERO = (int *)0;
+ ++(*ZERO);
+ }
+#endif // USE_ASSERT_SEG
+#endif
+
+ __kmp_fatal(KMP_MSG(AssertionFailure, file, line), KMP_HNT(SubmitBugReport),
+ __kmp_msg_null);
+
+ return 0;
+
+} // __kmp_debug_assert
+
+#endif // KMP_USE_ASSERT
+
+/* Dump debugging buffer to stderr */
+void __kmp_dump_debug_buffer(void) {
+ if (__kmp_debug_buffer != NULL) {
+ int i;
+ int dc = __kmp_debug_count;
+ char *db = &__kmp_debug_buffer[(dc % __kmp_debug_buf_lines) *
+ __kmp_debug_buf_chars];
+ char *db_end =
+ &__kmp_debug_buffer[__kmp_debug_buf_lines * __kmp_debug_buf_chars];
+ char *db2;
+
+ __kmp_acquire_bootstrap_lock(&__kmp_stdio_lock);
+ __kmp_printf_no_lock("\nStart dump of debugging buffer (entry=%d):\n",
+ dc % __kmp_debug_buf_lines);
+
+ for (i = 0; i < __kmp_debug_buf_lines; i++) {
+
+ if (*db != '\0') {
+ /* Fix up where no carriage return before string termination char */
+ for (db2 = db + 1; db2 < db + __kmp_debug_buf_chars - 1; db2++) {
+ if (*db2 == '\0') {
+ if (*(db2 - 1) != '\n') {
+ *db2 = '\n';
+ *(db2 + 1) = '\0';
+ }
+ break;
+ }
+ }
+ /* Handle case at end by shortening the printed message by one char if
+ * necessary */
+ if (db2 == db + __kmp_debug_buf_chars - 1 && *db2 == '\0' &&
+ *(db2 - 1) != '\n') {
+ *(db2 - 1) = '\n';
+ }
+
+ __kmp_printf_no_lock("%4d: %.*s", i, __kmp_debug_buf_chars, db);
+ *db = '\0'; /* only let it print once! */
+ }
+
+ db += __kmp_debug_buf_chars;
+ if (db >= db_end)
+ db = __kmp_debug_buffer;
+ }
+
+ __kmp_printf_no_lock("End dump of debugging buffer (entry=%d).\n\n",
+ (dc + i - 1) % __kmp_debug_buf_lines);
+ __kmp_release_bootstrap_lock(&__kmp_stdio_lock);
+ }
+}