Implement C++17 aligned-new support for macOS < 10.14

This commit is contained in:
Jean Pierre Cimalando 2021-09-22 05:02:22 +02:00
parent 38b102fc97
commit f0b827d423
3 changed files with 104 additions and 2 deletions

View file

@ -1,6 +1,7 @@
include(CMakeDependentOption)
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(CheckCXXSourceCompiles)
include(GNUWarnings)
set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ standard to be used")
@ -52,7 +53,30 @@ endif()
# Set macOS compatibility level
if(APPLE)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.14")
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9")
endif()
# If using C++17, check if aligned-new has runtime support on the platform;
# on macOS, this depends on the deployment target.
if(CMAKE_CXX_STANDARD LESS 17)
# not necessary on older C++, it will call ordinary new and delete
set(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT FALSE)
else()
check_cxx_source_compiles("
struct Test { alignas(1024) int z; };
int main() { new Test; return 0; }
" SFIZZ_HAVE_CXX17_ALIGNED_NEW)
# if support is absent, sfizz will provide a substitute implementation
if(SFIZZ_HAVE_CXX17_ALIGNED_NEW)
set(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT FALSE)
else()
# on macOS, this mandatory flag tells that allocation functions are user-provided
check_cxx_compiler_flag("-faligned-allocation" SFIZZ_HAVE_CXXFLAG_FALIGNED_ALLOCATION)
if(SFIZZ_HAVE_CXXFLAG_FALIGNED_ALLOCATION)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-faligned-allocation>")
endif()
set(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT TRUE)
endif()
endif()
# Do not define macros `min` and `max`

View file

@ -193,7 +193,8 @@ set(SFIZZ_SOURCES
sfizz/effects/impl/ResonantStringAVX.cpp
sfizz/effects/impl/ResonantArray.cpp
sfizz/effects/impl/ResonantArraySSE.cpp
sfizz/effects/impl/ResonantArrayAVX.cpp)
sfizz/effects/impl/ResonantArrayAVX.cpp
sfizz/utility/c++17/AlignedMemorySupport.cpp)
include(SfizzSIMDSourceFiles)
sfizz_add_simd_sources(SFIZZ_SOURCES ".")
@ -303,6 +304,9 @@ endif()
if(SFIZZ_RELEASE_ASSERTS)
target_compile_definitions(sfizz_internal PUBLIC "SFIZZ_ENABLE_RELEASE_ASSERT=1")
endif()
if(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT)
target_compile_definitions(sfizz_internal PRIVATE "SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT=1")
endif()
sfizz_enable_fast_math(sfizz_internal)
# Check that sfizz and cmake-side definitions are matching

View file

@ -0,0 +1,74 @@
// SPDX-License-Identifier: BSD-2-Clause
// This code is part of the sfizz library and is licensed under a BSD 2-clause
// license. You should have receive a LICENSE.md file along with the code.
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
#if defined(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT)
#include <new>
#if defined(_WIN32)
# include <malloc.h>
#else
# include <stdlib.h>
#endif
void* operator new(std::size_t count, std::align_val_t al, const std::nothrow_t&) noexcept
{
void *ptr;
#if defined(_WIN32)
ptr = ::_aligned_malloc(count, static_cast<std::size_t>(al));
#else
if (::posix_memalign(&ptr, static_cast<std::size_t>(al), count) != 0)
ptr = nullptr;
#endif
return ptr;
}
void operator delete(void* ptr, std::align_val_t, const std::nothrow_t&) noexcept
{
#if defined(_WIN32)
::_aligned_free(ptr);
#else
::free(ptr);
#endif
}
//------------------------------------------------------------------------------
void* operator new(std::size_t count, std::align_val_t al)
{
void *ptr = operator new(count, al, std::nothrow);
if (!ptr)
throw std::bad_alloc();
return ptr;
}
void operator delete(void* ptr, std::align_val_t al) noexcept
{
operator delete(ptr, al, std::nothrow);
}
//------------------------------------------------------------------------------
void* operator new[](std::size_t count, std::align_val_t al)
{
return operator new(count, al);
}
void* operator new[](std::size_t count, std::align_val_t al, const std::nothrow_t& tag) noexcept
{
return operator new(count, al, tag);
}
void operator delete[](void* ptr, std::align_val_t al) noexcept
{
operator delete(ptr, al);
}
void operator delete[](void* ptr, std::align_val_t al, const std::nothrow_t& tag) noexcept
{
operator delete(ptr, al, tag);
}
#endif // defined(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT)