mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-21 23:30:38 +08:00
Distinguish between library and language support for aligned allocation.
There are two cases: 1. The library has all it needs to provide align_val_t and the new/delete overloads needed to support aligned allocation. 2. The compiler has actually turned the language feature on. There are times where libc++ needs to distinguish between the two. This patch adds the additional macro _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION which denotes when case (1) does not hold. _LIBCPP_HAS_NO_ALIGNED_ALLOCATION is defined whenever _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION is defined, or when the compiler has not enabled the language feature. Additionally this patch cleans up a number of other macros related to detection of aligned allocation machinery. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@344207 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -984,7 +984,14 @@ template <unsigned> struct __static_assert_check {};
|
|||||||
// If we are getting operator new from the MSVC CRT, then allocation overloads
|
// If we are getting operator new from the MSVC CRT, then allocation overloads
|
||||||
// for align_val_t were added in 19.12, aka VS 2017 version 15.3.
|
// for align_val_t were added in 19.12, aka VS 2017 version 15.3.
|
||||||
#if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912
|
#if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912
|
||||||
#define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
#define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
|
||||||
|
#elif defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
|
||||||
|
#define _LIBCPP_DEFER_NEW_TO_VCRUNTIME
|
||||||
|
#if !defined(__cpp_aligned_new)
|
||||||
|
// We're defering to Microsoft's STL to provide aligned new et al. We don't
|
||||||
|
// have it unless the language feature test macro is defined.
|
||||||
|
#define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
@@ -994,14 +1001,14 @@ template <unsigned> struct __static_assert_check {};
|
|||||||
# endif
|
# endif
|
||||||
# if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
|
# if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
|
||||||
# if __MAC_OS_X_VERSION_MIN_REQUIRED < 1060
|
# if __MAC_OS_X_VERSION_MIN_REQUIRED < 1060
|
||||||
# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif // defined(__APPLE__)
|
#endif // defined(__APPLE__)
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \
|
#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \
|
||||||
!defined(_LIBCPP_BUILDING_LIBRARY) && \
|
(defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) || \
|
||||||
(!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606)
|
(!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606))
|
||||||
# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -2016,7 +2016,7 @@ get_temporary_buffer(ptrdiff_t __n) _NOEXCEPT
|
|||||||
__n = __m;
|
__n = __m;
|
||||||
while (__n > 0)
|
while (__n > 0)
|
||||||
{
|
{
|
||||||
#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION)
|
#if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION)
|
||||||
if (__is_overaligned_for_new(__alignof(_Tp)))
|
if (__is_overaligned_for_new(__alignof(_Tp)))
|
||||||
{
|
{
|
||||||
std::align_val_t __al =
|
std::align_val_t __al =
|
||||||
|
39
include/new
39
include/new
@@ -104,16 +104,18 @@ void operator delete[](void* ptr, void*) noexcept;
|
|||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !(defined(_LIBCPP_BUILDING_LIBRARY) || _LIBCPP_STD_VER >= 14 || \
|
#if !defined(_LIBCPP_BUILDING_LIBRARY) && _LIBCPP_STD_VER < 14
|
||||||
(defined(__cpp_sized_deallocation) && __cpp_sized_deallocation >= 201309))
|
# define _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION) || \
|
||||||
|
!defined(__cpp_sized_deallocation) || __cpp_sized_deallocation < 201309
|
||||||
# define _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
# define _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !__has_builtin(__builtin_operator_new) || \
|
#if !__has_builtin(__builtin_operator_new) || \
|
||||||
__has_builtin(__builtin_operator_new) < 201802L || \
|
__has_builtin(__builtin_operator_new) < 201802L
|
||||||
defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) || \
|
#define _LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE
|
||||||
!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606
|
|
||||||
#define _LIBCPP_HAS_NO_BUILTIN_ALIGNED_OPERATOR_NEW_DELETE
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace std // purposefully not using versioning namespace
|
namespace std // purposefully not using versioning namespace
|
||||||
@@ -163,19 +165,14 @@ public:
|
|||||||
|
|
||||||
#endif // defined(_LIBCPP_BUILDING_LIBRARY) || (_LIBCPP_STD_VER > 11)
|
#endif // defined(_LIBCPP_BUILDING_LIBRARY) || (_LIBCPP_STD_VER > 11)
|
||||||
|
|
||||||
#if !defined(_LIBCPP_ABI_MICROSOFT) || defined(_LIBCPP_NO_VCRUNTIME)
|
#if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) && \
|
||||||
#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) || _LIBCPP_STD_VER > 14
|
!defined(_LIBCPP_DEFER_NEW_TO_VCRUNTIME)
|
||||||
#ifndef _LIBCPP_CXX03_LANG
|
#ifndef _LIBCPP_CXX03_LANG
|
||||||
enum class _LIBCPP_ENUM_VIS align_val_t : size_t { };
|
enum class _LIBCPP_ENUM_VIS align_val_t : size_t { };
|
||||||
#else
|
#else
|
||||||
enum align_val_t { __zero = 0, __max = (size_t)-1 };
|
enum align_val_t { __zero = 0, __max = (size_t)-1 };
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#elif !defined(__cpp_aligned_new)
|
|
||||||
// We're defering to Microsoft's STL to provide aligned new et al. We don't
|
|
||||||
// have it unless the language feature test macro is defined.
|
|
||||||
#define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // std
|
} // std
|
||||||
|
|
||||||
@@ -185,13 +182,13 @@ enum align_val_t { __zero = 0, __max = (size_t)-1 };
|
|||||||
#define _THROW_BAD_ALLOC
|
#define _THROW_BAD_ALLOC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(_LIBCPP_ABI_MICROSOFT) || defined(_LIBCPP_NO_VCRUNTIME)
|
#if !defined(_LIBCPP_DEFER_NEW_TO_VCRUNTIME)
|
||||||
|
|
||||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz) _THROW_BAD_ALLOC;
|
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz) _THROW_BAD_ALLOC;
|
||||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p) _NOEXCEPT;
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||||
#ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete(void* __p, std::size_t __sz) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete(void* __p, std::size_t __sz) _NOEXCEPT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -199,16 +196,16 @@ _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](
|
|||||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p) _NOEXCEPT;
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||||
#ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete[](void* __p, std::size_t __sz) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete[](void* __p, std::size_t __sz) _NOEXCEPT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
#ifndef _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
|
||||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC;
|
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC;
|
||||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t) _NOEXCEPT;
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
|
||||||
#ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete(void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete(void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -216,7 +213,7 @@ _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](
|
|||||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t) _NOEXCEPT;
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
|
||||||
#ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
|
||||||
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete[](void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
|
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete[](void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -226,7 +223,7 @@ _LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY void* operator ne
|
|||||||
inline _LIBCPP_INLINE_VISIBILITY void operator delete (void*, void*) _NOEXCEPT {}
|
inline _LIBCPP_INLINE_VISIBILITY void operator delete (void*, void*) _NOEXCEPT {}
|
||||||
inline _LIBCPP_INLINE_VISIBILITY void operator delete[](void*, void*) _NOEXCEPT {}
|
inline _LIBCPP_INLINE_VISIBILITY void operator delete[](void*, void*) _NOEXCEPT {}
|
||||||
|
|
||||||
#endif // !_LIBCPP_ABI_MICROSOFT || _LIBCPP_NO_VCRUNTIME
|
#endif // !_LIBCPP_DEFER_NEW_TO_VCRUNTIME
|
||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
@@ -262,7 +259,7 @@ inline _LIBCPP_INLINE_VISIBILITY void __libcpp_deallocate(void* __ptr, size_t __
|
|||||||
#ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
#ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
||||||
if (__is_overaligned_for_new(__align)) {
|
if (__is_overaligned_for_new(__align)) {
|
||||||
const align_val_t __align_val = static_cast<align_val_t>(__align);
|
const align_val_t __align_val = static_cast<align_val_t>(__align);
|
||||||
# ifdef _LIBCPP_HAS_NO_BUILTIN_ALIGNED_OPERATOR_NEW_DELETE
|
# ifdef _LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE
|
||||||
return ::operator delete(__ptr, __align_val);
|
return ::operator delete(__ptr, __align_val);
|
||||||
# else
|
# else
|
||||||
return __builtin_operator_delete(__ptr, __align_val);
|
return __builtin_operator_delete(__ptr, __align_val);
|
||||||
|
@@ -55,7 +55,7 @@ __throw_bad_alloc()
|
|||||||
} // std
|
} // std
|
||||||
|
|
||||||
#if !defined(__GLIBCXX__) && \
|
#if !defined(__GLIBCXX__) && \
|
||||||
(!defined(_LIBCPP_ABI_MICROSOFT) || defined(_LIBCPP_NO_VCRUNTIME)) && \
|
!defined(_LIBCPP_DEFER_NEW_TO_VCRUNTIME) && \
|
||||||
!defined(_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS)
|
!defined(_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS)
|
||||||
|
|
||||||
// Implement all new and delete operators as weak definitions
|
// Implement all new and delete operators as weak definitions
|
||||||
@@ -173,7 +173,7 @@ operator delete[] (void* ptr, size_t) _NOEXCEPT
|
|||||||
::operator delete[](ptr);
|
::operator delete[](ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION)
|
#if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION)
|
||||||
|
|
||||||
_LIBCPP_WEAK
|
_LIBCPP_WEAK
|
||||||
void *
|
void *
|
||||||
@@ -298,5 +298,5 @@ operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
|
|||||||
::operator delete[](ptr, alignment);
|
::operator delete[](ptr, alignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // !_LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
#endif // !_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
|
||||||
#endif // !__GLIBCXX__ && (!_LIBCPP_ABI_MICROSOFT || _LIBCPP_NO_VCRUNTIME) && !_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS
|
#endif // !__GLIBCXX__ && (!_LIBCPP_ABI_MICROSOFT || _LIBCPP_NO_VCRUNTIME) && !_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS
|
||||||
|
Reference in New Issue
Block a user