123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /*
- * kmp_debug.cpp -- debug utilities for the Guide 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
- //
- //===----------------------------------------------------------------------===//
- #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);
- }
- }
|