From 4e2a9e50f6dd6760b12838517c7f85a0c9032921 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Thu, 12 Dec 2024 11:24:36 -0800 Subject: [PATCH] [libc] Breakup freelist_malloc into separate files (#98784) This better matches the structure we use for the rest of libc. --- libc/config/baremetal/aarch64/entrypoints.txt | 1 - libc/config/baremetal/arm/entrypoints.txt | 1 - libc/config/baremetal/riscv/entrypoints.txt | 1 - libc/src/__support/CMakeLists.txt | 8 ++- libc/src/__support/freelist_heap.cpp | 19 +++++++ libc/src/stdlib/CMakeLists.txt | 38 ++++--------- libc/src/stdlib/baremetal/CMakeLists.txt | 50 +++++++++++++++++ .../aligned_alloc.cpp} | 23 +------- libc/src/stdlib/baremetal/calloc.cpp | 21 ++++++++ libc/src/stdlib/baremetal/free.cpp | 19 +++++++ libc/src/stdlib/baremetal/malloc.cpp | 21 ++++++++ libc/src/stdlib/baremetal/realloc.cpp | 21 ++++++++ libc/test/src/__support/CMakeLists.txt | 2 - .../test/src/__support/freelist_heap_test.cpp | 4 ++ .../src/__support/freelist_malloc_test.cpp | 54 ------------------- 15 files changed, 173 insertions(+), 110 deletions(-) create mode 100644 libc/src/__support/freelist_heap.cpp rename libc/src/stdlib/{freelist_malloc.cpp => baremetal/aligned_alloc.cpp} (53%) create mode 100644 libc/src/stdlib/baremetal/calloc.cpp create mode 100644 libc/src/stdlib/baremetal/free.cpp create mode 100644 libc/src/stdlib/baremetal/malloc.cpp create mode 100644 libc/src/stdlib/baremetal/realloc.cpp delete mode 100644 libc/test/src/__support/freelist_malloc_test.cpp diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt index 71b49d98942916e..694cd7b1993ca22 100644 --- a/libc/config/baremetal/aarch64/entrypoints.txt +++ b/libc/config/baremetal/aarch64/entrypoints.txt @@ -184,7 +184,6 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.stdlib.div libc.src.stdlib.exit libc.src.stdlib.free - libc.src.stdlib.freelist_malloc libc.src.stdlib.labs libc.src.stdlib.ldiv libc.src.stdlib.llabs diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt index 71b49d98942916e..694cd7b1993ca22 100644 --- a/libc/config/baremetal/arm/entrypoints.txt +++ b/libc/config/baremetal/arm/entrypoints.txt @@ -184,7 +184,6 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.stdlib.div libc.src.stdlib.exit libc.src.stdlib.free - libc.src.stdlib.freelist_malloc libc.src.stdlib.labs libc.src.stdlib.ldiv libc.src.stdlib.llabs diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt index e84d139d09dd8e7..6dc5df830eb0000 100644 --- a/libc/config/baremetal/riscv/entrypoints.txt +++ b/libc/config/baremetal/riscv/entrypoints.txt @@ -180,7 +180,6 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.stdlib.div libc.src.stdlib.exit libc.src.stdlib.free - libc.src.stdlib.freelist_malloc libc.src.stdlib.labs libc.src.stdlib.ldiv libc.src.stdlib.llabs diff --git a/libc/src/__support/CMakeLists.txt b/libc/src/__support/CMakeLists.txt index 8f85740f70a06ee..70ed67c156d1aef 100644 --- a/libc/src/__support/CMakeLists.txt +++ b/libc/src/__support/CMakeLists.txt @@ -48,13 +48,19 @@ add_header_library( .freetrie ) -add_header_library( +add_object_library( freelist_heap + SRCS + freelist_heap.cpp HDRS freelist_heap.h + COMPILE_OPTIONS + -DLIBC_FREELIST_MALLOC_SIZE=${LIBC_CONF_FREELIST_MALLOC_BUFFER_SIZE} DEPENDS .block + .freelist .freestore + .freetrie libc.src.__support.CPP.cstddef libc.src.__support.CPP.array libc.src.__support.CPP.optional diff --git a/libc/src/__support/freelist_heap.cpp b/libc/src/__support/freelist_heap.cpp new file mode 100644 index 000000000000000..4deb0e0f09e223b --- /dev/null +++ b/libc/src/__support/freelist_heap.cpp @@ -0,0 +1,19 @@ +//===-- Implementation for freelist_heap ----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/__support/freelist_heap.h" +#include "src/__support/macros/config.h" + +#include + +namespace LIBC_NAMESPACE_DECL { + +static LIBC_CONSTINIT FreeListHeap freelist_heap_symbols; +FreeListHeap *freelist_heap = &freelist_heap_symbols; + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdlib/CMakeLists.txt b/libc/src/stdlib/CMakeLists.txt index 14d06534a6049ae..40ba9ead9a7ae6a 100644 --- a/libc/src/stdlib/CMakeLists.txt +++ b/libc/src/stdlib/CMakeLists.txt @@ -323,7 +323,7 @@ add_entrypoint_object( .rand_util ) -if(NOT LIBC_TARGET_OS_IS_GPU) +if(NOT LIBC_TARGET_OS_IS_BAREMETAL AND NOT LIBC_TARGET_OS_IS_GPU) if(LLVM_LIBC_INCLUDE_SCUDO) set(SCUDO_DEPS "") @@ -349,7 +349,7 @@ if(NOT LIBC_TARGET_OS_IS_GPU) list(APPEND SCUDO_DEPS RTScudoStandalone.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO} RTScudoStandaloneCWrappers.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO}) - + if (COMPILER_RT_BUILD_GWP_ASAN) list(APPEND SCUDO_DEPS RTGwpAsan.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO} @@ -389,32 +389,8 @@ if(NOT LIBC_TARGET_OS_IS_GPU) ${SCUDO_DEPS} ) else() - # Only use freelist malloc for baremetal targets. - add_entrypoint_object( - freelist_malloc - SRCS - freelist_malloc.cpp - HDRS - malloc.h - DEPENDS - libc.src.__support.freelist_heap - ) - get_target_property(freelist_malloc_is_skipped libc.src.stdlib.freelist_malloc "SKIPPED") - if(LIBC_TARGET_OS_IS_BAREMETAL AND NOT freelist_malloc_is_skipped) - add_entrypoint_object( - malloc - ALIAS - DEPENDS - .freelist_malloc - ) - else() - add_entrypoint_external( - malloc - ) - endif() - add_entrypoint_external( - free + malloc ) add_entrypoint_external( calloc @@ -425,6 +401,12 @@ if(NOT LIBC_TARGET_OS_IS_GPU) add_entrypoint_external( aligned_alloc ) + add_entrypoint_external( + free + ) + add_entrypoint_external( + mallopt + ) endif() endif() @@ -513,7 +495,7 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) endif() -if(LIBC_TARGET_OS_IS_GPU) +if(LIBC_TARGET_OS_IS_BAREMETAL OR LIBC_TARGET_OS_IS_GPU) add_entrypoint_object( malloc ALIAS diff --git a/libc/src/stdlib/baremetal/CMakeLists.txt b/libc/src/stdlib/baremetal/CMakeLists.txt index 551a83a36b20e87..67ab1979e4d104d 100644 --- a/libc/src/stdlib/baremetal/CMakeLists.txt +++ b/libc/src/stdlib/baremetal/CMakeLists.txt @@ -5,3 +5,53 @@ add_entrypoint_object( HDRS ../abort.h ) + +add_entrypoint_object( + malloc + SRCS + malloc.cpp + HDRS + ../malloc.h + DEPENDS + libc.src.__support.freelist_heap +) + +add_entrypoint_object( + free + SRCS + free.cpp + HDRS + ../free.h + DEPENDS + libc.src.__support.freelist_heap +) + +add_entrypoint_object( + calloc + SRCS + calloc.cpp + HDRS + ../calloc.h + DEPENDS + libc.src.__support.freelist_heap +) + +add_entrypoint_object( + realloc + SRCS + realloc.cpp + HDRS + ../realloc.h + DEPENDS + libc.src.__support.freelist_heap +) + +add_entrypoint_object( + aligned_alloc + SRCS + aligned_alloc.cpp + HDRS + ../aligned_alloc.h + DEPENDS + libc.src.__support.freelist_heap +) diff --git a/libc/src/stdlib/freelist_malloc.cpp b/libc/src/stdlib/baremetal/aligned_alloc.cpp similarity index 53% rename from libc/src/stdlib/freelist_malloc.cpp rename to libc/src/stdlib/baremetal/aligned_alloc.cpp index fe56fad769378a2..e9548719c3a63f4 100644 --- a/libc/src/stdlib/freelist_malloc.cpp +++ b/libc/src/stdlib/baremetal/aligned_alloc.cpp @@ -6,35 +6,14 @@ // //===----------------------------------------------------------------------===// +#include "src/stdlib/aligned_alloc.h" #include "src/__support/freelist_heap.h" #include "src/__support/macros/config.h" -#include "src/stdlib/aligned_alloc.h" -#include "src/stdlib/calloc.h" -#include "src/stdlib/free.h" -#include "src/stdlib/malloc.h" -#include "src/stdlib/realloc.h" #include namespace LIBC_NAMESPACE_DECL { -static LIBC_CONSTINIT FreeListHeap freelist_heap_symbols; -FreeListHeap *freelist_heap = &freelist_heap_symbols; - -LLVM_LIBC_FUNCTION(void *, malloc, (size_t size)) { - return freelist_heap->allocate(size); -} - -LLVM_LIBC_FUNCTION(void, free, (void *ptr)) { return freelist_heap->free(ptr); } - -LLVM_LIBC_FUNCTION(void *, calloc, (size_t num, size_t size)) { - return freelist_heap->calloc(num, size); -} - -LLVM_LIBC_FUNCTION(void *, realloc, (void *ptr, size_t size)) { - return freelist_heap->realloc(ptr, size); -} - LLVM_LIBC_FUNCTION(void *, aligned_alloc, (size_t alignment, size_t size)) { return freelist_heap->aligned_allocate(alignment, size); } diff --git a/libc/src/stdlib/baremetal/calloc.cpp b/libc/src/stdlib/baremetal/calloc.cpp new file mode 100644 index 000000000000000..2b3b83cebc8acc6 --- /dev/null +++ b/libc/src/stdlib/baremetal/calloc.cpp @@ -0,0 +1,21 @@ +//===-- Implementation for freelist_malloc --------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/stdlib/calloc.h" +#include "src/__support/freelist_heap.h" +#include "src/__support/macros/config.h" + +#include + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(void *, calloc, (size_t num, size_t size)) { + return freelist_heap->calloc(num, size); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdlib/baremetal/free.cpp b/libc/src/stdlib/baremetal/free.cpp new file mode 100644 index 000000000000000..1e25fe5f2dcfeae --- /dev/null +++ b/libc/src/stdlib/baremetal/free.cpp @@ -0,0 +1,19 @@ +//===-- Implementation for freelist_malloc --------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/stdlib/free.h" +#include "src/__support/freelist_heap.h" +#include "src/__support/macros/config.h" + +#include + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(void, free, (void *ptr)) { return freelist_heap->free(ptr); } + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdlib/baremetal/malloc.cpp b/libc/src/stdlib/baremetal/malloc.cpp new file mode 100644 index 000000000000000..a299282667fcd55 --- /dev/null +++ b/libc/src/stdlib/baremetal/malloc.cpp @@ -0,0 +1,21 @@ +//===-- Implementation for freelist_malloc --------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/stdlib/malloc.h" +#include "src/__support/freelist_heap.h" +#include "src/__support/macros/config.h" + +#include + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(void *, malloc, (size_t size)) { + return freelist_heap->allocate(size); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdlib/baremetal/realloc.cpp b/libc/src/stdlib/baremetal/realloc.cpp new file mode 100644 index 000000000000000..fb25c68ec429649 --- /dev/null +++ b/libc/src/stdlib/baremetal/realloc.cpp @@ -0,0 +1,21 @@ +//===-- Implementation for freelist_malloc --------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/stdlib/realloc.h" +#include "src/__support/freelist_heap.h" +#include "src/__support/macros/config.h" + +#include + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(void *, realloc, (void *ptr, size_t size)) { + return freelist_heap->realloc(ptr, size); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/test/src/__support/CMakeLists.txt b/libc/test/src/__support/CMakeLists.txt index bcc86effd9a52c6..59bce9b96e39642 100644 --- a/libc/test/src/__support/CMakeLists.txt +++ b/libc/test/src/__support/CMakeLists.txt @@ -63,11 +63,9 @@ if(LLVM_LIBC_FULL_BUILD) SRCS fake_heap.s freelist_heap_test.cpp - freelist_malloc_test.cpp DEPENDS libc.src.__support.CPP.span libc.src.__support.freelist_heap - libc.src.stdlib.freelist_malloc libc.src.string.memcmp libc.src.string.memcpy ) diff --git a/libc/test/src/__support/freelist_heap_test.cpp b/libc/test/src/__support/freelist_heap_test.cpp index 991c158825a888a..07b9a09d77bba6a 100644 --- a/libc/test/src/__support/freelist_heap_test.cpp +++ b/libc/test/src/__support/freelist_heap_test.cpp @@ -9,6 +9,10 @@ #include "src/__support/CPP/span.h" #include "src/__support/freelist_heap.h" #include "src/__support/macros/config.h" +#include "src/stdlib/aligned_alloc.h" +#include "src/stdlib/calloc.h" +#include "src/stdlib/free.h" +#include "src/stdlib/malloc.h" #include "src/string/memcmp.h" #include "src/string/memcpy.h" #include "test/UnitTest/Test.h" diff --git a/libc/test/src/__support/freelist_malloc_test.cpp b/libc/test/src/__support/freelist_malloc_test.cpp deleted file mode 100644 index 793e2498304fb98..000000000000000 --- a/libc/test/src/__support/freelist_malloc_test.cpp +++ /dev/null @@ -1,54 +0,0 @@ -//===-- Unittests for freelist_malloc -------------------------------------===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -#include "src/__support/freelist_heap.h" -#include "src/stdlib/aligned_alloc.h" -#include "src/stdlib/calloc.h" -#include "src/stdlib/free.h" -#include "src/stdlib/malloc.h" -#include "test/UnitTest/Test.h" - -using LIBC_NAMESPACE::Block; -using LIBC_NAMESPACE::freelist_heap; -using LIBC_NAMESPACE::FreeListHeap; -using LIBC_NAMESPACE::FreeListHeapBuffer; - -TEST(LlvmLibcFreeListMalloc, Malloc) { - constexpr size_t kAllocSize = 256; - constexpr size_t kCallocNum = 4; - constexpr size_t kCallocSize = 64; - - void *ptr1 = LIBC_NAMESPACE::malloc(kAllocSize); - auto *block = Block::from_usable_space(ptr1); - EXPECT_GE(block->inner_size(), kAllocSize); - - LIBC_NAMESPACE::free(ptr1); - ASSERT_NE(block->next(), static_cast(nullptr)); - ASSERT_EQ(block->next()->next(), static_cast(nullptr)); - size_t heap_size = block->inner_size(); - - void *ptr2 = LIBC_NAMESPACE::calloc(kCallocNum, kCallocSize); - ASSERT_EQ(ptr2, ptr1); - EXPECT_GE(block->inner_size(), kCallocNum * kCallocSize); - - for (size_t i = 0; i < kCallocNum * kCallocSize; ++i) - EXPECT_EQ(reinterpret_cast(ptr2)[i], uint8_t(0)); - - LIBC_NAMESPACE::free(ptr2); - EXPECT_EQ(block->inner_size(), heap_size); - - constexpr size_t ALIGN = kAllocSize; - void *ptr3 = LIBC_NAMESPACE::aligned_alloc(ALIGN, kAllocSize); - EXPECT_NE(ptr3, static_cast(nullptr)); - EXPECT_EQ(reinterpret_cast(ptr3) % ALIGN, size_t(0)); - auto *aligned_block = reinterpret_cast(ptr3); - EXPECT_GE(aligned_block->inner_size(), kAllocSize); - - LIBC_NAMESPACE::free(ptr3); - EXPECT_EQ(block->inner_size(), heap_size); -}