[libc-commits] [libc] [llvm] [libc] add basic arena allocator (PR #121173)
Daniel Thornburgh via libc-commits
libc-commits at lists.llvm.org
Wed Jan 8 10:41:09 PST 2025
================
@@ -0,0 +1,71 @@
+#include "src/__support/alloc/arena.h"
+#include "src/__support/alloc/page.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/page_size.h"
+#include "src/__support/memory_size.h"
+#include "src/string/memmove.h"
+#include "src/unistd/getpagesize.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+void *arena_allocate(BaseAllocator *base, size_t alignment, size_t size) {
+ ArenaAllocator *self = reinterpret_cast<ArenaAllocator *>(base);
+
+ if (self->buffer == nullptr) {
+ self->buffer = reinterpret_cast<uint8_t *>(page_allocate(1));
+ self->buffer_size = self->get_page_size();
+ }
+
+ uintptr_t curr_ptr = (uintptr_t)self->buffer + (uintptr_t)self->curr_offset;
+ uintptr_t offset = internal::align_forward<uintptr_t>(curr_ptr, alignment);
+ offset -= (uintptr_t)self->buffer;
+
+ if (offset + size > self->buffer_size) {
+ self->buffer = reinterpret_cast<uint8_t *>(
----------------
mysterymath wrote:
The Linux version of `page_expand` summarily returns `nullptr`, but it appears that this code assumes that this routine cannot fail. The function will return some offset from `nullptr` below if it does fail.
https://github.com/llvm/llvm-project/pull/121173
More information about the libc-commits
mailing list