xref: /freebsd-src/contrib/llvm-project/libcxx/include/__memory/addressof.h (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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