1*fe6060f1SDimitry Andric // -*- C++ -*- 2*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 3*fe6060f1SDimitry Andric // 4*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 6*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*fe6060f1SDimitry Andric // 8*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 9*fe6060f1SDimitry Andric 10*fe6060f1SDimitry Andric #ifndef _LIBCPP___MEMORY_ADDRESSOF_H 11*fe6060f1SDimitry Andric #define _LIBCPP___MEMORY_ADDRESSOF_H 12*fe6060f1SDimitry Andric 13*fe6060f1SDimitry Andric #include <__config> 14*fe6060f1SDimitry Andric 15*fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 16*fe6060f1SDimitry Andric #pragma GCC system_header 17*fe6060f1SDimitry Andric #endif 18*fe6060f1SDimitry Andric 19*fe6060f1SDimitry Andric _LIBCPP_PUSH_MACROS 20*fe6060f1SDimitry Andric #include <__undef_macros> 21*fe6060f1SDimitry Andric 22*fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 23*fe6060f1SDimitry Andric 24*fe6060f1SDimitry Andric #ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF 25*fe6060f1SDimitry Andric 26*fe6060f1SDimitry Andric template <class _Tp> 27*fe6060f1SDimitry Andric inline _LIBCPP_CONSTEXPR_AFTER_CXX14 28*fe6060f1SDimitry Andric _LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY 29*fe6060f1SDimitry Andric _Tp* 30*fe6060f1SDimitry Andric addressof(_Tp& __x) _NOEXCEPT 31*fe6060f1SDimitry Andric { 32*fe6060f1SDimitry Andric return __builtin_addressof(__x); 33*fe6060f1SDimitry Andric } 34*fe6060f1SDimitry Andric 35*fe6060f1SDimitry Andric #else 36*fe6060f1SDimitry Andric 37*fe6060f1SDimitry Andric template <class _Tp> 38*fe6060f1SDimitry Andric inline _LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY 39*fe6060f1SDimitry Andric _Tp* 40*fe6060f1SDimitry Andric addressof(_Tp& __x) _NOEXCEPT 41*fe6060f1SDimitry Andric { 42*fe6060f1SDimitry Andric return reinterpret_cast<_Tp *>( 43*fe6060f1SDimitry Andric const_cast<char *>(&reinterpret_cast<const volatile char &>(__x))); 44*fe6060f1SDimitry Andric } 45*fe6060f1SDimitry Andric 46*fe6060f1SDimitry Andric #endif // _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF 47*fe6060f1SDimitry Andric 48*fe6060f1SDimitry Andric #if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF) 49*fe6060f1SDimitry Andric // Objective-C++ Automatic Reference Counting uses qualified pointers 50*fe6060f1SDimitry Andric // that require special addressof() signatures. When 51*fe6060f1SDimitry Andric // _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler 52*fe6060f1SDimitry Andric // itself is providing these definitions. Otherwise, we provide them. 53*fe6060f1SDimitry Andric template <class _Tp> 54*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 55*fe6060f1SDimitry Andric __strong _Tp* 56*fe6060f1SDimitry Andric addressof(__strong _Tp& __x) _NOEXCEPT 57*fe6060f1SDimitry Andric { 58*fe6060f1SDimitry Andric return &__x; 59*fe6060f1SDimitry Andric } 60*fe6060f1SDimitry Andric 61*fe6060f1SDimitry Andric #ifdef _LIBCPP_HAS_OBJC_ARC_WEAK 62*fe6060f1SDimitry Andric template <class _Tp> 63*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 64*fe6060f1SDimitry Andric __weak _Tp* 65*fe6060f1SDimitry Andric addressof(__weak _Tp& __x) _NOEXCEPT 66*fe6060f1SDimitry Andric { 67*fe6060f1SDimitry Andric return &__x; 68*fe6060f1SDimitry Andric } 69*fe6060f1SDimitry Andric #endif 70*fe6060f1SDimitry Andric 71*fe6060f1SDimitry Andric template <class _Tp> 72*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 73*fe6060f1SDimitry Andric __autoreleasing _Tp* 74*fe6060f1SDimitry Andric addressof(__autoreleasing _Tp& __x) _NOEXCEPT 75*fe6060f1SDimitry Andric { 76*fe6060f1SDimitry Andric return &__x; 77*fe6060f1SDimitry Andric } 78*fe6060f1SDimitry Andric 79*fe6060f1SDimitry Andric template <class _Tp> 80*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 81*fe6060f1SDimitry Andric __unsafe_unretained _Tp* 82*fe6060f1SDimitry Andric addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT 83*fe6060f1SDimitry Andric { 84*fe6060f1SDimitry Andric return &__x; 85*fe6060f1SDimitry Andric } 86*fe6060f1SDimitry Andric #endif 87*fe6060f1SDimitry Andric 88*fe6060f1SDimitry Andric #if !defined(_LIBCPP_CXX03_LANG) 89*fe6060f1SDimitry Andric template <class _Tp> _Tp* addressof(const _Tp&&) noexcept = delete; 90*fe6060f1SDimitry Andric #endif 91*fe6060f1SDimitry Andric 92*fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD 93*fe6060f1SDimitry Andric 94*fe6060f1SDimitry Andric _LIBCPP_POP_MACROS 95*fe6060f1SDimitry Andric 96*fe6060f1SDimitry Andric #endif // _LIBCPP___MEMORY_ADDRESSOF_H 97