[libc++] Enable aligned allocation based on feature test macro, irrespective of standard
Summary: The current code enables aligned allocation functions when compiling in C++17 and later. This is a problem because aligned allocation functions might not be supported on the target platform, which leads to an error at link time. Since r338934, Clang knows not to define __cpp_aligned_new when it's not available on the target platform -- this commit takes advantage of that to only use aligned allocation functions when they are available. Reviewers: vsapsai, EricWF Subscribers: christof, dexonsmith, cfe-commits, EricWF, mclow.lists Differential Revision: https://reviews.llvm.org/D50344 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@339431 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -988,6 +988,11 @@ template <unsigned> struct __static_assert_check {};
|
|||||||
# endif
|
# endif
|
||||||
#endif // defined(__APPLE__)
|
#endif // defined(__APPLE__)
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \
|
||||||
|
!defined(_LIBCPP_BUILDING_LIBRARY) && \
|
||||||
|
(!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606)
|
||||||
|
# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(__FreeBSD__)
|
#if defined(__APPLE__) || defined(__FreeBSD__)
|
||||||
#define _LIBCPP_HAS_DEFAULTRUNELOCALE
|
#define _LIBCPP_HAS_DEFAULTRUNELOCALE
|
||||||
|
|||||||
@@ -108,13 +108,6 @@ void operator delete[](void* ptr, void*) noexcept;
|
|||||||
# define _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
# define _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \
|
|
||||||
(!(defined(_LIBCPP_BUILDING_LIBRARY) || _LIBCPP_STD_VER > 14 || \
|
|
||||||
(defined(__cpp_aligned_new) && __cpp_aligned_new >= 201606)))
|
|
||||||
# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
|
||||||
#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) || \
|
defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) || \
|
||||||
|
|||||||
25
test/libcxx/memory/aligned_allocation_macro.pass.cpp
Normal file
25
test/libcxx/memory/aligned_allocation_macro.pass.cpp
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||||
|
// Source Licenses. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
// UNSUPPORTED: c++98, c++03, c++11, c++14
|
||||||
|
// XFAIL: with_system_cxx_lib=macosx10.12
|
||||||
|
// XFAIL: with_system_cxx_lib=macosx10.11
|
||||||
|
// XFAIL: with_system_cxx_lib=macosx10.10
|
||||||
|
// XFAIL: with_system_cxx_lib=macosx10.9
|
||||||
|
// XFAIL: with_system_cxx_lib=macosx10.8
|
||||||
|
// XFAIL: with_system_cxx_lib=macosx10.7
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
||||||
|
# error "libc++ should have aligned allocation in C++17 and up when targeting a platform that supports it"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main() { }
|
||||||
Reference in New Issue
Block a user