/* RCC-Project Copyright (C) 2026 Richard Qin This file is part of RCC-Project. RCC-Project is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. RCC-Project is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with RCC-Project; see the file COPYING. If not see . */ //===- MemAlloc.h - Memory allocation functions -----------------*- 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 // //===----------------------------------------------------------------------===// /// \file /// /// This file defines counterparts of C library allocation functions defined in /// the namespace 'std'. The new allocation functions crash on allocation /// failure instead of returning null pointer. /// //===----------------------------------------------------------------------===// #ifndef RCC_SUPPORT_MEMALLOC_H #define RCC_SUPPORT_MEMALLOC_H #include "CoreLib/Compiler/Compiler.h" #include "CoreLib/Error/ErrorHandling.h" #include namespace rcc { RCC_ATTRIBUTE_RETURNS_NONNULL inline void * safe_malloc (size_t Sz) { void *Result = std::malloc (Sz); if (Result == nullptr) { // It is implementation-defined whether allocation occurs if the space // requested is zero (ISO/IEC 9899:2018 7.22.3). Retry, requesting // non-zero, if the space requested was zero. if (Sz == 0) { return safe_malloc (1); } report_bad_alloc_error ("Allocation failed"); } return Result; } RCC_ATTRIBUTE_RETURNS_NONNULL inline void * safe_calloc (size_t Count, size_t Sz) { void *Result = std::calloc (Count, Sz); if (Result == nullptr) { // It is implementation-defined whether allocation occurs if the space // requested is zero (ISO/IEC 9899:2018 7.22.3). Retry, requesting // non-zero, if the space requested was zero. if (Count == 0 || Sz == 0) { return safe_malloc (1); } report_bad_alloc_error ("Allocation failed"); } return Result; } RCC_ATTRIBUTE_RETURNS_NONNULL inline void * safe_realloc (void *Ptr, size_t Sz) { void *Result = std::realloc (Ptr, Sz); if (Result == nullptr) { // It is implementation-defined whether allocation occurs if the space // requested is zero (ISO/IEC 9899:2018 7.22.3). Retry, requesting // non-zero, if the space requested was zero. if (Sz == 0) { return safe_malloc (1); } report_bad_alloc_error ("Allocation failed"); } return Result; } /// Allocate a buffer of memory with the given size and alignment. /// /// When the compiler supports aligned operator new, this will use it to /// handle even over-aligned allocations. /// /// However, this doesn't make any attempt to leverage the fancier techniques /// like posix_memalign due to portability. It is mostly intended to allow /// compatibility with platforms that, after aligned allocation was added, use /// reduced default alignment. RCC_ABI RCC_ATTRIBUTE_RETURNS_NONNULL RCC_ATTRIBUTE_RETURNS_NOALIAS void * allocate_buffer (size_t Size, size_t Alignment); /// Deallocate a buffer of memory with the given size and alignment. /// /// If supported, this will used the sized delete operator. Also if supported, /// this will pass the alignment to the delete operator. /// /// The pointer must have been allocated with the corresponding new operator, /// most likely using the above helper. RCC_ABI void deallocate_buffer (void *Ptr, size_t Size, size_t Alignment); } // namespace rcc #endif