|  | /* | 
|  | * 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); | 
|  | } | 
|  | } |