//===-- tsan_debugging.cc -------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file is a part of ThreadSanitizer (TSan), a race detector.
//
// TSan debugging API implementation.
//===----------------------------------------------------------------------===//
#include "tsan_interface.h"
#include "tsan_report.h"
#include "tsan_rtl.h"

#include "sanitizer_common/sanitizer_stackdepot.h"

using namespace __tsan;

static const char *ReportTypeDescription(ReportType typ) {
  switch (typ) {
    case ReportTypeRace: return "data-race";
    case ReportTypeVptrRace: return "data-race-vptr";
    case ReportTypeUseAfterFree: return "heap-use-after-free";
    case ReportTypeVptrUseAfterFree: return "heap-use-after-free-vptr";
    case ReportTypeExternalRace: return "external-race";
    case ReportTypeThreadLeak: return "thread-leak";
    case ReportTypeMutexDestroyLocked: return "locked-mutex-destroy";
    case ReportTypeMutexDoubleLock: return "mutex-double-lock";
    case ReportTypeMutexInvalidAccess: return "mutex-invalid-access";
    case ReportTypeMutexBadUnlock: return "mutex-bad-unlock";
    case ReportTypeMutexBadReadLock: return "mutex-bad-read-lock";
    case ReportTypeMutexBadReadUnlock: return "mutex-bad-read-unlock";
    case ReportTypeSignalUnsafe: return "signal-unsafe-call";
    case ReportTypeErrnoInSignal: return "errno-in-signal-handler";
    case ReportTypeDeadlock: return "lock-order-inversion";
    // No default case so compiler warns us if we miss one
  }
  UNREACHABLE("missing case");
}

static const char *ReportLocationTypeDescription(ReportLocationType typ) {
  switch (typ) {
    case ReportLocationGlobal: return "global";
    case ReportLocationHeap: return "heap";
    case ReportLocationStack: return "stack";
    case ReportLocationTLS: return "tls";
    case ReportLocationFD: return "fd";
    // No default case so compiler warns us if we miss one
  }
  UNREACHABLE("missing case");
}

static void CopyTrace(SymbolizedStack *first_frame, void **trace,
                      uptr trace_size) {
  uptr i = 0;
  for (SymbolizedStack *frame = first_frame; frame != nullptr;
       frame = frame->next) {
    trace[i++] = (void *)frame->info.address;
    if (i >= trace_size) break;
  }
}

// Meant to be called by the debugger.
SANITIZER_INTERFACE_ATTRIBUTE
void *__tsan_get_current_report() {
  return const_cast<ReportDesc*>(cur_thread()->current_report);
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_data(void *report, const char **description, int *count,
                           int *stack_count, int *mop_count, int *loc_count,
                           int *mutex_count, int *thread_count,
                           int *unique_tid_count, void **sleep_trace,
                           uptr trace_size) {
  const ReportDesc *rep = (ReportDesc *)report;
  *description = ReportTypeDescription(rep->typ);
  *count = rep->count;
  *stack_count = rep->stacks.Size();
  *mop_count = rep->mops.Size();
  *loc_count = rep->locs.Size();
  *mutex_count = rep->mutexes.Size();
  *thread_count = rep->threads.Size();
  *unique_tid_count = rep->unique_tids.Size();
  if (rep->sleep) CopyTrace(rep->sleep->frames, sleep_trace, trace_size);
  return 1;
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_tag(void *report, uptr *tag) {
  const ReportDesc *rep = (ReportDesc *)report;
  *tag = rep->tag;
  return 1;
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_stack(void *report, uptr idx, void **trace,
                            uptr trace_size) {
  const ReportDesc *rep = (ReportDesc *)report;
  CHECK_LT(idx, rep->stacks.Size());
  ReportStack *stack = rep->stacks[idx];
  if (stack) CopyTrace(stack->frames, trace, trace_size);
  return stack ? 1 : 0;
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_mop(void *report, uptr idx, int *tid, void **addr,
                          int *size, int *write, int *atomic, void **trace,
                          uptr trace_size) {
  const ReportDesc *rep = (ReportDesc *)report;
  CHECK_LT(idx, rep->mops.Size());
  ReportMop *mop = rep->mops[idx];
  *tid = mop->tid;
  *addr = (void *)mop->addr;
  *size = mop->size;
  *write = mop->write ? 1 : 0;
  *atomic = mop->atomic ? 1 : 0;
  if (mop->stack) CopyTrace(mop->stack->frames, trace, trace_size);
  return 1;
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_loc(void *report, uptr idx, const char **type,
                          void **addr, uptr *start, uptr *size, int *tid,
                          int *fd, int *suppressable, void **trace,
                          uptr trace_size) {
  const ReportDesc *rep = (ReportDesc *)report;
  CHECK_LT(idx, rep->locs.Size());
  ReportLocation *loc = rep->locs[idx];
  *type = ReportLocationTypeDescription(loc->type);
  *addr = (void *)loc->global.start;
  *start = loc->heap_chunk_start;
  *size = loc->heap_chunk_size;
  *tid = loc->tid;
  *fd = loc->fd;
  *suppressable = loc->suppressable;
  if (loc->stack) CopyTrace(loc->stack->frames, trace, trace_size);
  return 1;
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_loc_object_type(void *report, uptr idx,
                                      const char **object_type) {
  const ReportDesc *rep = (ReportDesc *)report;
  CHECK_LT(idx, rep->locs.Size());
  ReportLocation *loc = rep->locs[idx];
  *object_type = GetObjectTypeFromTag(loc->external_tag);
  return 1;
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_mutex(void *report, uptr idx, uptr *mutex_id, void **addr,
                            int *destroyed, void **trace, uptr trace_size) {
  const ReportDesc *rep = (ReportDesc *)report;
  CHECK_LT(idx, rep->mutexes.Size());
  ReportMutex *mutex = rep->mutexes[idx];
  *mutex_id = mutex->id;
  *addr = (void *)mutex->addr;
  *destroyed = mutex->destroyed;
  if (mutex->stack) CopyTrace(mutex->stack->frames, trace, trace_size);
  return 1;
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_thread(void *report, uptr idx, int *tid, tid_t *os_id,
                             int *running, const char **name, int *parent_tid,
                             void **trace, uptr trace_size) {
  const ReportDesc *rep = (ReportDesc *)report;
  CHECK_LT(idx, rep->threads.Size());
  ReportThread *thread = rep->threads[idx];
  *tid = thread->id;
  *os_id = thread->os_id;
  *running = thread->running;
  *name = thread->name;
  *parent_tid = thread->parent_tid;
  if (thread->stack) CopyTrace(thread->stack->frames, trace, trace_size);
  return 1;
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_report_unique_tid(void *report, uptr idx, int *tid) {
  const ReportDesc *rep = (ReportDesc *)report;
  CHECK_LT(idx, rep->unique_tids.Size());
  *tid = rep->unique_tids[idx];
  return 1;
}

SANITIZER_INTERFACE_ATTRIBUTE
const char *__tsan_locate_address(uptr addr, char *name, uptr name_size,
                                  uptr *region_address_ptr,
                                  uptr *region_size_ptr) {
  uptr region_address = 0;
  uptr region_size = 0;
  const char *region_kind = nullptr;
  if (name && name_size > 0) name[0] = 0;

  if (IsMetaMem(addr)) {
    region_kind = "meta shadow";
  } else if (IsShadowMem(addr)) {
    region_kind = "shadow";
  } else {
    bool is_stack = false;
    MBlock *b = 0;
    Allocator *a = allocator();
    if (a->PointerIsMine((void *)addr)) {
      void *block_begin = a->GetBlockBegin((void *)addr);
      if (block_begin) b = ctx->metamap.GetBlock((uptr)block_begin);
    }

    if (b != 0) {
      region_address = (uptr)allocator()->GetBlockBegin((void *)addr);
      region_size = b->siz;
      region_kind = "heap";
    } else {
      // TODO(kuba.brecka): We should not lock. This is supposed to be called
      // from within the debugger when other threads are stopped.
      ctx->thread_registry->Lock();
      ThreadContext *tctx = IsThreadStackOrTls(addr, &is_stack);
      ctx->thread_registry->Unlock();
      if (tctx) {
        region_kind = is_stack ? "stack" : "tls";
      } else {
        region_kind = "global";
        DataInfo info;
        if (Symbolizer::GetOrInit()->SymbolizeData(addr, &info)) {
          internal_strncpy(name, info.name, name_size);
          region_address = info.start;
          region_size = info.size;
        }
      }
    }
  }

  CHECK(region_kind);
  if (region_address_ptr) *region_address_ptr = region_address;
  if (region_size_ptr) *region_size_ptr = region_size;
  return region_kind;
}

SANITIZER_INTERFACE_ATTRIBUTE
int __tsan_get_alloc_stack(uptr addr, uptr *trace, uptr size, int *thread_id,
                           tid_t *os_id) {
  MBlock *b = 0;
  Allocator *a = allocator();
  if (a->PointerIsMine((void *)addr)) {
    void *block_begin = a->GetBlockBegin((void *)addr);
    if (block_begin) b = ctx->metamap.GetBlock((uptr)block_begin);
  }
  if (b == 0) return 0;

  *thread_id = b->tid;
  // No locking.  This is supposed to be called from within the debugger when
  // other threads are stopped.
  ThreadContextBase *tctx = ctx->thread_registry->GetThreadLocked(b->tid);
  *os_id = tctx->os_id;

  StackTrace stack = StackDepotGet(b->stk);
  size = Min(size, (uptr)stack.size);
  for (uptr i = 0; i < size; i++) trace[i] = stack.trace[stack.size - i - 1];
  return size;
}
