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