diff --git a/CMakeLists.txt b/CMakeLists.txt index 13887a6..d910199 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.8) project(snmalloc C CXX) include(CheckCXXCompilerFlag) +include(CheckCSourceCompiles) option(USE_SNMALLOC_STATS "Track allocation stats" OFF) option(SNMALLOC_CI_BUILD "Disable features not sensible for CI" OFF) @@ -12,6 +13,12 @@ option(SNMALLOC_RUST_SUPPORT "Build static library for rust" OFF) option(SNMALLOC_QEMU_WORKAROUND "Disable using madvise(DONT_NEED) to zero memory on Linux" Off) set(CACHE_FRIENDLY_OFFSET OFF CACHE STRING "Base offset to place linked-list nodes.") +CHECK_C_SOURCE_COMPILES(" +#include +size_t malloc_usable_size(const void* ptr) { return 0; } +int main() { return 0; } +" CONST_QUALIFIED_MALLOC_USABLE_SIZE) + if ((CMAKE_BUILD_TYPE STREQUAL "Release") AND (NOT SNMALLOC_CI_BUILD)) option(USE_POSIX_COMMIT_CHECKS "Instrument Posix PAL to check for access to unused blocks of memory." Off) else () @@ -135,6 +142,10 @@ if(USE_POSIX_COMMIT_CHECKS) target_compile_definitions(snmalloc_lib INTERFACE -DUSE_POSIX_COMMIT_CHECKS) endif() +if(CONST_QUALIFIED_MALLOC_USABLE_SIZE) + target_compile_definitions(snmalloc_lib INTERFACE -DMALLOC_USABLE_SIZE_QUALIFIER=const) +endif() + # To build with just the header library target define SNMALLOC_ONLY_HEADER_LIBRARY # in containing Cmake file. diff --git a/README.md b/README.md index 2b126c9..7f5be76 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,16 @@ your toolchain: LD_PRELOAD=/usr/local/lib/libsnmallocshim.so ninja ``` +## Cross Compile for Android +Android support is out-of-the-box. + +To cross-compile the library for arm android, you can simply invoke CMake with the toolchain file and the andorid api settings (for more infomation, check this [document](https://developer.android.com/ndk/guides/cmake)). + +For example, you can cross-compile for `arm64-v8a` with the following command: +``` +cmake /path/to/snmalloc -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a +``` + # CMake Feature Flags These can be added to your cmake command line. diff --git a/src/mem/alloc.h b/src/mem/alloc.h index 8cd2dbb..c58015b 100644 --- a/src/mem/alloc.h +++ b/src/mem/alloc.h @@ -457,7 +457,7 @@ namespace snmalloc return pointer_cast(external_address(p)); } - static size_t alloc_size(void* p) + static size_t alloc_size(const void* p) { // This must be called on an external pointer. size_t size = ChunkMap::get(address_cast(p)); diff --git a/src/mem/mediumslab.h b/src/mem/mediumslab.h index dcabf8e..d7632d5 100644 --- a/src/mem/mediumslab.h +++ b/src/mem/mediumslab.h @@ -39,9 +39,10 @@ namespace snmalloc return OS_PAGE_SIZE; } - static Mediumslab* get(void* p) + static Mediumslab* get(const void* p) { - return pointer_align_down(p); + return pointer_align_down( + const_cast(p)); } void init(RemoteAllocator* alloc, sizeclass_t sc, size_t rsize) diff --git a/src/mem/metaslab.h b/src/mem/metaslab.h index 4d53b77..ea4200f 100644 --- a/src/mem/metaslab.h +++ b/src/mem/metaslab.h @@ -140,9 +140,9 @@ namespace snmalloc return (slab_end - allocation_start) % size == 0; } - static Slab* get_slab(void* p) + static Slab* get_slab(const void* p) { - return pointer_align_down(p); + return pointer_align_down(const_cast(p)); } static bool is_short(Slab* p) diff --git a/src/mem/superslab.h b/src/mem/superslab.h index 443e33f..c528e65 100644 --- a/src/mem/superslab.h +++ b/src/mem/superslab.h @@ -65,9 +65,10 @@ namespace snmalloc StatusChange = 2 }; - static Superslab* get(void* p) + static Superslab* get(const void* p) { - return pointer_align_down(p); + return pointer_align_down( + const_cast(p)); } static bool is_short_sizeclass(sizeclass_t sizeclass) diff --git a/src/override/malloc.cc b/src/override/malloc.cc index 975bd41..daaa04f 100644 --- a/src/override/malloc.cc +++ b/src/override/malloc.cc @@ -14,6 +14,10 @@ using namespace snmalloc; # define SNMALLOC_NAME_MANGLE(a) a #endif +#ifndef MALLOC_USABLE_SIZE_QUALIFIER +# define MALLOC_USABLE_SIZE_QUALIFIER +#endif + extern "C" { SNMALLOC_EXPORT void* SNMALLOC_NAME_MANGLE(__malloc_end_pointer)(void* ptr) @@ -43,7 +47,9 @@ extern "C" return ThreadAlloc::get_noncachable()->alloc(sz); } - SNMALLOC_EXPORT size_t SNMALLOC_NAME_MANGLE(malloc_usable_size)(void* ptr) + SNMALLOC_EXPORT + size_t SNMALLOC_NAME_MANGLE(malloc_usable_size)( + MALLOC_USABLE_SIZE_QUALIFIER void* ptr) { return Alloc::alloc_size(ptr); } diff --git a/src/pal/pal_posix.h b/src/pal/pal_posix.h index 0289e00..0f7eb85 100644 --- a/src/pal/pal_posix.h +++ b/src/pal/pal_posix.h @@ -2,8 +2,10 @@ #include "../ds/address.h" #include "../mem/allocconfig.h" - -#include +#if __has_include() +# define SNMALLOC_HAS_BACKTRACE 1 +# include +#endif #include #include #include @@ -40,6 +42,7 @@ namespace snmalloc static void print_stack_trace() { +#ifdef SNMALLOC_HAS_BACKTRACE constexpr int SIZE = 1024; void* buffer[SIZE]; auto nptrs = backtrace(buffer, SIZE); @@ -47,6 +50,7 @@ namespace snmalloc backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO); puts(""); fflush(stdout); +#endif } /**