//===-- scudo_errors.cpp ----------------------------------------*- C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//
///
/// Verbose termination functions.
///
//===----------------------------------------------------------------------===//

#include "scudo_utils.h"

#include "sanitizer_common/sanitizer_flags.h"

namespace __scudo {

void NORETURN reportCallocOverflow(uptr Count, uptr Size) {
  dieWithMessage("calloc parameters overflow: count * size (%zd * %zd) cannot "
      "be represented with type size_t\n", Count, Size);
}

void NORETURN reportPvallocOverflow(uptr Size) {
  dieWithMessage("pvalloc parameters overflow: size 0x%zx rounded up to system "
      "page size 0x%zx cannot be represented in type size_t\n", Size,
      GetPageSizeCached());
}

void NORETURN reportAllocationAlignmentTooBig(uptr Alignment,
                                              uptr MaxAlignment) {
  dieWithMessage("invalid allocation alignment: %zd exceeds maximum supported "
      "allocation of %zd\n", Alignment, MaxAlignment);
}

void NORETURN reportAllocationAlignmentNotPowerOfTwo(uptr Alignment) {
  dieWithMessage("invalid allocation alignment: %zd, alignment must be a power "
      "of two\n", Alignment);
}

void NORETURN reportInvalidPosixMemalignAlignment(uptr Alignment) {
  dieWithMessage("invalid alignment requested in posix_memalign: %zd, alignment"
      " must be a power of two and a multiple of sizeof(void *) == %zd\n",
      Alignment, sizeof(void *));  // NOLINT
}

void NORETURN reportInvalidAlignedAllocAlignment(uptr Size, uptr Alignment) {
#if SANITIZER_POSIX
  dieWithMessage("invalid alignment requested in aligned_alloc: %zd, alignment "
      "must be a power of two and the requested size 0x%zx must be a multiple "
      "of alignment\n", Alignment, Size);
#else
  dieWithMessage("invalid alignment requested in aligned_alloc: %zd, the "
      "requested size 0x%zx must be a multiple of alignment\n", Alignment,
      Size);
#endif
}

void NORETURN reportAllocationSizeTooBig(uptr UserSize, uptr TotalSize,
                                         uptr MaxSize) {
  dieWithMessage("requested allocation size 0x%zx (0x%zx after adjustments) "
      "exceeds maximum supported size of 0x%zx\n", UserSize, TotalSize,
      MaxSize);
}

void NORETURN reportRssLimitExceeded() {
  dieWithMessage("specified RSS limit exceeded, currently set to "
      "soft_rss_limit_mb=%zd\n", common_flags()->soft_rss_limit_mb);
}

void NORETURN reportOutOfMemory(uptr RequestedSize) {
  dieWithMessage("allocator is out of memory trying to allocate 0x%zx bytes\n",
                 RequestedSize);
}

}  // namespace __scudo
