1e78f53d1SNikolas Klauser // -*- C++ -*- 2e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser // 4e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser // 8e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03___CONFIGURATION_AVAILABILITY_H 11*ce777190SNikolas Klauser #define _LIBCPP___CXX03___CONFIGURATION_AVAILABILITY_H 12e78f53d1SNikolas Klauser 1373fbae83SNikolas Klauser #include <__cxx03/__configuration/compiler.h> 1473fbae83SNikolas Klauser #include <__cxx03/__configuration/language.h> 15e78f53d1SNikolas Klauser 16e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17e78f53d1SNikolas Klauser # pragma GCC system_header 18e78f53d1SNikolas Klauser #endif 19e78f53d1SNikolas Klauser 20e78f53d1SNikolas Klauser // Libc++ is shipped by various vendors. In particular, it is used as a system 21e78f53d1SNikolas Klauser // library on macOS, iOS and other Apple platforms. In order for users to be 22e78f53d1SNikolas Klauser // able to compile a binary that is intended to be deployed to an older version 23e78f53d1SNikolas Klauser // of a platform, Clang provides availability attributes [1]. These attributes 24e78f53d1SNikolas Klauser // can be placed on declarations and are used to describe the life cycle of a 25e78f53d1SNikolas Klauser // symbol in the library. 26e78f53d1SNikolas Klauser // 27e78f53d1SNikolas Klauser // The main goal is to ensure a compile-time error if a symbol that hasn't been 28e78f53d1SNikolas Klauser // introduced in a previously released library is used in a program that targets 29e78f53d1SNikolas Klauser // that previously released library. Normally, this would be a load-time error 30e78f53d1SNikolas Klauser // when one tries to launch the program against the older library. 31e78f53d1SNikolas Klauser // 32e78f53d1SNikolas Klauser // For example, the filesystem library was introduced in the dylib in LLVM 9. 33e78f53d1SNikolas Klauser // On Apple platforms, this corresponds to macOS 10.15. If a user compiles on 34e78f53d1SNikolas Klauser // a macOS 10.15 host but targets macOS 10.13 with their program, the compiler 35e78f53d1SNikolas Klauser // would normally not complain (because the required declarations are in the 36e78f53d1SNikolas Klauser // headers), but the dynamic loader would fail to find the symbols when actually 37e78f53d1SNikolas Klauser // trying to launch the program on macOS 10.13. To turn this into a compile-time 38e78f53d1SNikolas Klauser // issue instead, declarations are annotated with when they were introduced, and 39e78f53d1SNikolas Klauser // the compiler can produce a diagnostic if the program references something that 40e78f53d1SNikolas Klauser // isn't available on the deployment target. 41e78f53d1SNikolas Klauser // 42e78f53d1SNikolas Klauser // This mechanism is general in nature, and any vendor can add their markup to 43e78f53d1SNikolas Klauser // the library (see below). Whenever a new feature is added that requires support 44e78f53d1SNikolas Klauser // in the shared library, two macros are added below to allow marking the feature 45e78f53d1SNikolas Klauser // as unavailable: 46e78f53d1SNikolas Klauser // 1. A macro named `_LIBCPP_AVAILABILITY_HAS_<feature>` which must be defined 47e78f53d1SNikolas Klauser // to `_LIBCPP_INTRODUCED_IN_<version>` for the appropriate LLVM version. 48e78f53d1SNikolas Klauser // 2. A macro named `_LIBCPP_AVAILABILITY_<feature>`, which must be defined to 49e78f53d1SNikolas Klauser // `_LIBCPP_INTRODUCED_IN_<version>_MARKUP` for the appropriate LLVM version. 50e78f53d1SNikolas Klauser // 51e78f53d1SNikolas Klauser // When vendors decide to ship the feature as part of their shared library, they 52e78f53d1SNikolas Klauser // can update the `_LIBCPP_INTRODUCED_IN_<version>` macro (and the markup counterpart) 53e78f53d1SNikolas Klauser // based on the platform version they shipped that version of LLVM in. The library 54e78f53d1SNikolas Klauser // will then use this markup to provide an optimal user experience on these platforms. 55e78f53d1SNikolas Klauser // 56e78f53d1SNikolas Klauser // Furthermore, many features in the standard library have corresponding 57e78f53d1SNikolas Klauser // feature-test macros. The `_LIBCPP_AVAILABILITY_HAS_<feature>` macros 58e78f53d1SNikolas Klauser // are checked by the corresponding feature-test macros generated by 59e78f53d1SNikolas Klauser // generate_feature_test_macro_components.py to ensure that the library 60e78f53d1SNikolas Klauser // doesn't announce a feature as being implemented if it is unavailable on 61e78f53d1SNikolas Klauser // the deployment target. 62e78f53d1SNikolas Klauser // 63e78f53d1SNikolas Klauser // Note that this mechanism is disabled by default in the "upstream" libc++. 64e78f53d1SNikolas Klauser // Availability annotations are only meaningful when shipping libc++ inside 65e78f53d1SNikolas Klauser // a platform (i.e. as a system library), and so vendors that want them should 66e78f53d1SNikolas Klauser // turn those annotations on at CMake configuration time. 67e78f53d1SNikolas Klauser // 68e78f53d1SNikolas Klauser // [1]: https://clang.llvm.org/docs/AttributeReference.html#availability 69e78f53d1SNikolas Klauser 70e78f53d1SNikolas Klauser // For backwards compatibility, allow users to define _LIBCPP_DISABLE_AVAILABILITY 71e78f53d1SNikolas Klauser // for a while. 72e78f53d1SNikolas Klauser #if defined(_LIBCPP_DISABLE_AVAILABILITY) 73e78f53d1SNikolas Klauser # if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) 74e78f53d1SNikolas Klauser # define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS 75e78f53d1SNikolas Klauser # endif 76e78f53d1SNikolas Klauser #endif 77e78f53d1SNikolas Klauser 78e78f53d1SNikolas Klauser // Availability markup is disabled when building the library, or when a non-Clang 79e78f53d1SNikolas Klauser // compiler is used because only Clang supports the necessary attributes. 80e78f53d1SNikolas Klauser #if defined(_LIBCPP_BUILDING_LIBRARY) || defined(_LIBCXXABI_BUILDING_LIBRARY) || !defined(_LIBCPP_COMPILER_CLANG_BASED) 81e78f53d1SNikolas Klauser # if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) 82e78f53d1SNikolas Klauser # define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS 83e78f53d1SNikolas Klauser # endif 84e78f53d1SNikolas Klauser #endif 85e78f53d1SNikolas Klauser 86e78f53d1SNikolas Klauser // When availability annotations are disabled, we take for granted that features introduced 87e78f53d1SNikolas Klauser // in all versions of the library are available. 88e78f53d1SNikolas Klauser #if defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) 89e78f53d1SNikolas Klauser 90e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_19 1 91e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE /* nothing */ 92e78f53d1SNikolas Klauser 93e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_18 1 94e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_18_ATTRIBUTE /* nothing */ 95e78f53d1SNikolas Klauser 96e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_17 1 97e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_17_ATTRIBUTE /* nothing */ 98e78f53d1SNikolas Klauser 99e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_16 1 100e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_16_ATTRIBUTE /* nothing */ 101e78f53d1SNikolas Klauser 102e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_15 1 103e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_15_ATTRIBUTE /* nothing */ 104e78f53d1SNikolas Klauser 105e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_14 1 106e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_14_ATTRIBUTE /* nothing */ 107e78f53d1SNikolas Klauser 108e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_13 1 109e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_13_ATTRIBUTE /* nothing */ 110e78f53d1SNikolas Klauser 111e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_12 1 112e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_12_ATTRIBUTE /* nothing */ 113e78f53d1SNikolas Klauser 114e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_11 1 115e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE /* nothing */ 116e78f53d1SNikolas Klauser 117e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_10 1 118e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_10_ATTRIBUTE /* nothing */ 119e78f53d1SNikolas Klauser 120e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_9 1 121e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE /* nothing */ 122e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_PUSH /* nothing */ 123e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_POP /* nothing */ 124e78f53d1SNikolas Klauser 125e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_8 1 126e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_8_ATTRIBUTE /* nothing */ 127e78f53d1SNikolas Klauser 128e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_4 1 129e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE /* nothing */ 130e78f53d1SNikolas Klauser 131e78f53d1SNikolas Klauser #elif defined(__APPLE__) 132e78f53d1SNikolas Klauser 133e78f53d1SNikolas Klauser // clang-format off 134e78f53d1SNikolas Klauser 135e78f53d1SNikolas Klauser // LLVM 19 136e78f53d1SNikolas Klauser // TODO: Fill this in 137e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_19 0 138e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE __attribute__((unavailable)) 139e78f53d1SNikolas Klauser 140e78f53d1SNikolas Klauser // LLVM 18 141e78f53d1SNikolas Klauser // TODO: Fill this in 142e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_18 0 143e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_18_ATTRIBUTE __attribute__((unavailable)) 144e78f53d1SNikolas Klauser 145e78f53d1SNikolas Klauser // LLVM 17 146e78f53d1SNikolas Klauser # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 140400) || \ 147e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 170400) || \ 148e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 170400) || \ 149e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 100400) 150e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_17 0 151e78f53d1SNikolas Klauser # else 152e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_17 1 153e78f53d1SNikolas Klauser # endif 154e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_17_ATTRIBUTE \ 155e78f53d1SNikolas Klauser __attribute__((availability(macos, strict, introduced = 14.4))) \ 156e78f53d1SNikolas Klauser __attribute__((availability(ios, strict, introduced = 17.4))) \ 157e78f53d1SNikolas Klauser __attribute__((availability(tvos, strict, introduced = 17.4))) \ 158e78f53d1SNikolas Klauser __attribute__((availability(watchos, strict, introduced = 10.4))) 159e78f53d1SNikolas Klauser 160e78f53d1SNikolas Klauser // LLVM 16 161e78f53d1SNikolas Klauser # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 140000) || \ 162e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 170000) || \ 163e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 170000) || \ 164e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 100000) 165e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_16 0 166e78f53d1SNikolas Klauser # else 167e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_16 1 168e78f53d1SNikolas Klauser # endif 169e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_16_ATTRIBUTE \ 170e78f53d1SNikolas Klauser __attribute__((availability(macos, strict, introduced = 14.0))) \ 171e78f53d1SNikolas Klauser __attribute__((availability(ios, strict, introduced = 17.0))) \ 172e78f53d1SNikolas Klauser __attribute__((availability(tvos, strict, introduced = 17.0))) \ 173e78f53d1SNikolas Klauser __attribute__((availability(watchos, strict, introduced = 10.0))) 174e78f53d1SNikolas Klauser 175e78f53d1SNikolas Klauser // LLVM 15 176e78f53d1SNikolas Klauser # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 130400) || \ 177e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 160500) || \ 178e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 160500) || \ 179e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 90500) 180e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_15 0 181e78f53d1SNikolas Klauser # else 182e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_15 1 183e78f53d1SNikolas Klauser # endif 184e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_15_ATTRIBUTE \ 185e78f53d1SNikolas Klauser __attribute__((availability(macos, strict, introduced = 13.4))) \ 186e78f53d1SNikolas Klauser __attribute__((availability(ios, strict, introduced = 16.5))) \ 187e78f53d1SNikolas Klauser __attribute__((availability(tvos, strict, introduced = 16.5))) \ 188e78f53d1SNikolas Klauser __attribute__((availability(watchos, strict, introduced = 9.5))) 189e78f53d1SNikolas Klauser 190e78f53d1SNikolas Klauser // LLVM 14 191e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_14 _LIBCPP_INTRODUCED_IN_LLVM_15 192e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_14_ATTRIBUTE _LIBCPP_INTRODUCED_IN_LLVM_15_ATTRIBUTE 193e78f53d1SNikolas Klauser 194e78f53d1SNikolas Klauser // LLVM 13 195e78f53d1SNikolas Klauser # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 130000) || \ 196e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 160000) || \ 197e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 160000) || \ 198e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 90000) 199e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_13 0 200e78f53d1SNikolas Klauser # else 201e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_13 1 202e78f53d1SNikolas Klauser # endif 203e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_13_ATTRIBUTE \ 204e78f53d1SNikolas Klauser __attribute__((availability(macos, strict, introduced = 13.0))) \ 205e78f53d1SNikolas Klauser __attribute__((availability(ios, strict, introduced = 16.0))) \ 206e78f53d1SNikolas Klauser __attribute__((availability(tvos, strict, introduced = 16.0))) \ 207e78f53d1SNikolas Klauser __attribute__((availability(watchos, strict, introduced = 9.0))) 208e78f53d1SNikolas Klauser 209e78f53d1SNikolas Klauser // LLVM 12 210e78f53d1SNikolas Klauser # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 120300) || \ 211e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 150300) || \ 212e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 150300) || \ 213e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 80300) 214e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_12 0 215e78f53d1SNikolas Klauser # else 216e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_12 1 217e78f53d1SNikolas Klauser # endif 218e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_12_ATTRIBUTE \ 219e78f53d1SNikolas Klauser __attribute__((availability(macos, strict, introduced = 12.3))) \ 220e78f53d1SNikolas Klauser __attribute__((availability(ios, strict, introduced = 15.3))) \ 221e78f53d1SNikolas Klauser __attribute__((availability(tvos, strict, introduced = 15.3))) \ 222e78f53d1SNikolas Klauser __attribute__((availability(watchos, strict, introduced = 8.3))) 223e78f53d1SNikolas Klauser 224e78f53d1SNikolas Klauser // LLVM 11 225e78f53d1SNikolas Klauser # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 110000) || \ 226e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 140000) || \ 227e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 140000) || \ 228e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 70000) 229e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_11 0 230e78f53d1SNikolas Klauser # else 231e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_11 1 232e78f53d1SNikolas Klauser # endif 233e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE \ 234e78f53d1SNikolas Klauser __attribute__((availability(macos, strict, introduced = 11.0))) \ 235e78f53d1SNikolas Klauser __attribute__((availability(ios, strict, introduced = 14.0))) \ 236e78f53d1SNikolas Klauser __attribute__((availability(tvos, strict, introduced = 14.0))) \ 237e78f53d1SNikolas Klauser __attribute__((availability(watchos, strict, introduced = 7.0))) 238e78f53d1SNikolas Klauser 239e78f53d1SNikolas Klauser // LLVM 10 240e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_10 _LIBCPP_INTRODUCED_IN_LLVM_11 241e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_10_ATTRIBUTE _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE 242e78f53d1SNikolas Klauser 243e78f53d1SNikolas Klauser // LLVM 9 244e78f53d1SNikolas Klauser # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) || \ 245e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 130000) || \ 246e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 130000) || \ 247e78f53d1SNikolas Klauser (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 60000) 248e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_9 0 249e78f53d1SNikolas Klauser # else 250e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_9 1 251e78f53d1SNikolas Klauser # endif 252e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE \ 253e78f53d1SNikolas Klauser __attribute__((availability(macos, strict, introduced = 10.15))) \ 254e78f53d1SNikolas Klauser __attribute__((availability(ios, strict, introduced = 13.0))) \ 255e78f53d1SNikolas Klauser __attribute__((availability(tvos, strict, introduced = 13.0))) \ 256e78f53d1SNikolas Klauser __attribute__((availability(watchos, strict, introduced = 6.0))) 257e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_PUSH \ 258e78f53d1SNikolas Klauser _Pragma("clang attribute push(__attribute__((availability(macos,strict,introduced=10.15))), apply_to=any(function,record))") \ 259e78f53d1SNikolas Klauser _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \ 260e78f53d1SNikolas Klauser _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \ 261e78f53d1SNikolas Klauser _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))") 262e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_POP \ 263e78f53d1SNikolas Klauser _Pragma("clang attribute pop") \ 264e78f53d1SNikolas Klauser _Pragma("clang attribute pop") \ 265e78f53d1SNikolas Klauser _Pragma("clang attribute pop") \ 266e78f53d1SNikolas Klauser _Pragma("clang attribute pop") 267e78f53d1SNikolas Klauser 268e78f53d1SNikolas Klauser // LLVM 4 269e78f53d1SNikolas Klauser # if defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 50000 270e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_4 0 271e78f53d1SNikolas Klauser # else 272e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_4 1 273e78f53d1SNikolas Klauser # endif 274e78f53d1SNikolas Klauser # define _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE __attribute__((availability(watchos, strict, introduced = 5.0))) 275e78f53d1SNikolas Klauser 276e78f53d1SNikolas Klauser // clang-format on 277e78f53d1SNikolas Klauser 278e78f53d1SNikolas Klauser #else 279e78f53d1SNikolas Klauser 280e78f53d1SNikolas Klauser // ...New vendors can add availability markup here... 281e78f53d1SNikolas Klauser 282e78f53d1SNikolas Klauser # error \ 283e78f53d1SNikolas Klauser "It looks like you're trying to enable vendor availability markup, but you haven't defined the corresponding macros yet!" 284e78f53d1SNikolas Klauser 285e78f53d1SNikolas Klauser #endif 286e78f53d1SNikolas Klauser 287e78f53d1SNikolas Klauser // These macros control the availability of std::bad_optional_access and 288e78f53d1SNikolas Klauser // other exception types. These were put in the shared library to prevent 289e78f53d1SNikolas Klauser // code bloat from every user program defining the vtable for these exception 290e78f53d1SNikolas Klauser // types. 291e78f53d1SNikolas Klauser // 292e78f53d1SNikolas Klauser // Note that when exceptions are disabled, the methods that normally throw 293e78f53d1SNikolas Klauser // these exceptions can be used even on older deployment targets, but those 294e78f53d1SNikolas Klauser // methods will abort instead of throwing. 295e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_BAD_OPTIONAL_ACCESS _LIBCPP_INTRODUCED_IN_LLVM_4 296e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE 297e78f53d1SNikolas Klauser 298e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_BAD_VARIANT_ACCESS _LIBCPP_INTRODUCED_IN_LLVM_4 299e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE 300e78f53d1SNikolas Klauser 301e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_BAD_ANY_CAST _LIBCPP_INTRODUCED_IN_LLVM_4 302e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_BAD_ANY_CAST _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE 303e78f53d1SNikolas Klauser 304e78f53d1SNikolas Klauser // These macros control the availability of all parts of <filesystem> that 305e78f53d1SNikolas Klauser // depend on something in the dylib. 306e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_LIBRARY _LIBCPP_INTRODUCED_IN_LLVM_9 307e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE 308e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_PUSH 309e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_POP 310e78f53d1SNikolas Klauser 311e78f53d1SNikolas Klauser // This controls the availability of the C++20 synchronization library, 312e78f53d1SNikolas Klauser // which requires shared library support for various operations 313e78f53d1SNikolas Klauser // (see libcxx/src/atomic.cpp). This includes <barier>, <latch>, 314e78f53d1SNikolas Klauser // <semaphore>, and notification functions on std::atomic. 315e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_SYNC _LIBCPP_INTRODUCED_IN_LLVM_11 316e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE 317e78f53d1SNikolas Klauser 318e78f53d1SNikolas Klauser // Enable additional explicit instantiations of iostreams components. This 319e78f53d1SNikolas Klauser // reduces the number of weak definitions generated in programs that use 320e78f53d1SNikolas Klauser // iostreams by providing a single strong definition in the shared library. 321e78f53d1SNikolas Klauser // 322e78f53d1SNikolas Klauser // TODO: Enable additional explicit instantiations on GCC once it supports exclude_from_explicit_instantiation, 323e78f53d1SNikolas Klauser // or once libc++ doesn't use the attribute anymore. 324e78f53d1SNikolas Klauser // TODO: Enable them on Windows once https://llvm.org/PR41018 has been fixed. 325e78f53d1SNikolas Klauser #if !defined(_LIBCPP_COMPILER_GCC) && !defined(_WIN32) 326e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 _LIBCPP_INTRODUCED_IN_LLVM_12 327e78f53d1SNikolas Klauser #else 328e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 0 329e78f53d1SNikolas Klauser #endif 330e78f53d1SNikolas Klauser 331e78f53d1SNikolas Klauser // This controls the availability of floating-point std::to_chars functions. 332e78f53d1SNikolas Klauser // These overloads were added later than the integer overloads. 333e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT _LIBCPP_INTRODUCED_IN_LLVM_14 334e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT _LIBCPP_INTRODUCED_IN_LLVM_14_ATTRIBUTE 335e78f53d1SNikolas Klauser 336e78f53d1SNikolas Klauser // This controls whether the library claims to provide a default verbose 337e78f53d1SNikolas Klauser // termination function, and consequently whether the headers will try 338e78f53d1SNikolas Klauser // to use it when the mechanism isn't overriden at compile-time. 339e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_VERBOSE_ABORT _LIBCPP_INTRODUCED_IN_LLVM_15 340e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_VERBOSE_ABORT _LIBCPP_INTRODUCED_IN_LLVM_15_ATTRIBUTE 341e78f53d1SNikolas Klauser 342e78f53d1SNikolas Klauser // This controls the availability of the C++17 std::pmr library, 343e78f53d1SNikolas Klauser // which is implemented in large part in the built library. 344e78f53d1SNikolas Klauser // 345e78f53d1SNikolas Klauser // TODO: Enable std::pmr markup once https://github.com/llvm/llvm-project/issues/40340 has been fixed 346e78f53d1SNikolas Klauser // Until then, it is possible for folks to try to use `std::pmr` when back-deploying to targets that don't support 347e78f53d1SNikolas Klauser // it and it'll be a load-time error, but we don't have a good alternative because the library won't compile if we 348e78f53d1SNikolas Klauser // use availability annotations until that bug has been fixed. 349e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_PMR _LIBCPP_INTRODUCED_IN_LLVM_16 350e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_PMR 351e78f53d1SNikolas Klauser 352e78f53d1SNikolas Klauser // These macros controls the availability of __cxa_init_primary_exception 353e78f53d1SNikolas Klauser // in the built library, which std::make_exception_ptr might use 354e78f53d1SNikolas Klauser // (see libcxx/include/__exception/exception_ptr.h). 355e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION _LIBCPP_INTRODUCED_IN_LLVM_18 356e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_INIT_PRIMARY_EXCEPTION _LIBCPP_INTRODUCED_IN_LLVM_18_ATTRIBUTE 357e78f53d1SNikolas Klauser 358e78f53d1SNikolas Klauser // This controls the availability of C++23 <print>, which 359e78f53d1SNikolas Klauser // has a dependency on the built library (it needs access to 360e78f53d1SNikolas Klauser // the underlying buffer types of std::cout, std::cerr, and std::clog. 361e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_PRINT _LIBCPP_INTRODUCED_IN_LLVM_18 362e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_PRINT _LIBCPP_INTRODUCED_IN_LLVM_18_ATTRIBUTE 363e78f53d1SNikolas Klauser 364e78f53d1SNikolas Klauser // This controls the availability of the C++20 time zone database. 365e78f53d1SNikolas Klauser // The parser code is built in the library. 366e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_TZDB _LIBCPP_INTRODUCED_IN_LLVM_19 367e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_TZDB _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE 368e78f53d1SNikolas Klauser 369e78f53d1SNikolas Klauser // These macros determine whether we assume that std::bad_function_call and 370e78f53d1SNikolas Klauser // std::bad_expected_access provide a key function in the dylib. This allows 371e78f53d1SNikolas Klauser // centralizing their vtable and typeinfo instead of having all TUs provide 372e78f53d1SNikolas Klauser // a weak definition that then gets deduplicated. 373e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_BAD_FUNCTION_CALL_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19 374e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_BAD_FUNCTION_CALL_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE 375e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_HAS_BAD_EXPECTED_ACCESS_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19 376e78f53d1SNikolas Klauser #define _LIBCPP_AVAILABILITY_BAD_EXPECTED_ACCESS_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE 377e78f53d1SNikolas Klauser 378e78f53d1SNikolas Klauser // Define availability attributes that depend on _LIBCPP_HAS_NO_EXCEPTIONS. 379e78f53d1SNikolas Klauser // Those are defined in terms of the availability attributes above, and 380e78f53d1SNikolas Klauser // should not be vendor-specific. 381e78f53d1SNikolas Klauser #if defined(_LIBCPP_HAS_NO_EXCEPTIONS) 382e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 383e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS 384e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS 385e78f53d1SNikolas Klauser #else 386e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST _LIBCPP_AVAILABILITY_BAD_ANY_CAST 387e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS 388e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS 389e78f53d1SNikolas Klauser #endif 390e78f53d1SNikolas Klauser 391e78f53d1SNikolas Klauser // Define availability attributes that depend on both 392e78f53d1SNikolas Klauser // _LIBCPP_HAS_NO_EXCEPTIONS and _LIBCPP_HAS_NO_RTTI. 393e78f53d1SNikolas Klauser #if defined(_LIBCPP_HAS_NO_EXCEPTIONS) || defined(_LIBCPP_HAS_NO_RTTI) 394e78f53d1SNikolas Klauser # undef _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION 395e78f53d1SNikolas Klauser # undef _LIBCPP_AVAILABILITY_INIT_PRIMARY_EXCEPTION 396e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION 0 397e78f53d1SNikolas Klauser # define _LIBCPP_AVAILABILITY_INIT_PRIMARY_EXCEPTION 398e78f53d1SNikolas Klauser #endif 399e78f53d1SNikolas Klauser 400*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___CONFIGURATION_AVAILABILITY_H 401