aboutsummaryrefslogtreecommitdiff
path: root/libsupport/include/CoreLib/Memory
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-11-01 02:12:34 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-11-01 02:12:34 +0800
commit02b615c8704aeda9a94cf5457c9c78de847c911a (patch)
tree3257dd23e643ae732cb0abf14d62ab70b64893be /libsupport/include/CoreLib/Memory
parent2850abdb23a2ba4fde6268ea4191f4d062b9a01f (diff)
downloadrcc-project-master.tar.gz
rcc-project-master.tar.xz
Move support code into CoreLibHEADmaster
Diffstat (limited to 'libsupport/include/CoreLib/Memory')
-rw-r--r--libsupport/include/CoreLib/Memory/MemAlloc.h124
1 files changed, 124 insertions, 0 deletions
diff --git a/libsupport/include/CoreLib/Memory/MemAlloc.h b/libsupport/include/CoreLib/Memory/MemAlloc.h
new file mode 100644
index 0000000..b7183c0
--- /dev/null
+++ b/libsupport/include/CoreLib/Memory/MemAlloc.h
@@ -0,0 +1,124 @@
+/*
+ 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
+ <http://www.gnu.org/licenses/>.
+ */
+
+//===- 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 <cstdlib>
+
+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