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

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
