/*
 * kmp_error.cpp -- KPTS functions for error checking at runtime
 */

//===----------------------------------------------------------------------===//
//
// 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_error.h"
#include "kmp_i18n.h"
#include "kmp_str.h"

/* ------------------------------------------------------------------------ */

#define MIN_STACK 100

static char const *cons_text_c[] = {
    "(none)", "\"parallel\"", "work-sharing", /* this is not called "for"
                                                 because of lowering of
                                                 "sections" pragmas */
    "\"ordered\" work-sharing", /* this is not called "for ordered" because of
                                   lowering of "sections" pragmas */
    "\"sections\"",
    "work-sharing", /* this is not called "single" because of lowering of
                       "sections" pragmas */
    "\"critical\"", "\"ordered\"", /* in PARALLEL */
    "\"ordered\"", /* in PDO */
    "\"master\"", "\"reduce\"", "\"barrier\""};

#define get_src(ident) ((ident) == NULL ? NULL : (ident)->psource)

#define PUSH_MSG(ct, ident)                                                    \
  "\tpushing on stack: %s (%s)\n", cons_text_c[(ct)], get_src((ident))
#define POP_MSG(p)                                                             \
  "\tpopping off stack: %s (%s)\n", cons_text_c[(p)->stack_data[tos].type],    \
      get_src((p)->stack_data[tos].ident)

static int const cons_text_c_num = sizeof(cons_text_c) / sizeof(char const *);

/* --------------- START OF STATIC LOCAL ROUTINES ------------------------- */

static void __kmp_check_null_func(void) { /* nothing to do */
}

static void __kmp_expand_cons_stack(int gtid, struct cons_header *p) {
  int i;
  struct cons_data *d;

  /* TODO for monitor perhaps? */
  if (gtid < 0)
    __kmp_check_null_func();

  KE_TRACE(10, ("expand cons_stack (%d %d)\n", gtid, __kmp_get_gtid()));

  d = p->stack_data;

  p->stack_size = (p->stack_size * 2) + 100;

  /* TODO free the old data */
  p->stack_data = (struct cons_data *)__kmp_allocate(sizeof(struct cons_data) *
                                                     (p->stack_size + 1));

  for (i = p->stack_top; i >= 0; --i)
    p->stack_data[i] = d[i];

  /* NOTE: we do not free the old stack_data */
}

// NOTE: Function returns allocated memory, caller must free it!
static char *__kmp_pragma(int ct, ident_t const *ident) {
  char const *cons = NULL; // Construct name.
  char *file = NULL; // File name.
  char *func = NULL; // Function (routine) name.
  char *line = NULL; // Line number.
  kmp_str_buf_t buffer;
  kmp_msg_t prgm;
  __kmp_str_buf_init(&buffer);
  if (0 < ct && ct < cons_text_c_num) {
    cons = cons_text_c[ct];
  } else {
    KMP_DEBUG_ASSERT(0);
  }
  if (ident != NULL && ident->psource != NULL) {
    char *tail = NULL;
    __kmp_str_buf_print(&buffer, "%s",
                        ident->psource); // Copy source to buffer.
    // Split string in buffer to file, func, and line.
    tail = buffer.str;
    __kmp_str_split(tail, ';', NULL, &tail);
    __kmp_str_split(tail, ';', &file, &tail);
    __kmp_str_split(tail, ';', &func, &tail);
    __kmp_str_split(tail, ';', &line, &tail);
  }
  prgm = __kmp_msg_format(kmp_i18n_fmt_Pragma, cons, file, func, line);
  __kmp_str_buf_free(&buffer);
  return prgm.str;
} // __kmp_pragma

/* ----------------- END OF STATIC LOCAL ROUTINES ------------------------- */

void __kmp_error_construct(kmp_i18n_id_t id, // Message identifier.
                           enum cons_type ct, // Construct type.
                           ident_t const *ident // Construct ident.
                           ) {
  char *construct = __kmp_pragma(ct, ident);
  __kmp_fatal(__kmp_msg_format(id, construct), __kmp_msg_null);
  KMP_INTERNAL_FREE(construct);
}

void __kmp_error_construct2(kmp_i18n_id_t id, // Message identifier.
                            enum cons_type ct, // First construct type.
                            ident_t const *ident, // First construct ident.
                            struct cons_data const *cons // Second construct.
                            ) {
  char *construct1 = __kmp_pragma(ct, ident);
  char *construct2 = __kmp_pragma(cons->type, cons->ident);
  __kmp_fatal(__kmp_msg_format(id, construct1, construct2), __kmp_msg_null);
  KMP_INTERNAL_FREE(construct1);
  KMP_INTERNAL_FREE(construct2);
}

struct cons_header *__kmp_allocate_cons_stack(int gtid) {
  struct cons_header *p;

  /* TODO for monitor perhaps? */
  if (gtid < 0) {
    __kmp_check_null_func();
  }
  KE_TRACE(10, ("allocate cons_stack (%d)\n", gtid));
  p = (struct cons_header *)__kmp_allocate(sizeof(struct cons_header));
  p->p_top = p->w_top = p->s_top = 0;
  p->stack_data = (struct cons_data *)__kmp_allocate(sizeof(struct cons_data) *
                                                     (MIN_STACK + 1));
  p->stack_size = MIN_STACK;
  p->stack_top = 0;
  p->stack_data[0].type = ct_none;
  p->stack_data[0].prev = 0;
  p->stack_data[0].ident = NULL;
  return p;
}

void __kmp_free_cons_stack(void *ptr) {
  struct cons_header *p = (struct cons_header *)ptr;
  if (p != NULL) {
    if (p->stack_data != NULL) {
      __kmp_free(p->stack_data);
      p->stack_data = NULL;
    }
    __kmp_free(p);
  }
}

#if KMP_DEBUG
static void dump_cons_stack(int gtid, struct cons_header *p) {
  int i;
  int tos = p->stack_top;
  kmp_str_buf_t buffer;
  __kmp_str_buf_init(&buffer);
  __kmp_str_buf_print(
      &buffer,
      "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\n");
  __kmp_str_buf_print(&buffer,
                      "Begin construct stack with %d items for thread %d\n",
                      tos, gtid);
  __kmp_str_buf_print(&buffer, "     stack_top=%d { P=%d, W=%d, S=%d }\n", tos,
                      p->p_top, p->w_top, p->s_top);
  for (i = tos; i > 0; i--) {
    struct cons_data *c = &(p->stack_data[i]);
    __kmp_str_buf_print(
        &buffer, "        stack_data[%2d] = { %s (%s) %d %p }\n", i,
        cons_text_c[c->type], get_src(c->ident), c->prev, c->name);
  }
  __kmp_str_buf_print(&buffer, "End construct stack for thread %d\n", gtid);
  __kmp_str_buf_print(
      &buffer,
      "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\n");
  __kmp_debug_printf("%s", buffer.str);
  __kmp_str_buf_free(&buffer);
}
#endif

void __kmp_push_parallel(int gtid, ident_t const *ident) {
  int tos;
  struct cons_header *p = __kmp_threads[gtid]->th.th_cons;

  KMP_DEBUG_ASSERT(__kmp_threads[gtid]->th.th_cons);
  KE_TRACE(10, ("__kmp_push_parallel (%d %d)\n", gtid, __kmp_get_gtid()));
  KE_TRACE(100, (PUSH_MSG(ct_parallel, ident)));
  if (p->stack_top >= p->stack_size) {
    __kmp_expand_cons_stack(gtid, p);
  }
  tos = ++p->stack_top;
  p->stack_data[tos].type = ct_parallel;
  p->stack_data[tos].prev = p->p_top;
  p->stack_data[tos].ident = ident;
  p->stack_data[tos].name = NULL;
  p->p_top = tos;
  KE_DUMP(1000, dump_cons_stack(gtid, p));
}

void __kmp_check_workshare(int gtid, enum cons_type ct, ident_t const *ident) {
  struct cons_header *p = __kmp_threads[gtid]->th.th_cons;

  KMP_DEBUG_ASSERT(__kmp_threads[gtid]->th.th_cons);
  KE_TRACE(10, ("__kmp_check_workshare (%d %d)\n", gtid, __kmp_get_gtid()));

  if (p->stack_top >= p->stack_size) {
    __kmp_expand_cons_stack(gtid, p);
  }
  if (p->w_top > p->p_top) {
    // We are already in a WORKSHARE construct for this PARALLEL region.
    __kmp_error_construct2(kmp_i18n_msg_CnsInvalidNesting, ct, ident,
                           &p->stack_data[p->w_top]);
  }
  if (p->s_top > p->p_top) {
    // We are already in a SYNC construct for this PARALLEL region.
    __kmp_error_construct2(kmp_i18n_msg_CnsInvalidNesting, ct, ident,
                           &p->stack_data[p->s_top]);
  }
}

void __kmp_push_workshare(int gtid, enum cons_type ct, ident_t const *ident) {
  int tos;
  struct cons_header *p = __kmp_threads[gtid]->th.th_cons;
  KE_TRACE(10, ("__kmp_push_workshare (%d %d)\n", gtid, __kmp_get_gtid()));
  __kmp_check_workshare(gtid, ct, ident);
  KE_TRACE(100, (PUSH_MSG(ct, ident)));
  tos = ++p->stack_top;
  p->stack_data[tos].type = ct;
  p->stack_data[tos].prev = p->w_top;
  p->stack_data[tos].ident = ident;
  p->stack_data[tos].name = NULL;
  p->w_top = tos;
  KE_DUMP(1000, dump_cons_stack(gtid, p));
}

void
#if KMP_USE_DYNAMIC_LOCK
__kmp_check_sync( int gtid, enum cons_type ct, ident_t const * ident, kmp_user_lock_p lck, kmp_uint32 seq )
#else
__kmp_check_sync( int gtid, enum cons_type ct, ident_t const * ident, kmp_user_lock_p lck )
#endif
{
  struct cons_header *p = __kmp_threads[gtid]->th.th_cons;

  KE_TRACE(10, ("__kmp_check_sync (gtid=%d)\n", __kmp_get_gtid()));

  if (p->stack_top >= p->stack_size)
    __kmp_expand_cons_stack(gtid, p);

  if (ct == ct_ordered_in_parallel || ct == ct_ordered_in_pdo) {
    if (p->w_top <= p->p_top) {
/* we are not in a worksharing construct */
#ifdef BUILD_PARALLEL_ORDERED
      /* do not report error messages for PARALLEL ORDERED */
      KMP_ASSERT(ct == ct_ordered_in_parallel);
#else
      __kmp_error_construct(kmp_i18n_msg_CnsBoundToWorksharing, ct, ident);
#endif /* BUILD_PARALLEL_ORDERED */
    } else {
      /* inside a WORKSHARING construct for this PARALLEL region */
      if (!IS_CONS_TYPE_ORDERED(p->stack_data[p->w_top].type)) {
        __kmp_error_construct2(kmp_i18n_msg_CnsNoOrderedClause, ct, ident,
                               &p->stack_data[p->w_top]);
      }
    }
    if (p->s_top > p->p_top && p->s_top > p->w_top) {
      /* inside a sync construct which is inside a worksharing construct */
      int index = p->s_top;
      enum cons_type stack_type;

      stack_type = p->stack_data[index].type;

      if (stack_type == ct_critical ||
          ((stack_type == ct_ordered_in_parallel ||
            stack_type == ct_ordered_in_pdo) &&
           /* C doesn't allow named ordered; ordered in ordered gets error */
           p->stack_data[index].ident != NULL &&
           (p->stack_data[index].ident->flags & KMP_IDENT_KMPC))) {
        /* we are in ORDERED which is inside an ORDERED or CRITICAL construct */
        __kmp_error_construct2(kmp_i18n_msg_CnsInvalidNesting, ct, ident,
                               &p->stack_data[index]);
      }
    }
  } else if (ct == ct_critical) {
#if KMP_USE_DYNAMIC_LOCK
    if (lck != NULL &&
        __kmp_get_user_lock_owner(lck, seq) ==
            gtid) { /* this thread already has lock for this critical section */
#else
    if (lck != NULL &&
        __kmp_get_user_lock_owner(lck) ==
            gtid) { /* this thread already has lock for this critical section */
#endif
      int index = p->s_top;
      struct cons_data cons = {NULL, ct_critical, 0, NULL};
      /* walk up construct stack and try to find critical with matching name */
      while (index != 0 && p->stack_data[index].name != lck) {
        index = p->stack_data[index].prev;
      }
      if (index != 0) {
        /* found match on the stack (may not always because of interleaved
         * critical for Fortran) */
        cons = p->stack_data[index];
      }
      /* we are in CRITICAL which is inside a CRITICAL construct of same name */
      __kmp_error_construct2(kmp_i18n_msg_CnsNestingSameName, ct, ident, &cons);
    }
  } else if (ct == ct_master || ct == ct_reduce) {
    if (p->w_top > p->p_top) {
      /* inside a WORKSHARING construct for this PARALLEL region */
      __kmp_error_construct2(kmp_i18n_msg_CnsInvalidNesting, ct, ident,
                             &p->stack_data[p->w_top]);
    }
    if (ct == ct_reduce && p->s_top > p->p_top) {
      /* inside a another SYNC construct for this PARALLEL region */
      __kmp_error_construct2(kmp_i18n_msg_CnsInvalidNesting, ct, ident,
                             &p->stack_data[p->s_top]);
    }
  }
}

void
#if KMP_USE_DYNAMIC_LOCK
__kmp_push_sync( int gtid, enum cons_type ct, ident_t const * ident, kmp_user_lock_p lck, kmp_uint32 seq )
#else
__kmp_push_sync( int gtid, enum cons_type ct, ident_t const * ident, kmp_user_lock_p lck )
#endif
{
  int tos;
  struct cons_header *p = __kmp_threads[gtid]->th.th_cons;

  KMP_ASSERT(gtid == __kmp_get_gtid());
  KE_TRACE(10, ("__kmp_push_sync (gtid=%d)\n", gtid));
#if KMP_USE_DYNAMIC_LOCK
  __kmp_check_sync(gtid, ct, ident, lck, seq);
#else
  __kmp_check_sync(gtid, ct, ident, lck);
#endif
  KE_TRACE(100, (PUSH_MSG(ct, ident)));
  tos = ++p->stack_top;
  p->stack_data[tos].type = ct;
  p->stack_data[tos].prev = p->s_top;
  p->stack_data[tos].ident = ident;
  p->stack_data[tos].name = lck;
  p->s_top = tos;
  KE_DUMP(1000, dump_cons_stack(gtid, p));
}

/* ------------------------------------------------------------------------ */

void __kmp_pop_parallel(int gtid, ident_t const *ident) {
  int tos;
  struct cons_header *p = __kmp_threads[gtid]->th.th_cons;
  tos = p->stack_top;
  KE_TRACE(10, ("__kmp_pop_parallel (%d %d)\n", gtid, __kmp_get_gtid()));
  if (tos == 0 || p->p_top == 0) {
    __kmp_error_construct(kmp_i18n_msg_CnsDetectedEnd, ct_parallel, ident);
  }
  if (tos != p->p_top || p->stack_data[tos].type != ct_parallel) {
    __kmp_error_construct2(kmp_i18n_msg_CnsExpectedEnd, ct_parallel, ident,
                           &p->stack_data[tos]);
  }
  KE_TRACE(100, (POP_MSG(p)));
  p->p_top = p->stack_data[tos].prev;
  p->stack_data[tos].type = ct_none;
  p->stack_data[tos].ident = NULL;
  p->stack_top = tos - 1;
  KE_DUMP(1000, dump_cons_stack(gtid, p));
}

enum cons_type __kmp_pop_workshare(int gtid, enum cons_type ct,
                                   ident_t const *ident) {
  int tos;
  struct cons_header *p = __kmp_threads[gtid]->th.th_cons;

  tos = p->stack_top;
  KE_TRACE(10, ("__kmp_pop_workshare (%d %d)\n", gtid, __kmp_get_gtid()));
  if (tos == 0 || p->w_top == 0) {
    __kmp_error_construct(kmp_i18n_msg_CnsDetectedEnd, ct, ident);
  }

  if (tos != p->w_top ||
      (p->stack_data[tos].type != ct &&
       // below is the exception to the rule that construct types must match
       !(p->stack_data[tos].type == ct_pdo_ordered && ct == ct_pdo))) {
    __kmp_check_null_func();
    __kmp_error_construct2(kmp_i18n_msg_CnsExpectedEnd, ct, ident,
                           &p->stack_data[tos]);
  }
  KE_TRACE(100, (POP_MSG(p)));
  p->w_top = p->stack_data[tos].prev;
  p->stack_data[tos].type = ct_none;
  p->stack_data[tos].ident = NULL;
  p->stack_top = tos - 1;
  KE_DUMP(1000, dump_cons_stack(gtid, p));
  return p->stack_data[p->w_top].type;
}

void __kmp_pop_sync(int gtid, enum cons_type ct, ident_t const *ident) {
  int tos;
  struct cons_header *p = __kmp_threads[gtid]->th.th_cons;
  tos = p->stack_top;
  KE_TRACE(10, ("__kmp_pop_sync (%d %d)\n", gtid, __kmp_get_gtid()));
  if (tos == 0 || p->s_top == 0) {
    __kmp_error_construct(kmp_i18n_msg_CnsDetectedEnd, ct, ident);
  }
  if (tos != p->s_top || p->stack_data[tos].type != ct) {
    __kmp_check_null_func();
    __kmp_error_construct2(kmp_i18n_msg_CnsExpectedEnd, ct, ident,
                           &p->stack_data[tos]);
  }
  KE_TRACE(100, (POP_MSG(p)));
  p->s_top = p->stack_data[tos].prev;
  p->stack_data[tos].type = ct_none;
  p->stack_data[tos].ident = NULL;
  p->stack_top = tos - 1;
  KE_DUMP(1000, dump_cons_stack(gtid, p));
}

/* ------------------------------------------------------------------------ */

void __kmp_check_barrier(int gtid, enum cons_type ct, ident_t const *ident) {
  struct cons_header *p = __kmp_threads[gtid]->th.th_cons;
  KE_TRACE(10, ("__kmp_check_barrier (loc: %p, gtid: %d %d)\n", ident, gtid,
                __kmp_get_gtid()));
  if (ident != 0) {
    __kmp_check_null_func();
  }
  if (p->w_top > p->p_top) {
    /* we are already in a WORKSHARING construct for this PARALLEL region */
    __kmp_error_construct2(kmp_i18n_msg_CnsInvalidNesting, ct, ident,
                           &p->stack_data[p->w_top]);
  }
  if (p->s_top > p->p_top) {
    /* we are already in a SYNC construct for this PARALLEL region */
    __kmp_error_construct2(kmp_i18n_msg_CnsInvalidNesting, ct, ident,
                           &p->stack_data[p->s_top]);
  }
}
