1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===--------------------------- __config ---------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_CONFIG 11*4d6fc14bSjoerg#define _LIBCPP_CONFIG 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg#include <__config_site> 14*4d6fc14bSjoerg 15*4d6fc14bSjoerg#if defined(_MSC_VER) && !defined(__clang__) 16*4d6fc14bSjoerg# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17*4d6fc14bSjoerg# define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER 18*4d6fc14bSjoerg# endif 19*4d6fc14bSjoerg#endif 20*4d6fc14bSjoerg 21*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER 22*4d6fc14bSjoerg#pragma GCC system_header 23*4d6fc14bSjoerg#endif 24*4d6fc14bSjoerg 25*4d6fc14bSjoerg#ifdef __cplusplus 26*4d6fc14bSjoerg 27*4d6fc14bSjoerg#ifdef __GNUC__ 28*4d6fc14bSjoerg# define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__) 29*4d6fc14bSjoerg// The _GNUC_VER_NEW macro better represents the new GCC versioning scheme 30*4d6fc14bSjoerg// introduced in GCC 5.0. 31*4d6fc14bSjoerg# define _GNUC_VER_NEW (_GNUC_VER * 10 + __GNUC_PATCHLEVEL__) 32*4d6fc14bSjoerg#else 33*4d6fc14bSjoerg# define _GNUC_VER 0 34*4d6fc14bSjoerg# define _GNUC_VER_NEW 0 35*4d6fc14bSjoerg#endif 36*4d6fc14bSjoerg 37*4d6fc14bSjoerg#define _LIBCPP_VERSION 13000 38*4d6fc14bSjoerg 39*4d6fc14bSjoerg#ifndef _LIBCPP_ABI_VERSION 40*4d6fc14bSjoerg# define _LIBCPP_ABI_VERSION 1 41*4d6fc14bSjoerg#endif 42*4d6fc14bSjoerg 43*4d6fc14bSjoerg#if __STDC_HOSTED__ == 0 44*4d6fc14bSjoerg# define _LIBCPP_FREESTANDING 45*4d6fc14bSjoerg#endif 46*4d6fc14bSjoerg 47*4d6fc14bSjoerg#ifndef _LIBCPP_STD_VER 48*4d6fc14bSjoerg# if __cplusplus <= 201103L 49*4d6fc14bSjoerg# define _LIBCPP_STD_VER 11 50*4d6fc14bSjoerg# elif __cplusplus <= 201402L 51*4d6fc14bSjoerg# define _LIBCPP_STD_VER 14 52*4d6fc14bSjoerg# elif __cplusplus <= 201703L 53*4d6fc14bSjoerg# define _LIBCPP_STD_VER 17 54*4d6fc14bSjoerg# elif __cplusplus <= 202002L 55*4d6fc14bSjoerg# define _LIBCPP_STD_VER 20 56*4d6fc14bSjoerg# else 57*4d6fc14bSjoerg# define _LIBCPP_STD_VER 21 // current year, or date of c++2b ratification 58*4d6fc14bSjoerg# endif 59*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER 60*4d6fc14bSjoerg 61*4d6fc14bSjoerg#if defined(__ELF__) 62*4d6fc14bSjoerg# define _LIBCPP_OBJECT_FORMAT_ELF 1 63*4d6fc14bSjoerg#elif defined(__MACH__) 64*4d6fc14bSjoerg# define _LIBCPP_OBJECT_FORMAT_MACHO 1 65*4d6fc14bSjoerg#elif defined(_WIN32) 66*4d6fc14bSjoerg# define _LIBCPP_OBJECT_FORMAT_COFF 1 67*4d6fc14bSjoerg#elif defined(__wasm__) 68*4d6fc14bSjoerg# define _LIBCPP_OBJECT_FORMAT_WASM 1 69*4d6fc14bSjoerg#else 70*4d6fc14bSjoerg // ... add new file formats here ... 71*4d6fc14bSjoerg#endif 72*4d6fc14bSjoerg 73*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2 74*4d6fc14bSjoerg// Change short string representation so that string data starts at offset 0, 75*4d6fc14bSjoerg// improving its alignment in some cases. 76*4d6fc14bSjoerg# define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT 77*4d6fc14bSjoerg// Fix deque iterator type in order to support incomplete types. 78*4d6fc14bSjoerg# define _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE 79*4d6fc14bSjoerg// Fix undefined behavior in how std::list stores its linked nodes. 80*4d6fc14bSjoerg# define _LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB 81*4d6fc14bSjoerg// Fix undefined behavior in how __tree stores its end and parent nodes. 82*4d6fc14bSjoerg# define _LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB 83*4d6fc14bSjoerg// Fix undefined behavior in how __hash_table stores its pointer types. 84*4d6fc14bSjoerg# define _LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB 85*4d6fc14bSjoerg# define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB 86*4d6fc14bSjoerg# define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE 87*4d6fc14bSjoerg// Don't use a nullptr_t simulation type in C++03 instead using C++11 nullptr 88*4d6fc14bSjoerg// provided under the alternate keyword __nullptr, which changes the mangling 89*4d6fc14bSjoerg// of nullptr_t. This option is ABI incompatible with GCC in C++03 mode. 90*4d6fc14bSjoerg# define _LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR 91*4d6fc14bSjoerg// Define a key function for `bad_function_call` in the library, to centralize 92*4d6fc14bSjoerg// its vtable and typeinfo to libc++ rather than having all other libraries 93*4d6fc14bSjoerg// using that class define their own copies. 94*4d6fc14bSjoerg# define _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION 95*4d6fc14bSjoerg// Enable optimized version of __do_get_(un)signed which avoids redundant copies. 96*4d6fc14bSjoerg# define _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET 97*4d6fc14bSjoerg// Use the smallest possible integer type to represent the index of the variant. 98*4d6fc14bSjoerg// Previously libc++ used "unsigned int" exclusively. 99*4d6fc14bSjoerg# define _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION 100*4d6fc14bSjoerg// Unstable attempt to provide a more optimized std::function 101*4d6fc14bSjoerg# define _LIBCPP_ABI_OPTIMIZED_FUNCTION 102*4d6fc14bSjoerg// All the regex constants must be distinct and nonzero. 103*4d6fc14bSjoerg# define _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO 104*4d6fc14bSjoerg// Use raw pointers, not wrapped ones, for std::span's iterator type. 105*4d6fc14bSjoerg# define _LIBCPP_ABI_SPAN_POINTER_ITERATORS 106*4d6fc14bSjoerg// Re-worked external template instantiations for std::string with a focus on 107*4d6fc14bSjoerg// performance and fast-path inlining. 108*4d6fc14bSjoerg# define _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION 109*4d6fc14bSjoerg// Enable clang::trivial_abi on std::unique_ptr. 110*4d6fc14bSjoerg# define _LIBCPP_ABI_ENABLE_UNIQUE_PTR_TRIVIAL_ABI 111*4d6fc14bSjoerg// Enable clang::trivial_abi on std::shared_ptr and std::weak_ptr 112*4d6fc14bSjoerg# define _LIBCPP_ABI_ENABLE_SHARED_PTR_TRIVIAL_ABI 113*4d6fc14bSjoerg#elif _LIBCPP_ABI_VERSION == 1 114*4d6fc14bSjoerg# if !defined(_LIBCPP_OBJECT_FORMAT_COFF) 115*4d6fc14bSjoerg// Enable compiling copies of now inline methods into the dylib to support 116*4d6fc14bSjoerg// applications compiled against older libraries. This is unnecessary with 117*4d6fc14bSjoerg// COFF dllexport semantics, since dllexport forces a non-inline definition 118*4d6fc14bSjoerg// of inline functions to be emitted anyway. Our own non-inline copy would 119*4d6fc14bSjoerg// conflict with the dllexport-emitted copy, so we disable it. 120*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS 121*4d6fc14bSjoerg# endif 122*4d6fc14bSjoerg// Feature macros for disabling pre ABI v1 features. All of these options 123*4d6fc14bSjoerg// are deprecated. 124*4d6fc14bSjoerg# if defined(__FreeBSD__) 125*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR 126*4d6fc14bSjoerg# endif 127*4d6fc14bSjoerg#endif 128*4d6fc14bSjoerg 129*4d6fc14bSjoerg#if defined(_LIBCPP_BUILDING_LIBRARY) || defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2 130*4d6fc14bSjoerg// Enable additional explicit instantiations of iostreams components. This 131*4d6fc14bSjoerg// reduces the number of weak definitions generated in programs that use 132*4d6fc14bSjoerg// iostreams by providing a single strong definition in the shared library. 133*4d6fc14bSjoerg# define _LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 134*4d6fc14bSjoerg#endif 135*4d6fc14bSjoerg 136*4d6fc14bSjoerg#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y 137*4d6fc14bSjoerg#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) 138*4d6fc14bSjoerg 139*4d6fc14bSjoerg#ifndef _LIBCPP_ABI_NAMESPACE 140*4d6fc14bSjoerg# define _LIBCPP_ABI_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION) 141*4d6fc14bSjoerg#endif 142*4d6fc14bSjoerg 143*4d6fc14bSjoerg#if __cplusplus < 201103L 144*4d6fc14bSjoerg#define _LIBCPP_CXX03_LANG 145*4d6fc14bSjoerg#endif 146*4d6fc14bSjoerg 147*4d6fc14bSjoerg#ifndef __has_attribute 148*4d6fc14bSjoerg#define __has_attribute(__x) 0 149*4d6fc14bSjoerg#endif 150*4d6fc14bSjoerg 151*4d6fc14bSjoerg#ifndef __has_builtin 152*4d6fc14bSjoerg#define __has_builtin(__x) 0 153*4d6fc14bSjoerg#endif 154*4d6fc14bSjoerg 155*4d6fc14bSjoerg#ifndef __has_extension 156*4d6fc14bSjoerg#define __has_extension(__x) 0 157*4d6fc14bSjoerg#endif 158*4d6fc14bSjoerg 159*4d6fc14bSjoerg#ifndef __has_feature 160*4d6fc14bSjoerg#define __has_feature(__x) 0 161*4d6fc14bSjoerg#endif 162*4d6fc14bSjoerg 163*4d6fc14bSjoerg#ifndef __has_cpp_attribute 164*4d6fc14bSjoerg#define __has_cpp_attribute(__x) 0 165*4d6fc14bSjoerg#endif 166*4d6fc14bSjoerg 167*4d6fc14bSjoerg// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by 168*4d6fc14bSjoerg// the compiler and '1' otherwise. 169*4d6fc14bSjoerg#ifndef __is_identifier 170*4d6fc14bSjoerg#define __is_identifier(__x) 1 171*4d6fc14bSjoerg#endif 172*4d6fc14bSjoerg 173*4d6fc14bSjoerg#ifndef __has_declspec_attribute 174*4d6fc14bSjoerg#define __has_declspec_attribute(__x) 0 175*4d6fc14bSjoerg#endif 176*4d6fc14bSjoerg 177*4d6fc14bSjoerg#define __has_keyword(__x) !(__is_identifier(__x)) 178*4d6fc14bSjoerg 179*4d6fc14bSjoerg#ifndef __has_include 180*4d6fc14bSjoerg#define __has_include(...) 0 181*4d6fc14bSjoerg#endif 182*4d6fc14bSjoerg 183*4d6fc14bSjoerg#if defined(__apple_build_version__) 184*4d6fc14bSjoerg# define _LIBCPP_COMPILER_CLANG_BASED 185*4d6fc14bSjoerg# define _LIBCPP_APPLE_CLANG_VER (__apple_build_version__ / 10000) 186*4d6fc14bSjoerg#elif defined(__clang__) 187*4d6fc14bSjoerg# define _LIBCPP_COMPILER_CLANG_BASED 188*4d6fc14bSjoerg# define _LIBCPP_CLANG_VER (__clang_major__ * 100 + __clang_minor__) 189*4d6fc14bSjoerg#elif defined(__GNUC__) 190*4d6fc14bSjoerg# define _LIBCPP_COMPILER_GCC 191*4d6fc14bSjoerg#elif defined(_MSC_VER) 192*4d6fc14bSjoerg# define _LIBCPP_COMPILER_MSVC 193*4d6fc14bSjoerg#elif defined(__IBMCPP__) 194*4d6fc14bSjoerg# define _LIBCPP_COMPILER_IBM 195*4d6fc14bSjoerg#endif 196*4d6fc14bSjoerg 197*4d6fc14bSjoerg#if defined(_LIBCPP_COMPILER_GCC) && __cplusplus < 201103L 198*4d6fc14bSjoerg#error "libc++ does not support using GCC with C++03. Please enable C++11" 199*4d6fc14bSjoerg#endif 200*4d6fc14bSjoerg 201*4d6fc14bSjoerg// FIXME: ABI detection should be done via compiler builtin macros. This 202*4d6fc14bSjoerg// is just a placeholder until Clang implements such macros. For now assume 203*4d6fc14bSjoerg// that Windows compilers pretending to be MSVC++ target the Microsoft ABI, 204*4d6fc14bSjoerg// and allow the user to explicitly specify the ABI to handle cases where this 205*4d6fc14bSjoerg// heuristic falls short. 206*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_FORCE_ITANIUM) && defined(_LIBCPP_ABI_FORCE_MICROSOFT) 207*4d6fc14bSjoerg# error "Only one of _LIBCPP_ABI_FORCE_ITANIUM and _LIBCPP_ABI_FORCE_MICROSOFT can be defined" 208*4d6fc14bSjoerg#elif defined(_LIBCPP_ABI_FORCE_ITANIUM) 209*4d6fc14bSjoerg# define _LIBCPP_ABI_ITANIUM 210*4d6fc14bSjoerg#elif defined(_LIBCPP_ABI_FORCE_MICROSOFT) 211*4d6fc14bSjoerg# define _LIBCPP_ABI_MICROSOFT 212*4d6fc14bSjoerg#else 213*4d6fc14bSjoerg# if defined(_WIN32) && defined(_MSC_VER) 214*4d6fc14bSjoerg# define _LIBCPP_ABI_MICROSOFT 215*4d6fc14bSjoerg# else 216*4d6fc14bSjoerg# define _LIBCPP_ABI_ITANIUM 217*4d6fc14bSjoerg# endif 218*4d6fc14bSjoerg#endif 219*4d6fc14bSjoerg 220*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME) 221*4d6fc14bSjoerg# define _LIBCPP_ABI_VCRUNTIME 222*4d6fc14bSjoerg#endif 223*4d6fc14bSjoerg 224*4d6fc14bSjoerg// Need to detect which libc we're using if we're on Linux. 225*4d6fc14bSjoerg#if defined(__linux__) 226*4d6fc14bSjoerg# include <features.h> 227*4d6fc14bSjoerg# if defined(__GLIBC_PREREQ) 228*4d6fc14bSjoerg# define _LIBCPP_GLIBC_PREREQ(a, b) __GLIBC_PREREQ(a, b) 229*4d6fc14bSjoerg# else 230*4d6fc14bSjoerg# define _LIBCPP_GLIBC_PREREQ(a, b) 0 231*4d6fc14bSjoerg# endif // defined(__GLIBC_PREREQ) 232*4d6fc14bSjoerg#endif // defined(__linux__) 233*4d6fc14bSjoerg 234*4d6fc14bSjoerg#ifdef __LITTLE_ENDIAN__ 235*4d6fc14bSjoerg# if __LITTLE_ENDIAN__ 236*4d6fc14bSjoerg# define _LIBCPP_LITTLE_ENDIAN 237*4d6fc14bSjoerg# endif // __LITTLE_ENDIAN__ 238*4d6fc14bSjoerg#endif // __LITTLE_ENDIAN__ 239*4d6fc14bSjoerg 240*4d6fc14bSjoerg#ifdef __BIG_ENDIAN__ 241*4d6fc14bSjoerg# if __BIG_ENDIAN__ 242*4d6fc14bSjoerg# define _LIBCPP_BIG_ENDIAN 243*4d6fc14bSjoerg# endif // __BIG_ENDIAN__ 244*4d6fc14bSjoerg#endif // __BIG_ENDIAN__ 245*4d6fc14bSjoerg 246*4d6fc14bSjoerg#ifdef __BYTE_ORDER__ 247*4d6fc14bSjoerg# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 248*4d6fc14bSjoerg# define _LIBCPP_LITTLE_ENDIAN 249*4d6fc14bSjoerg# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 250*4d6fc14bSjoerg# define _LIBCPP_BIG_ENDIAN 251*4d6fc14bSjoerg# endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 252*4d6fc14bSjoerg#endif // __BYTE_ORDER__ 253*4d6fc14bSjoerg 254*4d6fc14bSjoerg#ifdef __FreeBSD__ 255*4d6fc14bSjoerg# include <sys/endian.h> 256*4d6fc14bSjoerg# include <osreldate.h> 257*4d6fc14bSjoerg# if _BYTE_ORDER == _LITTLE_ENDIAN 258*4d6fc14bSjoerg# define _LIBCPP_LITTLE_ENDIAN 259*4d6fc14bSjoerg# else // _BYTE_ORDER == _LITTLE_ENDIAN 260*4d6fc14bSjoerg# define _LIBCPP_BIG_ENDIAN 261*4d6fc14bSjoerg# endif // _BYTE_ORDER == _LITTLE_ENDIAN 262*4d6fc14bSjoerg# ifndef __LONG_LONG_SUPPORTED 263*4d6fc14bSjoerg# define _LIBCPP_HAS_NO_LONG_LONG 264*4d6fc14bSjoerg# endif // __LONG_LONG_SUPPORTED 265*4d6fc14bSjoerg#endif // __FreeBSD__ 266*4d6fc14bSjoerg 267*4d6fc14bSjoerg#if defined(__NetBSD__) || defined(__OpenBSD__) 268*4d6fc14bSjoerg# include <sys/endian.h> 269*4d6fc14bSjoerg# if _BYTE_ORDER == _LITTLE_ENDIAN 270*4d6fc14bSjoerg# define _LIBCPP_LITTLE_ENDIAN 271*4d6fc14bSjoerg# else // _BYTE_ORDER == _LITTLE_ENDIAN 272*4d6fc14bSjoerg# define _LIBCPP_BIG_ENDIAN 273*4d6fc14bSjoerg# endif // _BYTE_ORDER == _LITTLE_ENDIAN 274*4d6fc14bSjoerg#endif // defined(__NetBSD__) || defined(__OpenBSD__) 275*4d6fc14bSjoerg 276*4d6fc14bSjoerg#if defined(_WIN32) 277*4d6fc14bSjoerg# define _LIBCPP_WIN32API 278*4d6fc14bSjoerg# define _LIBCPP_LITTLE_ENDIAN 279*4d6fc14bSjoerg# define _LIBCPP_SHORT_WCHAR 1 280*4d6fc14bSjoerg// Both MinGW and native MSVC provide a "MSVC"-like environment 281*4d6fc14bSjoerg# define _LIBCPP_MSVCRT_LIKE 282*4d6fc14bSjoerg// If mingw not explicitly detected, assume using MS C runtime only if 283*4d6fc14bSjoerg// a MS compatibility version is specified. 284*4d6fc14bSjoerg# if defined(_MSC_VER) && !defined(__MINGW32__) 285*4d6fc14bSjoerg# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library 286*4d6fc14bSjoerg# endif 287*4d6fc14bSjoerg# if (defined(_M_AMD64) || defined(__x86_64__)) || (defined(_M_ARM) || defined(__arm__)) 288*4d6fc14bSjoerg# define _LIBCPP_HAS_BITSCAN64 289*4d6fc14bSjoerg# endif 290*4d6fc14bSjoerg# define _LIBCPP_HAS_OPEN_WITH_WCHAR 291*4d6fc14bSjoerg# if defined(_LIBCPP_MSVCRT) 292*4d6fc14bSjoerg# define _LIBCPP_HAS_QUICK_EXIT 293*4d6fc14bSjoerg# endif 294*4d6fc14bSjoerg 295*4d6fc14bSjoerg// Some CRT APIs are unavailable to store apps 296*4d6fc14bSjoerg# if defined(WINAPI_FAMILY) 297*4d6fc14bSjoerg# include <winapifamily.h> 298*4d6fc14bSjoerg# if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && \ 299*4d6fc14bSjoerg (!defined(WINAPI_PARTITION_SYSTEM) || \ 300*4d6fc14bSjoerg !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_SYSTEM)) 301*4d6fc14bSjoerg# define _LIBCPP_WINDOWS_STORE_APP 302*4d6fc14bSjoerg# endif 303*4d6fc14bSjoerg# endif 304*4d6fc14bSjoerg#endif // defined(_WIN32) 305*4d6fc14bSjoerg 306*4d6fc14bSjoerg#ifdef __sun__ 307*4d6fc14bSjoerg# include <sys/isa_defs.h> 308*4d6fc14bSjoerg# ifdef _LITTLE_ENDIAN 309*4d6fc14bSjoerg# define _LIBCPP_LITTLE_ENDIAN 310*4d6fc14bSjoerg# else 311*4d6fc14bSjoerg# define _LIBCPP_BIG_ENDIAN 312*4d6fc14bSjoerg# endif 313*4d6fc14bSjoerg#endif // __sun__ 314*4d6fc14bSjoerg 315*4d6fc14bSjoerg#if defined(__OpenBSD__) || defined(__CloudABI__) 316*4d6fc14bSjoerg // Certain architectures provide arc4random(). Prefer using 317*4d6fc14bSjoerg // arc4random() over /dev/{u,}random to make it possible to obtain 318*4d6fc14bSjoerg // random data even when using sandboxing mechanisms such as chroots, 319*4d6fc14bSjoerg // Capsicum, etc. 320*4d6fc14bSjoerg# define _LIBCPP_USING_ARC4_RANDOM 321*4d6fc14bSjoerg#elif defined(__Fuchsia__) || defined(__wasi__) 322*4d6fc14bSjoerg# define _LIBCPP_USING_GETENTROPY 323*4d6fc14bSjoerg#elif defined(__native_client__) 324*4d6fc14bSjoerg // NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access, 325*4d6fc14bSjoerg // including accesses to the special files under /dev. C++11's 326*4d6fc14bSjoerg // std::random_device is instead exposed through a NaCl syscall. 327*4d6fc14bSjoerg# define _LIBCPP_USING_NACL_RANDOM 328*4d6fc14bSjoerg#elif defined(_LIBCPP_WIN32API) 329*4d6fc14bSjoerg# define _LIBCPP_USING_WIN32_RANDOM 330*4d6fc14bSjoerg#else 331*4d6fc14bSjoerg# define _LIBCPP_USING_DEV_RANDOM 332*4d6fc14bSjoerg#endif 333*4d6fc14bSjoerg 334*4d6fc14bSjoerg#if !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN) 335*4d6fc14bSjoerg# include <endian.h> 336*4d6fc14bSjoerg# if __BYTE_ORDER == __LITTLE_ENDIAN 337*4d6fc14bSjoerg# define _LIBCPP_LITTLE_ENDIAN 338*4d6fc14bSjoerg# elif __BYTE_ORDER == __BIG_ENDIAN 339*4d6fc14bSjoerg# define _LIBCPP_BIG_ENDIAN 340*4d6fc14bSjoerg# else // __BYTE_ORDER == __BIG_ENDIAN 341*4d6fc14bSjoerg# error unable to determine endian 342*4d6fc14bSjoerg# endif 343*4d6fc14bSjoerg#endif // !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN) 344*4d6fc14bSjoerg 345*4d6fc14bSjoerg#if __has_attribute(__no_sanitize__) && !defined(_LIBCPP_COMPILER_GCC) 346*4d6fc14bSjoerg# define _LIBCPP_NO_CFI __attribute__((__no_sanitize__("cfi"))) 347*4d6fc14bSjoerg#else 348*4d6fc14bSjoerg# define _LIBCPP_NO_CFI 349*4d6fc14bSjoerg#endif 350*4d6fc14bSjoerg 351*4d6fc14bSjoerg#if (defined(__ISO_C_VISIBLE) && (__ISO_C_VISIBLE >= 2011)) || __cplusplus >= 201103L 352*4d6fc14bSjoerg# if defined(__FreeBSD__) 353*4d6fc14bSjoerg# define _LIBCPP_HAS_ALIGNED_ALLOC 354*4d6fc14bSjoerg# define _LIBCPP_HAS_QUICK_EXIT 355*4d6fc14bSjoerg# if __FreeBSD_version >= 1300064 || \ 356*4d6fc14bSjoerg (__FreeBSD_version >= 1201504 && __FreeBSD_version < 1300000) 357*4d6fc14bSjoerg# define _LIBCPP_HAS_TIMESPEC_GET 358*4d6fc14bSjoerg# endif 359*4d6fc14bSjoerg# elif defined(__BIONIC__) 360*4d6fc14bSjoerg# if __ANDROID_API__ >= 21 361*4d6fc14bSjoerg# define _LIBCPP_HAS_QUICK_EXIT 362*4d6fc14bSjoerg# endif 363*4d6fc14bSjoerg# if __ANDROID_API__ >= 28 364*4d6fc14bSjoerg# define _LIBCPP_HAS_ALIGNED_ALLOC 365*4d6fc14bSjoerg# endif 366*4d6fc14bSjoerg# if __ANDROID_API__ >= 29 367*4d6fc14bSjoerg# define _LIBCPP_HAS_TIMESPEC_GET 368*4d6fc14bSjoerg# endif 369*4d6fc14bSjoerg# elif defined(__Fuchsia__) || defined(__wasi__) || defined(__NetBSD__) 370*4d6fc14bSjoerg# define _LIBCPP_HAS_ALIGNED_ALLOC 371*4d6fc14bSjoerg# define _LIBCPP_HAS_QUICK_EXIT 372*4d6fc14bSjoerg# define _LIBCPP_HAS_TIMESPEC_GET 373*4d6fc14bSjoerg# elif defined(__OpenBSD__) 374*4d6fc14bSjoerg# define _LIBCPP_HAS_ALIGNED_ALLOC 375*4d6fc14bSjoerg# define _LIBCPP_HAS_TIMESPEC_GET 376*4d6fc14bSjoerg# elif defined(__linux__) 377*4d6fc14bSjoerg# if !defined(_LIBCPP_HAS_MUSL_LIBC) 378*4d6fc14bSjoerg# if _LIBCPP_GLIBC_PREREQ(2, 15) || defined(__BIONIC__) 379*4d6fc14bSjoerg# define _LIBCPP_HAS_QUICK_EXIT 380*4d6fc14bSjoerg# endif 381*4d6fc14bSjoerg# if _LIBCPP_GLIBC_PREREQ(2, 17) 382*4d6fc14bSjoerg# define _LIBCPP_HAS_ALIGNED_ALLOC 383*4d6fc14bSjoerg# define _LIBCPP_HAS_TIMESPEC_GET 384*4d6fc14bSjoerg# endif 385*4d6fc14bSjoerg# else // defined(_LIBCPP_HAS_MUSL_LIBC) 386*4d6fc14bSjoerg# define _LIBCPP_HAS_ALIGNED_ALLOC 387*4d6fc14bSjoerg# define _LIBCPP_HAS_QUICK_EXIT 388*4d6fc14bSjoerg# define _LIBCPP_HAS_TIMESPEC_GET 389*4d6fc14bSjoerg# endif 390*4d6fc14bSjoerg# elif defined(__APPLE__) 391*4d6fc14bSjoerg // timespec_get and aligned_alloc were introduced in macOS 10.15 and 392*4d6fc14bSjoerg // aligned releases 393*4d6fc14bSjoerg# if ((defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101500) || \ 394*4d6fc14bSjoerg (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130000) || \ 395*4d6fc14bSjoerg (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ >= 130000) || \ 396*4d6fc14bSjoerg (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ >= 60000)) 397*4d6fc14bSjoerg# define _LIBCPP_HAS_ALIGNED_ALLOC 398*4d6fc14bSjoerg# define _LIBCPP_HAS_TIMESPEC_GET 399*4d6fc14bSjoerg# endif 400*4d6fc14bSjoerg# endif // __APPLE__ 401*4d6fc14bSjoerg#endif 402*4d6fc14bSjoerg 403*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 404*4d6fc14bSjoerg# define _LIBCPP_ALIGNOF(_Tp) alignof(_Tp) 405*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_CLANG_BASED) 406*4d6fc14bSjoerg# define _LIBCPP_ALIGNOF(_Tp) _Alignof(_Tp) 407*4d6fc14bSjoerg#else 408*4d6fc14bSjoerg# error "We don't know a correct way to implement alignof(T) in C++03 outside of Clang" 409*4d6fc14bSjoerg#endif 410*4d6fc14bSjoerg 411*4d6fc14bSjoerg#define _LIBCPP_PREFERRED_ALIGNOF(_Tp) __alignof(_Tp) 412*4d6fc14bSjoerg 413*4d6fc14bSjoerg#if defined(_LIBCPP_COMPILER_CLANG_BASED) 414*4d6fc14bSjoerg 415*4d6fc14bSjoerg#if defined(_LIBCPP_ALTERNATE_STRING_LAYOUT) 416*4d6fc14bSjoerg# error _LIBCPP_ALTERNATE_STRING_LAYOUT is deprecated, please use _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT instead 417*4d6fc14bSjoerg#endif 418*4d6fc14bSjoerg#if defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) && \ 419*4d6fc14bSjoerg (!defined(__arm__) || __ARM_ARCH_7K__ >= 2) 420*4d6fc14bSjoerg# define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT 421*4d6fc14bSjoerg#endif 422*4d6fc14bSjoerg 423*4d6fc14bSjoerg#if __has_feature(cxx_alignas) 424*4d6fc14bSjoerg# define _ALIGNAS_TYPE(x) alignas(x) 425*4d6fc14bSjoerg# define _ALIGNAS(x) alignas(x) 426*4d6fc14bSjoerg#else 427*4d6fc14bSjoerg# define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x)))) 428*4d6fc14bSjoerg# define _ALIGNAS(x) __attribute__((__aligned__(x))) 429*4d6fc14bSjoerg#endif 430*4d6fc14bSjoerg 431*4d6fc14bSjoerg#if __cplusplus < 201103L 432*4d6fc14bSjoergtypedef __char16_t char16_t; 433*4d6fc14bSjoergtypedef __char32_t char32_t; 434*4d6fc14bSjoerg#endif 435*4d6fc14bSjoerg 436*4d6fc14bSjoerg#if !__has_feature(cxx_exceptions) 437*4d6fc14bSjoerg# define _LIBCPP_NO_EXCEPTIONS 438*4d6fc14bSjoerg#endif 439*4d6fc14bSjoerg 440*4d6fc14bSjoerg#if !(__has_feature(cxx_strong_enums)) 441*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_STRONG_ENUMS 442*4d6fc14bSjoerg#endif 443*4d6fc14bSjoerg 444*4d6fc14bSjoerg#if __has_feature(cxx_attributes) 445*4d6fc14bSjoerg# define _LIBCPP_NORETURN [[noreturn]] 446*4d6fc14bSjoerg#else 447*4d6fc14bSjoerg# define _LIBCPP_NORETURN __attribute__ ((noreturn)) 448*4d6fc14bSjoerg#endif 449*4d6fc14bSjoerg 450*4d6fc14bSjoerg#if !(__has_feature(cxx_nullptr)) 451*4d6fc14bSjoerg# if (__has_extension(cxx_nullptr) || __has_keyword(__nullptr)) && defined(_LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR) 452*4d6fc14bSjoerg# define nullptr __nullptr 453*4d6fc14bSjoerg# else 454*4d6fc14bSjoerg# define _LIBCPP_HAS_NO_NULLPTR 455*4d6fc14bSjoerg# endif 456*4d6fc14bSjoerg#endif 457*4d6fc14bSjoerg 458*4d6fc14bSjoerg// Objective-C++ features (opt-in) 459*4d6fc14bSjoerg#if __has_feature(objc_arc) 460*4d6fc14bSjoerg#define _LIBCPP_HAS_OBJC_ARC 461*4d6fc14bSjoerg#endif 462*4d6fc14bSjoerg 463*4d6fc14bSjoerg#if __has_feature(objc_arc_weak) 464*4d6fc14bSjoerg#define _LIBCPP_HAS_OBJC_ARC_WEAK 465*4d6fc14bSjoerg#endif 466*4d6fc14bSjoerg 467*4d6fc14bSjoerg#if __has_extension(blocks) 468*4d6fc14bSjoerg# define _LIBCPP_HAS_EXTENSION_BLOCKS 469*4d6fc14bSjoerg#endif 470*4d6fc14bSjoerg 471*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_EXTENSION_BLOCKS) && defined(__APPLE__) 472*4d6fc14bSjoerg# define _LIBCPP_HAS_BLOCKS_RUNTIME 473*4d6fc14bSjoerg#endif 474*4d6fc14bSjoerg 475*4d6fc14bSjoerg#if !(__has_feature(cxx_relaxed_constexpr)) 476*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR 477*4d6fc14bSjoerg#endif 478*4d6fc14bSjoerg 479*4d6fc14bSjoerg#if !(__has_feature(cxx_variable_templates)) 480*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES 481*4d6fc14bSjoerg#endif 482*4d6fc14bSjoerg 483*4d6fc14bSjoerg#if !(__has_feature(cxx_noexcept)) 484*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_NOEXCEPT 485*4d6fc14bSjoerg#endif 486*4d6fc14bSjoerg 487*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_ASAN) && !__has_feature(address_sanitizer) 488*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_ASAN 489*4d6fc14bSjoerg#endif 490*4d6fc14bSjoerg 491*4d6fc14bSjoerg// Allow for build-time disabling of unsigned integer sanitization 492*4d6fc14bSjoerg#if !defined(_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK) && __has_attribute(no_sanitize) 493*4d6fc14bSjoerg#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK __attribute__((__no_sanitize__("unsigned-integer-overflow"))) 494*4d6fc14bSjoerg#endif 495*4d6fc14bSjoerg 496*4d6fc14bSjoerg#if __has_builtin(__builtin_launder) 497*4d6fc14bSjoerg#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER 498*4d6fc14bSjoerg#endif 499*4d6fc14bSjoerg 500*4d6fc14bSjoerg#if __has_builtin(__builtin_constant_p) 501*4d6fc14bSjoerg#define _LIBCPP_COMPILER_HAS_BUILTIN_CONSTANT_P 502*4d6fc14bSjoerg#endif 503*4d6fc14bSjoerg 504*4d6fc14bSjoerg#if !__is_identifier(__has_unique_object_representations) 505*4d6fc14bSjoerg#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS 506*4d6fc14bSjoerg#endif 507*4d6fc14bSjoerg 508*4d6fc14bSjoerg#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__)) 509*4d6fc14bSjoerg 510*4d6fc14bSjoerg// Literal operators ""d and ""y are supported starting with LLVM Clang 8 and AppleClang 10.0.1 511*4d6fc14bSjoerg#if (defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER < 800) || \ 512*4d6fc14bSjoerg (defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER < 1001) 513*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CXX20_CHRONO_LITERALS 514*4d6fc14bSjoerg#endif 515*4d6fc14bSjoerg 516*4d6fc14bSjoerg#define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__ 517*4d6fc14bSjoerg 518*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_GCC) 519*4d6fc14bSjoerg 520*4d6fc14bSjoerg#define _ALIGNAS(x) __attribute__((__aligned__(x))) 521*4d6fc14bSjoerg#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x)))) 522*4d6fc14bSjoerg 523*4d6fc14bSjoerg#define _LIBCPP_NORETURN __attribute__((noreturn)) 524*4d6fc14bSjoerg 525*4d6fc14bSjoerg#if !__EXCEPTIONS 526*4d6fc14bSjoerg# define _LIBCPP_NO_EXCEPTIONS 527*4d6fc14bSjoerg#endif 528*4d6fc14bSjoerg 529*4d6fc14bSjoerg// Determine if GCC supports relaxed constexpr 530*4d6fc14bSjoerg#if !defined(__cpp_constexpr) || __cpp_constexpr < 201304L 531*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR 532*4d6fc14bSjoerg#endif 533*4d6fc14bSjoerg 534*4d6fc14bSjoerg// GCC 5 supports variable templates 535*4d6fc14bSjoerg#if !defined(__cpp_variable_templates) || __cpp_variable_templates < 201304L 536*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES 537*4d6fc14bSjoerg#endif 538*4d6fc14bSjoerg 539*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_ASAN) && !defined(__SANITIZE_ADDRESS__) 540*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_ASAN 541*4d6fc14bSjoerg#endif 542*4d6fc14bSjoerg 543*4d6fc14bSjoerg#if _GNUC_VER >= 700 544*4d6fc14bSjoerg#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER 545*4d6fc14bSjoerg#define _LIBCPP_COMPILER_HAS_BUILTIN_CONSTANT_P 546*4d6fc14bSjoerg#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS 547*4d6fc14bSjoerg#endif 548*4d6fc14bSjoerg 549*4d6fc14bSjoerg#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__)) 550*4d6fc14bSjoerg 551*4d6fc14bSjoerg#define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__ 552*4d6fc14bSjoerg 553*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_MSVC) 554*4d6fc14bSjoerg 555*4d6fc14bSjoerg#define _LIBCPP_TOSTRING2(x) #x 556*4d6fc14bSjoerg#define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x) 557*4d6fc14bSjoerg#define _LIBCPP_WARNING(x) __pragma(message(__FILE__ "(" _LIBCPP_TOSTRING(__LINE__) ") : warning note: " x)) 558*4d6fc14bSjoerg 559*4d6fc14bSjoerg#if _MSC_VER < 1900 560*4d6fc14bSjoerg#error "MSVC versions prior to Visual Studio 2015 are not supported" 561*4d6fc14bSjoerg#endif 562*4d6fc14bSjoerg 563*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR 564*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES 565*4d6fc14bSjoerg#define __alignof__ __alignof 566*4d6fc14bSjoerg#define _LIBCPP_NORETURN __declspec(noreturn) 567*4d6fc14bSjoerg#define _ALIGNAS(x) __declspec(align(x)) 568*4d6fc14bSjoerg#define _ALIGNAS_TYPE(x) alignas(x) 569*4d6fc14bSjoerg 570*4d6fc14bSjoerg#define _LIBCPP_WEAK 571*4d6fc14bSjoerg 572*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_ASAN 573*4d6fc14bSjoerg 574*4d6fc14bSjoerg#define _LIBCPP_ALWAYS_INLINE __forceinline 575*4d6fc14bSjoerg 576*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VECTOR_EXTENSION 577*4d6fc14bSjoerg 578*4d6fc14bSjoerg#define _LIBCPP_DISABLE_EXTENSION_WARNING 579*4d6fc14bSjoerg 580*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_IBM) 581*4d6fc14bSjoerg 582*4d6fc14bSjoerg#define _ALIGNAS(x) __attribute__((__aligned__(x))) 583*4d6fc14bSjoerg#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x)))) 584*4d6fc14bSjoerg#define _ATTRIBUTE(x) __attribute__((x)) 585*4d6fc14bSjoerg#define _LIBCPP_NORETURN __attribute__((noreturn)) 586*4d6fc14bSjoerg 587*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_UNICODE_CHARS 588*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES 589*4d6fc14bSjoerg 590*4d6fc14bSjoerg#if defined(_AIX) 591*4d6fc14bSjoerg#define __MULTILOCALE_API 592*4d6fc14bSjoerg#endif 593*4d6fc14bSjoerg 594*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_ASAN 595*4d6fc14bSjoerg 596*4d6fc14bSjoerg#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__)) 597*4d6fc14bSjoerg 598*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VECTOR_EXTENSION 599*4d6fc14bSjoerg 600*4d6fc14bSjoerg#define _LIBCPP_DISABLE_EXTENSION_WARNING 601*4d6fc14bSjoerg 602*4d6fc14bSjoerg#endif // _LIBCPP_COMPILER_[CLANG|GCC|MSVC|IBM] 603*4d6fc14bSjoerg 604*4d6fc14bSjoerg#if defined(_LIBCPP_OBJECT_FORMAT_COFF) 605*4d6fc14bSjoerg 606*4d6fc14bSjoerg#ifdef _DLL 607*4d6fc14bSjoerg# define _LIBCPP_CRT_FUNC __declspec(dllimport) 608*4d6fc14bSjoerg#else 609*4d6fc14bSjoerg# define _LIBCPP_CRT_FUNC 610*4d6fc14bSjoerg#endif 611*4d6fc14bSjoerg 612*4d6fc14bSjoerg#if defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 613*4d6fc14bSjoerg# define _LIBCPP_DLL_VIS 614*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS 615*4d6fc14bSjoerg# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS 616*4d6fc14bSjoerg# define _LIBCPP_OVERRIDABLE_FUNC_VIS 617*4d6fc14bSjoerg# define _LIBCPP_EXPORTED_FROM_ABI 618*4d6fc14bSjoerg#elif defined(_LIBCPP_BUILDING_LIBRARY) 619*4d6fc14bSjoerg# define _LIBCPP_DLL_VIS __declspec(dllexport) 620*4d6fc14bSjoerg# if defined(__MINGW32__) 621*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS 622*4d6fc14bSjoerg# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS 623*4d6fc14bSjoerg# else 624*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS 625*4d6fc14bSjoerg# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DLL_VIS 626*4d6fc14bSjoerg# endif 627*4d6fc14bSjoerg# define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_DLL_VIS 628*4d6fc14bSjoerg# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllexport) 629*4d6fc14bSjoerg#else 630*4d6fc14bSjoerg# define _LIBCPP_DLL_VIS __declspec(dllimport) 631*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS 632*4d6fc14bSjoerg# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS 633*4d6fc14bSjoerg# define _LIBCPP_OVERRIDABLE_FUNC_VIS 634*4d6fc14bSjoerg# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllimport) 635*4d6fc14bSjoerg#endif 636*4d6fc14bSjoerg 637*4d6fc14bSjoerg#define _LIBCPP_TYPE_VIS _LIBCPP_DLL_VIS 638*4d6fc14bSjoerg#define _LIBCPP_FUNC_VIS _LIBCPP_DLL_VIS 639*4d6fc14bSjoerg#define _LIBCPP_EXCEPTION_ABI _LIBCPP_DLL_VIS 640*4d6fc14bSjoerg#define _LIBCPP_HIDDEN 641*4d6fc14bSjoerg#define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 642*4d6fc14bSjoerg#define _LIBCPP_TEMPLATE_VIS 643*4d6fc14bSjoerg#define _LIBCPP_TEMPLATE_DATA_VIS 644*4d6fc14bSjoerg#define _LIBCPP_ENUM_VIS 645*4d6fc14bSjoerg 646*4d6fc14bSjoerg#endif // defined(_LIBCPP_OBJECT_FORMAT_COFF) 647*4d6fc14bSjoerg 648*4d6fc14bSjoerg#ifndef _LIBCPP_HIDDEN 649*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 650*4d6fc14bSjoerg# define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden"))) 651*4d6fc14bSjoerg# else 652*4d6fc14bSjoerg# define _LIBCPP_HIDDEN 653*4d6fc14bSjoerg# endif 654*4d6fc14bSjoerg#endif 655*4d6fc14bSjoerg 656*4d6fc14bSjoerg#ifndef _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 657*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 658*4d6fc14bSjoerg// The inline should be removed once PR32114 is resolved 659*4d6fc14bSjoerg# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS inline _LIBCPP_HIDDEN 660*4d6fc14bSjoerg# else 661*4d6fc14bSjoerg# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 662*4d6fc14bSjoerg# endif 663*4d6fc14bSjoerg#endif 664*4d6fc14bSjoerg 665*4d6fc14bSjoerg#ifndef _LIBCPP_FUNC_VIS 666*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 667*4d6fc14bSjoerg# define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default"))) 668*4d6fc14bSjoerg# else 669*4d6fc14bSjoerg# define _LIBCPP_FUNC_VIS 670*4d6fc14bSjoerg# endif 671*4d6fc14bSjoerg#endif 672*4d6fc14bSjoerg 673*4d6fc14bSjoerg#ifndef _LIBCPP_TYPE_VIS 674*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 675*4d6fc14bSjoerg# define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default"))) 676*4d6fc14bSjoerg# else 677*4d6fc14bSjoerg# define _LIBCPP_TYPE_VIS 678*4d6fc14bSjoerg# endif 679*4d6fc14bSjoerg#endif 680*4d6fc14bSjoerg 681*4d6fc14bSjoerg#ifndef _LIBCPP_TEMPLATE_VIS 682*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 683*4d6fc14bSjoerg# if __has_attribute(__type_visibility__) 684*4d6fc14bSjoerg# define _LIBCPP_TEMPLATE_VIS __attribute__ ((__type_visibility__("default"))) 685*4d6fc14bSjoerg# else 686*4d6fc14bSjoerg# define _LIBCPP_TEMPLATE_VIS __attribute__ ((__visibility__("default"))) 687*4d6fc14bSjoerg# endif 688*4d6fc14bSjoerg# else 689*4d6fc14bSjoerg# define _LIBCPP_TEMPLATE_VIS 690*4d6fc14bSjoerg# endif 691*4d6fc14bSjoerg#endif 692*4d6fc14bSjoerg 693*4d6fc14bSjoerg#ifndef _LIBCPP_TEMPLATE_DATA_VIS 694*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 695*4d6fc14bSjoerg# define _LIBCPP_TEMPLATE_DATA_VIS __attribute__ ((__visibility__("default"))) 696*4d6fc14bSjoerg# else 697*4d6fc14bSjoerg# define _LIBCPP_TEMPLATE_DATA_VIS 698*4d6fc14bSjoerg# endif 699*4d6fc14bSjoerg#endif 700*4d6fc14bSjoerg 701*4d6fc14bSjoerg#ifndef _LIBCPP_EXPORTED_FROM_ABI 702*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 703*4d6fc14bSjoerg# define _LIBCPP_EXPORTED_FROM_ABI __attribute__((__visibility__("default"))) 704*4d6fc14bSjoerg# else 705*4d6fc14bSjoerg# define _LIBCPP_EXPORTED_FROM_ABI 706*4d6fc14bSjoerg# endif 707*4d6fc14bSjoerg#endif 708*4d6fc14bSjoerg 709*4d6fc14bSjoerg#ifndef _LIBCPP_OVERRIDABLE_FUNC_VIS 710*4d6fc14bSjoerg#define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_FUNC_VIS 711*4d6fc14bSjoerg#endif 712*4d6fc14bSjoerg 713*4d6fc14bSjoerg#ifndef _LIBCPP_EXCEPTION_ABI 714*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 715*4d6fc14bSjoerg# define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default"))) 716*4d6fc14bSjoerg# else 717*4d6fc14bSjoerg# define _LIBCPP_EXCEPTION_ABI 718*4d6fc14bSjoerg# endif 719*4d6fc14bSjoerg#endif 720*4d6fc14bSjoerg 721*4d6fc14bSjoerg#ifndef _LIBCPP_ENUM_VIS 722*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && __has_attribute(__type_visibility__) 723*4d6fc14bSjoerg# define _LIBCPP_ENUM_VIS __attribute__ ((__type_visibility__("default"))) 724*4d6fc14bSjoerg# else 725*4d6fc14bSjoerg# define _LIBCPP_ENUM_VIS 726*4d6fc14bSjoerg# endif 727*4d6fc14bSjoerg#endif 728*4d6fc14bSjoerg 729*4d6fc14bSjoerg#ifndef _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS 730*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 731*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __attribute__ ((__visibility__("default"))) 732*4d6fc14bSjoerg# else 733*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS 734*4d6fc14bSjoerg# endif 735*4d6fc14bSjoerg#endif 736*4d6fc14bSjoerg 737*4d6fc14bSjoerg#ifndef _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS 738*4d6fc14bSjoerg#define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS 739*4d6fc14bSjoerg#endif 740*4d6fc14bSjoerg 741*4d6fc14bSjoerg#if __has_attribute(internal_linkage) 742*4d6fc14bSjoerg# define _LIBCPP_INTERNAL_LINKAGE __attribute__ ((internal_linkage)) 743*4d6fc14bSjoerg#else 744*4d6fc14bSjoerg# define _LIBCPP_INTERNAL_LINKAGE _LIBCPP_ALWAYS_INLINE 745*4d6fc14bSjoerg#endif 746*4d6fc14bSjoerg 747*4d6fc14bSjoerg#if __has_attribute(exclude_from_explicit_instantiation) 748*4d6fc14bSjoerg# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION __attribute__ ((__exclude_from_explicit_instantiation__)) 749*4d6fc14bSjoerg#else 750*4d6fc14bSjoerg // Try to approximate the effect of exclude_from_explicit_instantiation 751*4d6fc14bSjoerg // (which is that entities are not assumed to be provided by explicit 752*4d6fc14bSjoerg // template instantiations in the dylib) by always inlining those entities. 753*4d6fc14bSjoerg# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION _LIBCPP_ALWAYS_INLINE 754*4d6fc14bSjoerg#endif 755*4d6fc14bSjoerg 756*4d6fc14bSjoerg#ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU 757*4d6fc14bSjoerg# ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT 758*4d6fc14bSjoerg# define _LIBCPP_HIDE_FROM_ABI_PER_TU 0 759*4d6fc14bSjoerg# else 760*4d6fc14bSjoerg# define _LIBCPP_HIDE_FROM_ABI_PER_TU 1 761*4d6fc14bSjoerg# endif 762*4d6fc14bSjoerg#endif 763*4d6fc14bSjoerg 764*4d6fc14bSjoerg#ifndef _LIBCPP_HIDE_FROM_ABI 765*4d6fc14bSjoerg# if _LIBCPP_HIDE_FROM_ABI_PER_TU 766*4d6fc14bSjoerg# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_INTERNAL_LINKAGE 767*4d6fc14bSjoerg# else 768*4d6fc14bSjoerg# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION 769*4d6fc14bSjoerg# endif 770*4d6fc14bSjoerg#endif 771*4d6fc14bSjoerg 772*4d6fc14bSjoerg#ifdef _LIBCPP_BUILDING_LIBRARY 773*4d6fc14bSjoerg# if _LIBCPP_ABI_VERSION > 1 774*4d6fc14bSjoerg# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI 775*4d6fc14bSjoerg# else 776*4d6fc14bSjoerg# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 777*4d6fc14bSjoerg# endif 778*4d6fc14bSjoerg#else 779*4d6fc14bSjoerg# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI 780*4d6fc14bSjoerg#endif 781*4d6fc14bSjoerg 782*4d6fc14bSjoerg// Just so we can migrate to the new macros gradually. 783*4d6fc14bSjoerg#define _LIBCPP_INLINE_VISIBILITY _LIBCPP_HIDE_FROM_ABI 784*4d6fc14bSjoerg 785*4d6fc14bSjoerg// Inline namespaces are available in Clang/GCC/MSVC regardless of C++ dialect. 786*4d6fc14bSjoerg#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { inline namespace _LIBCPP_ABI_NAMESPACE { 787*4d6fc14bSjoerg#define _LIBCPP_END_NAMESPACE_STD } } 788*4d6fc14bSjoerg#define _VSTD std::_LIBCPP_ABI_NAMESPACE 789*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD 790*4d6fc14bSjoerg 791*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 792*4d6fc14bSjoerg#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \ 793*4d6fc14bSjoerg _LIBCPP_BEGIN_NAMESPACE_STD inline namespace __fs { namespace filesystem { 794*4d6fc14bSjoerg#else 795*4d6fc14bSjoerg#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \ 796*4d6fc14bSjoerg _LIBCPP_BEGIN_NAMESPACE_STD namespace __fs { namespace filesystem { 797*4d6fc14bSjoerg#endif 798*4d6fc14bSjoerg 799*4d6fc14bSjoerg#define _LIBCPP_END_NAMESPACE_FILESYSTEM \ 800*4d6fc14bSjoerg _LIBCPP_END_NAMESPACE_STD } } 801*4d6fc14bSjoerg 802*4d6fc14bSjoerg#define _VSTD_FS _VSTD::__fs::filesystem 803*4d6fc14bSjoerg 804*4d6fc14bSjoerg#ifndef _LIBCPP_PREFERRED_OVERLOAD 805*4d6fc14bSjoerg# if __has_attribute(__enable_if__) 806*4d6fc14bSjoerg# define _LIBCPP_PREFERRED_OVERLOAD __attribute__ ((__enable_if__(true, ""))) 807*4d6fc14bSjoerg# endif 808*4d6fc14bSjoerg#endif 809*4d6fc14bSjoerg 810*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_NOEXCEPT 811*4d6fc14bSjoerg# define _NOEXCEPT noexcept 812*4d6fc14bSjoerg# define _NOEXCEPT_(x) noexcept(x) 813*4d6fc14bSjoerg#else 814*4d6fc14bSjoerg# define _NOEXCEPT throw() 815*4d6fc14bSjoerg# define _NOEXCEPT_(x) 816*4d6fc14bSjoerg#endif 817*4d6fc14bSjoerg 818*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS 819*4d6fc14bSjoergtypedef unsigned short char16_t; 820*4d6fc14bSjoergtypedef unsigned int char32_t; 821*4d6fc14bSjoerg#endif // _LIBCPP_HAS_NO_UNICODE_CHARS 822*4d6fc14bSjoerg 823*4d6fc14bSjoerg#ifndef __SIZEOF_INT128__ 824*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_INT128 825*4d6fc14bSjoerg#endif 826*4d6fc14bSjoerg 827*4d6fc14bSjoerg#ifdef _LIBCPP_CXX03_LANG 828*4d6fc14bSjoerg# define static_assert(...) _Static_assert(__VA_ARGS__) 829*4d6fc14bSjoerg# define decltype(...) __decltype(__VA_ARGS__) 830*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 831*4d6fc14bSjoerg 832*4d6fc14bSjoerg#ifdef _LIBCPP_CXX03_LANG 833*4d6fc14bSjoerg# define _LIBCPP_CONSTEXPR 834*4d6fc14bSjoerg#else 835*4d6fc14bSjoerg# define _LIBCPP_CONSTEXPR constexpr 836*4d6fc14bSjoerg#endif 837*4d6fc14bSjoerg 838*4d6fc14bSjoerg#ifndef __cpp_consteval 839*4d6fc14bSjoerg# define _LIBCPP_CONSTEVAL _LIBCPP_CONSTEXPR 840*4d6fc14bSjoerg#else 841*4d6fc14bSjoerg# define _LIBCPP_CONSTEVAL consteval 842*4d6fc14bSjoerg#endif 843*4d6fc14bSjoerg 844*4d6fc14bSjoerg#if !defined(__cpp_concepts) || __cpp_concepts < 201907L 845*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CONCEPTS 846*4d6fc14bSjoerg#endif 847*4d6fc14bSjoerg 848*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_HAS_NO_CONCEPTS) 849*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_RANGES 850*4d6fc14bSjoerg#endif 851*4d6fc14bSjoerg 852*4d6fc14bSjoerg#ifdef _LIBCPP_CXX03_LANG 853*4d6fc14bSjoerg# define _LIBCPP_DEFAULT {} 854*4d6fc14bSjoerg#else 855*4d6fc14bSjoerg# define _LIBCPP_DEFAULT = default; 856*4d6fc14bSjoerg#endif 857*4d6fc14bSjoerg 858*4d6fc14bSjoerg#ifdef _LIBCPP_CXX03_LANG 859*4d6fc14bSjoerg# define _LIBCPP_EQUAL_DELETE 860*4d6fc14bSjoerg#else 861*4d6fc14bSjoerg# define _LIBCPP_EQUAL_DELETE = delete 862*4d6fc14bSjoerg#endif 863*4d6fc14bSjoerg 864*4d6fc14bSjoerg#ifdef __GNUC__ 865*4d6fc14bSjoerg# define _LIBCPP_NOALIAS __attribute__((__malloc__)) 866*4d6fc14bSjoerg#else 867*4d6fc14bSjoerg# define _LIBCPP_NOALIAS 868*4d6fc14bSjoerg#endif 869*4d6fc14bSjoerg 870*4d6fc14bSjoerg#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) || \ 871*4d6fc14bSjoerg (!defined(_LIBCPP_CXX03_LANG) && defined(__GNUC__)) // All supported GCC versions 872*4d6fc14bSjoerg# define _LIBCPP_EXPLICIT explicit 873*4d6fc14bSjoerg#else 874*4d6fc14bSjoerg# define _LIBCPP_EXPLICIT 875*4d6fc14bSjoerg#endif 876*4d6fc14bSjoerg 877*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS 878*4d6fc14bSjoerg# define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx 879*4d6fc14bSjoerg# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \ 880*4d6fc14bSjoerg __lx __v_; \ 881*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY x(__lx __v) : __v_(__v) {} \ 882*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY explicit x(int __v) : __v_(static_cast<__lx>(__v)) {} \ 883*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;} \ 884*4d6fc14bSjoerg }; 885*4d6fc14bSjoerg#else // _LIBCPP_HAS_NO_STRONG_ENUMS 886*4d6fc14bSjoerg# define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_ENUM_VIS x 887*4d6fc14bSjoerg# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) 888*4d6fc14bSjoerg#endif // _LIBCPP_HAS_NO_STRONG_ENUMS 889*4d6fc14bSjoerg 890*4d6fc14bSjoerg// _LIBCPP_DEBUG potential values: 891*4d6fc14bSjoerg// - undefined: No assertions. This is the default. 892*4d6fc14bSjoerg// - 0: Basic assertions 893*4d6fc14bSjoerg// - 1: Basic assertions + iterator validity checks. 894*4d6fc14bSjoerg#if !defined(_LIBCPP_DEBUG) 895*4d6fc14bSjoerg# define _LIBCPP_DEBUG_LEVEL 0 896*4d6fc14bSjoerg#elif _LIBCPP_DEBUG == 0 897*4d6fc14bSjoerg# define _LIBCPP_DEBUG_LEVEL 1 898*4d6fc14bSjoerg#elif _LIBCPP_DEBUG == 1 899*4d6fc14bSjoerg# define _LIBCPP_DEBUG_LEVEL 2 900*4d6fc14bSjoerg#else 901*4d6fc14bSjoerg# error Supported values for _LIBCPP_DEBUG are 0 and 1 902*4d6fc14bSjoerg#endif 903*4d6fc14bSjoerg 904*4d6fc14bSjoerg// _LIBCPP_DEBUG_LEVEL is always defined to one of [0, 1, 2] at this point 905*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL >= 1 && !defined(_LIBCPP_DISABLE_EXTERN_TEMPLATE) 906*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE(...) 907*4d6fc14bSjoerg#endif 908*4d6fc14bSjoerg 909*4d6fc14bSjoerg#ifdef _LIBCPP_DISABLE_EXTERN_TEMPLATE 910*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE(...) 911*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(...) 912*4d6fc14bSjoerg#endif 913*4d6fc14bSjoerg 914*4d6fc14bSjoerg#ifndef _LIBCPP_EXTERN_TEMPLATE 915*4d6fc14bSjoerg#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__; 916*4d6fc14bSjoerg#endif 917*4d6fc14bSjoerg 918*4d6fc14bSjoerg// When the Debug mode is enabled, we disable extern declarations because we 919*4d6fc14bSjoerg// don't want to use the functions compiled in the library, which might not 920*4d6fc14bSjoerg// have had the debug mode enabled when built. However, some extern declarations 921*4d6fc14bSjoerg// need to be used, because code correctness depends on it (several instances 922*4d6fc14bSjoerg// in the <locale>). Those special declarations are declared with 923*4d6fc14bSjoerg// _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE, which is enabled even 924*4d6fc14bSjoerg// when the debug mode is enabled. 925*4d6fc14bSjoerg#ifndef _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE 926*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(...) extern template __VA_ARGS__; 927*4d6fc14bSjoerg#endif 928*4d6fc14bSjoerg 929*4d6fc14bSjoerg#ifndef _LIBCPP_EXTERN_TEMPLATE_DEFINE 930*4d6fc14bSjoerg#define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template __VA_ARGS__; 931*4d6fc14bSjoerg#endif 932*4d6fc14bSjoerg 933*4d6fc14bSjoerg#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_LIBCPP_MSVCRT_LIKE) || \ 934*4d6fc14bSjoerg defined(__sun__) || defined(__NetBSD__) || defined(__CloudABI__) 935*4d6fc14bSjoerg#define _LIBCPP_LOCALE__L_EXTENSIONS 1 936*4d6fc14bSjoerg#endif 937*4d6fc14bSjoerg 938*4d6fc14bSjoerg#ifdef __FreeBSD__ 939*4d6fc14bSjoerg#define _DECLARE_C99_LDBL_MATH 1 940*4d6fc14bSjoerg#endif 941*4d6fc14bSjoerg 942*4d6fc14bSjoerg// If we are getting operator new from the MSVC CRT, then allocation overloads 943*4d6fc14bSjoerg// for align_val_t were added in 19.12, aka VS 2017 version 15.3. 944*4d6fc14bSjoerg#if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912 945*4d6fc14bSjoerg# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION 946*4d6fc14bSjoerg#elif defined(_LIBCPP_ABI_VCRUNTIME) && !defined(__cpp_aligned_new) 947*4d6fc14bSjoerg // We're deferring to Microsoft's STL to provide aligned new et al. We don't 948*4d6fc14bSjoerg // have it unless the language feature test macro is defined. 949*4d6fc14bSjoerg# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION 950*4d6fc14bSjoerg#elif defined(__MVS__) 951*4d6fc14bSjoerg# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION 952*4d6fc14bSjoerg#endif 953*4d6fc14bSjoerg 954*4d6fc14bSjoerg#if defined(__APPLE__) 955*4d6fc14bSjoerg# if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \ 956*4d6fc14bSjoerg defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) 957*4d6fc14bSjoerg# define __MAC_OS_X_VERSION_MIN_REQUIRED __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ 958*4d6fc14bSjoerg# endif 959*4d6fc14bSjoerg#endif // defined(__APPLE__) 960*4d6fc14bSjoerg 961*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \ 962*4d6fc14bSjoerg (defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) || \ 963*4d6fc14bSjoerg (!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606)) 964*4d6fc14bSjoerg# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION 965*4d6fc14bSjoerg#endif 966*4d6fc14bSjoerg 967*4d6fc14bSjoerg#if defined(__APPLE__) || defined(__FreeBSD__) 968*4d6fc14bSjoerg#define _LIBCPP_HAS_DEFAULTRUNELOCALE 969*4d6fc14bSjoerg#endif 970*4d6fc14bSjoerg 971*4d6fc14bSjoerg#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__) 972*4d6fc14bSjoerg#define _LIBCPP_WCTYPE_IS_MASK 973*4d6fc14bSjoerg#endif 974*4d6fc14bSjoerg 975*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 17 || !defined(__cpp_char8_t) 976*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CHAR8_T 977*4d6fc14bSjoerg#endif 978*4d6fc14bSjoerg 979*4d6fc14bSjoerg// Deprecation macros. 980*4d6fc14bSjoerg// 981*4d6fc14bSjoerg// Deprecations warnings are always enabled, except when users explicitly opt-out 982*4d6fc14bSjoerg// by defining _LIBCPP_DISABLE_DEPRECATION_WARNINGS. 983*4d6fc14bSjoerg#if !defined(_LIBCPP_DISABLE_DEPRECATION_WARNINGS) 984*4d6fc14bSjoerg# if __has_attribute(deprecated) 985*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED __attribute__ ((deprecated)) 986*4d6fc14bSjoerg# elif _LIBCPP_STD_VER > 11 987*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED [[deprecated]] 988*4d6fc14bSjoerg# else 989*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED 990*4d6fc14bSjoerg# endif 991*4d6fc14bSjoerg#else 992*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED 993*4d6fc14bSjoerg#endif 994*4d6fc14bSjoerg 995*4d6fc14bSjoerg#if !defined(_LIBCPP_CXX03_LANG) 996*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_IN_CXX11 _LIBCPP_DEPRECATED 997*4d6fc14bSjoerg#else 998*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_IN_CXX11 999*4d6fc14bSjoerg#endif 1000*4d6fc14bSjoerg 1001*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 14 1002*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_IN_CXX14 _LIBCPP_DEPRECATED 1003*4d6fc14bSjoerg#else 1004*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_IN_CXX14 1005*4d6fc14bSjoerg#endif 1006*4d6fc14bSjoerg 1007*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 1008*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED 1009*4d6fc14bSjoerg#else 1010*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_IN_CXX17 1011*4d6fc14bSjoerg#endif 1012*4d6fc14bSjoerg 1013*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17 1014*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_DEPRECATED 1015*4d6fc14bSjoerg#else 1016*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_IN_CXX20 1017*4d6fc14bSjoerg#endif 1018*4d6fc14bSjoerg 1019*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_CHAR8_T) 1020*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_WITH_CHAR8_T _LIBCPP_DEPRECATED 1021*4d6fc14bSjoerg#else 1022*4d6fc14bSjoerg# define _LIBCPP_DEPRECATED_WITH_CHAR8_T 1023*4d6fc14bSjoerg#endif 1024*4d6fc14bSjoerg 1025*4d6fc14bSjoerg// Macros to enter and leave a state where deprecation warnings are suppressed. 1026*4d6fc14bSjoerg#if !defined(_LIBCPP_SUPPRESS_DEPRECATED_PUSH) && \ 1027*4d6fc14bSjoerg (defined(_LIBCPP_COMPILER_CLANG_BASED) || defined(_LIBCPP_COMPILER_GCC)) 1028*4d6fc14bSjoerg# define _LIBCPP_SUPPRESS_DEPRECATED_PUSH \ 1029*4d6fc14bSjoerg _Pragma("GCC diagnostic push") \ 1030*4d6fc14bSjoerg _Pragma("GCC diagnostic ignored \"-Wdeprecated\"") 1031*4d6fc14bSjoerg# define _LIBCPP_SUPPRESS_DEPRECATED_POP \ 1032*4d6fc14bSjoerg _Pragma("GCC diagnostic pop") 1033*4d6fc14bSjoerg#endif 1034*4d6fc14bSjoerg#if !defined(_LIBCPP_SUPPRESS_DEPRECATED_PUSH) 1035*4d6fc14bSjoerg# define _LIBCPP_SUPPRESS_DEPRECATED_PUSH 1036*4d6fc14bSjoerg# define _LIBCPP_SUPPRESS_DEPRECATED_POP 1037*4d6fc14bSjoerg#endif 1038*4d6fc14bSjoerg 1039*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 11 1040*4d6fc14bSjoerg# define _LIBCPP_EXPLICIT_AFTER_CXX11 1041*4d6fc14bSjoerg#else 1042*4d6fc14bSjoerg# define _LIBCPP_EXPLICIT_AFTER_CXX11 explicit 1043*4d6fc14bSjoerg#endif 1044*4d6fc14bSjoerg 1045*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR) 1046*4d6fc14bSjoerg# define _LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr 1047*4d6fc14bSjoerg#else 1048*4d6fc14bSjoerg# define _LIBCPP_CONSTEXPR_AFTER_CXX11 1049*4d6fc14bSjoerg#endif 1050*4d6fc14bSjoerg 1051*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR) 1052*4d6fc14bSjoerg# define _LIBCPP_CONSTEXPR_AFTER_CXX14 constexpr 1053*4d6fc14bSjoerg#else 1054*4d6fc14bSjoerg# define _LIBCPP_CONSTEXPR_AFTER_CXX14 1055*4d6fc14bSjoerg#endif 1056*4d6fc14bSjoerg 1057*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR) 1058*4d6fc14bSjoerg# define _LIBCPP_CONSTEXPR_AFTER_CXX17 constexpr 1059*4d6fc14bSjoerg#else 1060*4d6fc14bSjoerg# define _LIBCPP_CONSTEXPR_AFTER_CXX17 1061*4d6fc14bSjoerg#endif 1062*4d6fc14bSjoerg 1063*4d6fc14bSjoerg// The _LIBCPP_NODISCARD_ATTRIBUTE should only be used to define other 1064*4d6fc14bSjoerg// NODISCARD macros to the correct attribute. 1065*4d6fc14bSjoerg#if __has_cpp_attribute(nodiscard) || defined(_LIBCPP_COMPILER_MSVC) 1066*4d6fc14bSjoerg# define _LIBCPP_NODISCARD_ATTRIBUTE [[nodiscard]] 1067*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_CLANG_BASED) && !defined(_LIBCPP_CXX03_LANG) 1068*4d6fc14bSjoerg# define _LIBCPP_NODISCARD_ATTRIBUTE [[clang::warn_unused_result]] 1069*4d6fc14bSjoerg#else 1070*4d6fc14bSjoerg// We can't use GCC's [[gnu::warn_unused_result]] and 1071*4d6fc14bSjoerg// __attribute__((warn_unused_result)), because GCC does not silence them via 1072*4d6fc14bSjoerg// (void) cast. 1073*4d6fc14bSjoerg# define _LIBCPP_NODISCARD_ATTRIBUTE 1074*4d6fc14bSjoerg#endif 1075*4d6fc14bSjoerg 1076*4d6fc14bSjoerg// _LIBCPP_NODISCARD_EXT may be used to apply [[nodiscard]] to entities not 1077*4d6fc14bSjoerg// specified as such as an extension. 1078*4d6fc14bSjoerg#if defined(_LIBCPP_ENABLE_NODISCARD) && !defined(_LIBCPP_DISABLE_NODISCARD_EXT) 1079*4d6fc14bSjoerg# define _LIBCPP_NODISCARD_EXT _LIBCPP_NODISCARD_ATTRIBUTE 1080*4d6fc14bSjoerg#else 1081*4d6fc14bSjoerg# define _LIBCPP_NODISCARD_EXT 1082*4d6fc14bSjoerg#endif 1083*4d6fc14bSjoerg 1084*4d6fc14bSjoerg#if !defined(_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17) && \ 1085*4d6fc14bSjoerg (_LIBCPP_STD_VER > 17 || defined(_LIBCPP_ENABLE_NODISCARD)) 1086*4d6fc14bSjoerg# define _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_NODISCARD_ATTRIBUTE 1087*4d6fc14bSjoerg#else 1088*4d6fc14bSjoerg# define _LIBCPP_NODISCARD_AFTER_CXX17 1089*4d6fc14bSjoerg#endif 1090*4d6fc14bSjoerg 1091*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 && defined(__cpp_inline_variables) && (__cpp_inline_variables >= 201606L) 1092*4d6fc14bSjoerg# define _LIBCPP_INLINE_VAR inline 1093*4d6fc14bSjoerg#else 1094*4d6fc14bSjoerg# define _LIBCPP_INLINE_VAR 1095*4d6fc14bSjoerg#endif 1096*4d6fc14bSjoerg 1097*4d6fc14bSjoerg#ifndef _LIBCPP_CONSTEXPR_IF_NODEBUG 1098*4d6fc14bSjoerg#if defined(_LIBCPP_DEBUG) || defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR) 1099*4d6fc14bSjoerg#define _LIBCPP_CONSTEXPR_IF_NODEBUG 1100*4d6fc14bSjoerg#else 1101*4d6fc14bSjoerg#define _LIBCPP_CONSTEXPR_IF_NODEBUG constexpr 1102*4d6fc14bSjoerg#endif 1103*4d6fc14bSjoerg#endif 1104*4d6fc14bSjoerg 1105*4d6fc14bSjoerg#if __has_attribute(no_destroy) 1106*4d6fc14bSjoerg# define _LIBCPP_NO_DESTROY __attribute__((__no_destroy__)) 1107*4d6fc14bSjoerg#else 1108*4d6fc14bSjoerg# define _LIBCPP_NO_DESTROY 1109*4d6fc14bSjoerg#endif 1110*4d6fc14bSjoerg 1111*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_ASAN 1112*4d6fc14bSjoergextern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container( 1113*4d6fc14bSjoerg const void *, const void *, const void *, const void *); 1114*4d6fc14bSjoerg#endif 1115*4d6fc14bSjoerg 1116*4d6fc14bSjoerg// Try to find out if RTTI is disabled. 1117*4d6fc14bSjoerg#if defined(_LIBCPP_COMPILER_CLANG_BASED) && !__has_feature(cxx_rtti) 1118*4d6fc14bSjoerg# define _LIBCPP_NO_RTTI 1119*4d6fc14bSjoerg#elif defined(__GNUC__) && !defined(__GXX_RTTI) 1120*4d6fc14bSjoerg# define _LIBCPP_NO_RTTI 1121*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_MSVC) && !defined(_CPPRTTI) 1122*4d6fc14bSjoerg# define _LIBCPP_NO_RTTI 1123*4d6fc14bSjoerg#endif 1124*4d6fc14bSjoerg 1125*4d6fc14bSjoerg#ifndef _LIBCPP_WEAK 1126*4d6fc14bSjoerg#define _LIBCPP_WEAK __attribute__((__weak__)) 1127*4d6fc14bSjoerg#endif 1128*4d6fc14bSjoerg 1129*4d6fc14bSjoerg// Thread API 1130*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 1131*4d6fc14bSjoerg !defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && \ 1132*4d6fc14bSjoerg !defined(_LIBCPP_HAS_THREAD_API_WIN32) && \ 1133*4d6fc14bSjoerg !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) 1134*4d6fc14bSjoerg# if defined(__FreeBSD__) || \ 1135*4d6fc14bSjoerg defined(__wasi__) || \ 1136*4d6fc14bSjoerg defined(__NetBSD__) || \ 1137*4d6fc14bSjoerg defined(__OpenBSD__) || \ 1138*4d6fc14bSjoerg defined(__NuttX__) || \ 1139*4d6fc14bSjoerg defined(__linux__) || \ 1140*4d6fc14bSjoerg defined(__GNU__) || \ 1141*4d6fc14bSjoerg defined(__APPLE__) || \ 1142*4d6fc14bSjoerg defined(__CloudABI__) || \ 1143*4d6fc14bSjoerg defined(__sun__) || \ 1144*4d6fc14bSjoerg defined(__MVS__) || \ 1145*4d6fc14bSjoerg defined(_AIX) || \ 1146*4d6fc14bSjoerg (defined(__MINGW32__) && __has_include(<pthread.h>)) 1147*4d6fc14bSjoerg# define _LIBCPP_HAS_THREAD_API_PTHREAD 1148*4d6fc14bSjoerg# elif defined(__Fuchsia__) 1149*4d6fc14bSjoerg // TODO(44575): Switch to C11 thread API when possible. 1150*4d6fc14bSjoerg# define _LIBCPP_HAS_THREAD_API_PTHREAD 1151*4d6fc14bSjoerg# elif defined(_LIBCPP_WIN32API) 1152*4d6fc14bSjoerg# define _LIBCPP_HAS_THREAD_API_WIN32 1153*4d6fc14bSjoerg# else 1154*4d6fc14bSjoerg# error "No thread API" 1155*4d6fc14bSjoerg# endif // _LIBCPP_HAS_THREAD_API 1156*4d6fc14bSjoerg#endif // _LIBCPP_HAS_NO_THREADS 1157*4d6fc14bSjoerg 1158*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) 1159*4d6fc14bSjoerg#if defined(__ANDROID__) && __ANDROID_API__ >= 30 1160*4d6fc14bSjoerg#define _LIBCPP_HAS_COND_CLOCKWAIT 1161*4d6fc14bSjoerg#elif defined(_LIBCPP_GLIBC_PREREQ) 1162*4d6fc14bSjoerg#if _LIBCPP_GLIBC_PREREQ(2, 30) 1163*4d6fc14bSjoerg#define _LIBCPP_HAS_COND_CLOCKWAIT 1164*4d6fc14bSjoerg#endif 1165*4d6fc14bSjoerg#endif 1166*4d6fc14bSjoerg#endif 1167*4d6fc14bSjoerg 1168*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD) 1169*4d6fc14bSjoerg#error _LIBCPP_HAS_THREAD_API_PTHREAD may only be defined when \ 1170*4d6fc14bSjoerg _LIBCPP_HAS_NO_THREADS is not defined. 1171*4d6fc14bSjoerg#endif 1172*4d6fc14bSjoerg 1173*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) 1174*4d6fc14bSjoerg#error _LIBCPP_HAS_THREAD_API_EXTERNAL may not be defined when \ 1175*4d6fc14bSjoerg _LIBCPP_HAS_NO_THREADS is defined. 1176*4d6fc14bSjoerg#endif 1177*4d6fc14bSjoerg 1178*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(_LIBCPP_HAS_NO_THREADS) 1179*4d6fc14bSjoerg#error _LIBCPP_HAS_NO_MONOTONIC_CLOCK may only be defined when \ 1180*4d6fc14bSjoerg _LIBCPP_HAS_NO_THREADS is defined. 1181*4d6fc14bSjoerg#endif 1182*4d6fc14bSjoerg 1183*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_THREADS) && !defined(__STDCPP_THREADS__) 1184*4d6fc14bSjoerg#define __STDCPP_THREADS__ 1 1185*4d6fc14bSjoerg#endif 1186*4d6fc14bSjoerg 1187*4d6fc14bSjoerg// The glibc and Bionic implementation of pthreads implements 1188*4d6fc14bSjoerg// pthread_mutex_destroy as nop for regular mutexes. Additionally, Win32 1189*4d6fc14bSjoerg// mutexes have no destroy mechanism. 1190*4d6fc14bSjoerg// 1191*4d6fc14bSjoerg// This optimization can't be performed on Apple platforms, where 1192*4d6fc14bSjoerg// pthread_mutex_destroy can allow the kernel to release resources. 1193*4d6fc14bSjoerg// See https://llvm.org/D64298 for details. 1194*4d6fc14bSjoerg// 1195*4d6fc14bSjoerg// TODO(EricWF): Enable this optimization on Bionic after speaking to their 1196*4d6fc14bSjoerg// respective stakeholders. 1197*4d6fc14bSjoerg#if (defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && defined(__GLIBC__)) \ 1198*4d6fc14bSjoerg || (defined(_LIBCPP_HAS_THREAD_API_C11) && defined(__Fuchsia__)) \ 1199*4d6fc14bSjoerg || defined(_LIBCPP_HAS_THREAD_API_WIN32) 1200*4d6fc14bSjoerg# define _LIBCPP_HAS_TRIVIAL_MUTEX_DESTRUCTION 1201*4d6fc14bSjoerg#endif 1202*4d6fc14bSjoerg 1203*4d6fc14bSjoerg// Destroying a condvar is a nop on Windows. 1204*4d6fc14bSjoerg// 1205*4d6fc14bSjoerg// This optimization can't be performed on Apple platforms, where 1206*4d6fc14bSjoerg// pthread_cond_destroy can allow the kernel to release resources. 1207*4d6fc14bSjoerg// See https://llvm.org/D64298 for details. 1208*4d6fc14bSjoerg// 1209*4d6fc14bSjoerg// TODO(EricWF): This is potentially true for some pthread implementations 1210*4d6fc14bSjoerg// as well. 1211*4d6fc14bSjoerg#if (defined(_LIBCPP_HAS_THREAD_API_C11) && defined(__Fuchsia__)) || \ 1212*4d6fc14bSjoerg defined(_LIBCPP_HAS_THREAD_API_WIN32) 1213*4d6fc14bSjoerg# define _LIBCPP_HAS_TRIVIAL_CONDVAR_DESTRUCTION 1214*4d6fc14bSjoerg#endif 1215*4d6fc14bSjoerg 1216*4d6fc14bSjoerg// Systems that use capability-based security (FreeBSD with Capsicum, 1217*4d6fc14bSjoerg// Nuxi CloudABI) may only provide local filesystem access (using *at()). 1218*4d6fc14bSjoerg// Functions like open(), rename(), unlink() and stat() should not be 1219*4d6fc14bSjoerg// used, as they attempt to access the global filesystem namespace. 1220*4d6fc14bSjoerg#ifdef __CloudABI__ 1221*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1222*4d6fc14bSjoerg#endif 1223*4d6fc14bSjoerg 1224*4d6fc14bSjoerg// CloudABI is intended for running networked services. Processes do not 1225*4d6fc14bSjoerg// have standard input and output channels. 1226*4d6fc14bSjoerg#ifdef __CloudABI__ 1227*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_STDIN 1228*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_STDOUT 1229*4d6fc14bSjoerg#endif 1230*4d6fc14bSjoerg 1231*4d6fc14bSjoerg// Some systems do not provide gets() in their C library, for security reasons. 1232*4d6fc14bSjoerg#ifndef _LIBCPP_C_HAS_NO_GETS 1233*4d6fc14bSjoerg# if defined(_LIBCPP_MSVCRT) || \ 1234*4d6fc14bSjoerg (defined(__FreeBSD_version) && __FreeBSD_version >= 1300043) || \ 1235*4d6fc14bSjoerg defined(__OpenBSD__) 1236*4d6fc14bSjoerg# define _LIBCPP_C_HAS_NO_GETS 1237*4d6fc14bSjoerg# endif 1238*4d6fc14bSjoerg#endif 1239*4d6fc14bSjoerg 1240*4d6fc14bSjoerg#if defined(__BIONIC__) || defined(__CloudABI__) || defined(__NuttX__) || \ 1241*4d6fc14bSjoerg defined(__Fuchsia__) || defined(__wasi__) || defined(_LIBCPP_HAS_MUSL_LIBC) || \ 1242*4d6fc14bSjoerg defined(__MVS__) || defined(__OpenBSD__) 1243*4d6fc14bSjoerg#define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE 1244*4d6fc14bSjoerg#endif 1245*4d6fc14bSjoerg 1246*4d6fc14bSjoerg// Thread-unsafe functions such as strtok() and localtime() 1247*4d6fc14bSjoerg// are not available. 1248*4d6fc14bSjoerg#ifdef __CloudABI__ 1249*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS 1250*4d6fc14bSjoerg#endif 1251*4d6fc14bSjoerg 1252*4d6fc14bSjoerg#if __has_feature(cxx_atomic) || __has_extension(c_atomic) || __has_keyword(_Atomic) 1253*4d6fc14bSjoerg# define _LIBCPP_HAS_C_ATOMIC_IMP 1254*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_GCC) 1255*4d6fc14bSjoerg# define _LIBCPP_HAS_GCC_ATOMIC_IMP 1256*4d6fc14bSjoerg#endif 1257*4d6fc14bSjoerg 1258*4d6fc14bSjoerg#if (!defined(_LIBCPP_HAS_C_ATOMIC_IMP) && \ 1259*4d6fc14bSjoerg !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP) && \ 1260*4d6fc14bSjoerg !defined(_LIBCPP_HAS_EXTERNAL_ATOMIC_IMP)) \ 1261*4d6fc14bSjoerg || defined(_LIBCPP_HAS_NO_THREADS) 1262*4d6fc14bSjoerg# define _LIBCPP_HAS_NO_ATOMIC_HEADER 1263*4d6fc14bSjoerg#else 1264*4d6fc14bSjoerg# ifndef _LIBCPP_ATOMIC_FLAG_TYPE 1265*4d6fc14bSjoerg# define _LIBCPP_ATOMIC_FLAG_TYPE bool 1266*4d6fc14bSjoerg# endif 1267*4d6fc14bSjoerg# ifdef _LIBCPP_FREESTANDING 1268*4d6fc14bSjoerg# define _LIBCPP_ATOMIC_ONLY_USE_BUILTINS 1269*4d6fc14bSjoerg# endif 1270*4d6fc14bSjoerg#endif 1271*4d6fc14bSjoerg 1272*4d6fc14bSjoerg#ifndef _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 1273*4d6fc14bSjoerg#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 1274*4d6fc14bSjoerg#endif 1275*4d6fc14bSjoerg 1276*4d6fc14bSjoerg#if defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) 1277*4d6fc14bSjoerg# if defined(__clang__) && __has_attribute(acquire_capability) 1278*4d6fc14bSjoerg// Work around the attribute handling in clang. When both __declspec and 1279*4d6fc14bSjoerg// __attribute__ are present, the processing goes awry preventing the definition 1280*4d6fc14bSjoerg// of the types. 1281*4d6fc14bSjoerg# if !defined(_LIBCPP_OBJECT_FORMAT_COFF) 1282*4d6fc14bSjoerg# define _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS 1283*4d6fc14bSjoerg# endif 1284*4d6fc14bSjoerg# endif 1285*4d6fc14bSjoerg#endif 1286*4d6fc14bSjoerg 1287*4d6fc14bSjoerg#ifndef _LIBCPP_THREAD_SAFETY_ANNOTATION 1288*4d6fc14bSjoerg# ifdef _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS 1289*4d6fc14bSjoerg# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x) __attribute__((x)) 1290*4d6fc14bSjoerg# else 1291*4d6fc14bSjoerg# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x) 1292*4d6fc14bSjoerg# endif 1293*4d6fc14bSjoerg#endif // _LIBCPP_THREAD_SAFETY_ANNOTATION 1294*4d6fc14bSjoerg 1295*4d6fc14bSjoerg#if __has_attribute(require_constant_initialization) 1296*4d6fc14bSjoerg# define _LIBCPP_SAFE_STATIC __attribute__((__require_constant_initialization__)) 1297*4d6fc14bSjoerg#else 1298*4d6fc14bSjoerg# define _LIBCPP_SAFE_STATIC 1299*4d6fc14bSjoerg#endif 1300*4d6fc14bSjoerg 1301*4d6fc14bSjoerg#if !__has_builtin(__builtin_addressof) && _GNUC_VER < 700 1302*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF 1303*4d6fc14bSjoerg#endif 1304*4d6fc14bSjoerg 1305*4d6fc14bSjoerg#if !__has_builtin(__builtin_is_constant_evaluated) && _GNUC_VER < 900 1306*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED 1307*4d6fc14bSjoerg#endif 1308*4d6fc14bSjoerg 1309*4d6fc14bSjoerg#if __has_attribute(diagnose_if) && !defined(_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS) 1310*4d6fc14bSjoerg# define _LIBCPP_DIAGNOSE_WARNING(...) \ 1311*4d6fc14bSjoerg __attribute__((diagnose_if(__VA_ARGS__, "warning"))) 1312*4d6fc14bSjoerg# define _LIBCPP_DIAGNOSE_ERROR(...) \ 1313*4d6fc14bSjoerg __attribute__((diagnose_if(__VA_ARGS__, "error"))) 1314*4d6fc14bSjoerg#else 1315*4d6fc14bSjoerg# define _LIBCPP_DIAGNOSE_WARNING(...) 1316*4d6fc14bSjoerg# define _LIBCPP_DIAGNOSE_ERROR(...) 1317*4d6fc14bSjoerg#endif 1318*4d6fc14bSjoerg 1319*4d6fc14bSjoerg// Use a function like macro to imply that it must be followed by a semicolon 1320*4d6fc14bSjoerg#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough) 1321*4d6fc14bSjoerg# define _LIBCPP_FALLTHROUGH() [[fallthrough]] 1322*4d6fc14bSjoerg#elif __has_cpp_attribute(clang::fallthrough) 1323*4d6fc14bSjoerg# define _LIBCPP_FALLTHROUGH() [[clang::fallthrough]] 1324*4d6fc14bSjoerg#elif __has_attribute(fallthrough) || _GNUC_VER >= 700 1325*4d6fc14bSjoerg# define _LIBCPP_FALLTHROUGH() __attribute__((__fallthrough__)) 1326*4d6fc14bSjoerg#else 1327*4d6fc14bSjoerg# define _LIBCPP_FALLTHROUGH() ((void)0) 1328*4d6fc14bSjoerg#endif 1329*4d6fc14bSjoerg 1330*4d6fc14bSjoerg#if __has_attribute(__nodebug__) 1331*4d6fc14bSjoerg#define _LIBCPP_NODEBUG __attribute__((__nodebug__)) 1332*4d6fc14bSjoerg#else 1333*4d6fc14bSjoerg#define _LIBCPP_NODEBUG 1334*4d6fc14bSjoerg#endif 1335*4d6fc14bSjoerg 1336*4d6fc14bSjoerg#ifndef _LIBCPP_NODEBUG_TYPE 1337*4d6fc14bSjoerg#if __has_attribute(__nodebug__) && \ 1338*4d6fc14bSjoerg (defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER >= 900) 1339*4d6fc14bSjoerg#define _LIBCPP_NODEBUG_TYPE __attribute__((nodebug)) 1340*4d6fc14bSjoerg#else 1341*4d6fc14bSjoerg#define _LIBCPP_NODEBUG_TYPE 1342*4d6fc14bSjoerg#endif 1343*4d6fc14bSjoerg#endif // !defined(_LIBCPP_NODEBUG_TYPE) 1344*4d6fc14bSjoerg 1345*4d6fc14bSjoerg#if __has_attribute(__standalone_debug__) 1346*4d6fc14bSjoerg#define _LIBCPP_STANDALONE_DEBUG __attribute__((__standalone_debug__)) 1347*4d6fc14bSjoerg#else 1348*4d6fc14bSjoerg#define _LIBCPP_STANDALONE_DEBUG 1349*4d6fc14bSjoerg#endif 1350*4d6fc14bSjoerg 1351*4d6fc14bSjoerg#if __has_attribute(__preferred_name__) 1352*4d6fc14bSjoerg#define _LIBCPP_PREFERRED_NAME(x) __attribute__((__preferred_name__(x))) 1353*4d6fc14bSjoerg#else 1354*4d6fc14bSjoerg#define _LIBCPP_PREFERRED_NAME(x) 1355*4d6fc14bSjoerg#endif 1356*4d6fc14bSjoerg 1357*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_MICROSOFT) && \ 1358*4d6fc14bSjoerg (defined(_LIBCPP_COMPILER_MSVC) || __has_declspec_attribute(empty_bases)) 1359*4d6fc14bSjoerg# define _LIBCPP_DECLSPEC_EMPTY_BASES __declspec(empty_bases) 1360*4d6fc14bSjoerg#else 1361*4d6fc14bSjoerg# define _LIBCPP_DECLSPEC_EMPTY_BASES 1362*4d6fc14bSjoerg#endif 1363*4d6fc14bSjoerg 1364*4d6fc14bSjoerg#if defined(_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES) 1365*4d6fc14bSjoerg#define _LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR 1366*4d6fc14bSjoerg#define _LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS 1367*4d6fc14bSjoerg#define _LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE 1368*4d6fc14bSjoerg#define _LIBCPP_ENABLE_CXX17_REMOVED_BINDERS 1369*4d6fc14bSjoerg#endif // _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES 1370*4d6fc14bSjoerg 1371*4d6fc14bSjoerg#if !defined(__cpp_deduction_guides) || __cpp_deduction_guides < 201611 1372*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_DEDUCTION_GUIDES 1373*4d6fc14bSjoerg#endif 1374*4d6fc14bSjoerg 1375*4d6fc14bSjoerg#if !__has_keyword(__is_aggregate) && (_GNUC_VER_NEW < 7001) 1376*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_IS_AGGREGATE 1377*4d6fc14bSjoerg#endif 1378*4d6fc14bSjoerg 1379*4d6fc14bSjoerg#if !defined(__cpp_coroutines) || __cpp_coroutines < 201703L 1380*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_COROUTINES 1381*4d6fc14bSjoerg#endif 1382*4d6fc14bSjoerg 1383*4d6fc14bSjoerg#if !defined(__cpp_impl_three_way_comparison) || __cpp_impl_three_way_comparison < 201907L 1384*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_SPACESHIP_OPERATOR 1385*4d6fc14bSjoerg#endif 1386*4d6fc14bSjoerg 1387*4d6fc14bSjoerg#if defined(_LIBCPP_COMPILER_IBM) 1388*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO 1389*4d6fc14bSjoerg#endif 1390*4d6fc14bSjoerg 1391*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO) 1392*4d6fc14bSjoerg# define _LIBCPP_PUSH_MACROS 1393*4d6fc14bSjoerg# define _LIBCPP_POP_MACROS 1394*4d6fc14bSjoerg#else 1395*4d6fc14bSjoerg // Don't warn about macro conflicts when we can restore them at the 1396*4d6fc14bSjoerg // end of the header. 1397*4d6fc14bSjoerg# ifndef _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS 1398*4d6fc14bSjoerg# define _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS 1399*4d6fc14bSjoerg# endif 1400*4d6fc14bSjoerg# if defined(_LIBCPP_COMPILER_MSVC) 1401*4d6fc14bSjoerg# define _LIBCPP_PUSH_MACROS \ 1402*4d6fc14bSjoerg __pragma(push_macro("min")) \ 1403*4d6fc14bSjoerg __pragma(push_macro("max")) 1404*4d6fc14bSjoerg# define _LIBCPP_POP_MACROS \ 1405*4d6fc14bSjoerg __pragma(pop_macro("min")) \ 1406*4d6fc14bSjoerg __pragma(pop_macro("max")) 1407*4d6fc14bSjoerg# else 1408*4d6fc14bSjoerg# define _LIBCPP_PUSH_MACROS \ 1409*4d6fc14bSjoerg _Pragma("push_macro(\"min\")") \ 1410*4d6fc14bSjoerg _Pragma("push_macro(\"max\")") 1411*4d6fc14bSjoerg# define _LIBCPP_POP_MACROS \ 1412*4d6fc14bSjoerg _Pragma("pop_macro(\"min\")") \ 1413*4d6fc14bSjoerg _Pragma("pop_macro(\"max\")") 1414*4d6fc14bSjoerg# endif 1415*4d6fc14bSjoerg#endif // defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO) 1416*4d6fc14bSjoerg 1417*4d6fc14bSjoerg#ifndef _LIBCPP_NO_AUTO_LINK 1418*4d6fc14bSjoerg# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY) 1419*4d6fc14bSjoerg# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 1420*4d6fc14bSjoerg# pragma comment(lib, "c++.lib") 1421*4d6fc14bSjoerg# else 1422*4d6fc14bSjoerg# pragma comment(lib, "libc++.lib") 1423*4d6fc14bSjoerg# endif 1424*4d6fc14bSjoerg# endif // defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY) 1425*4d6fc14bSjoerg#endif // _LIBCPP_NO_AUTO_LINK 1426*4d6fc14bSjoerg 1427*4d6fc14bSjoerg// Configures the fopen close-on-exec mode character, if any. This string will 1428*4d6fc14bSjoerg// be appended to any mode string used by fstream for fopen/fdopen. 1429*4d6fc14bSjoerg// 1430*4d6fc14bSjoerg// Not all platforms support this, but it helps avoid fd-leaks on platforms that 1431*4d6fc14bSjoerg// do. 1432*4d6fc14bSjoerg#if defined(__BIONIC__) 1433*4d6fc14bSjoerg# define _LIBCPP_FOPEN_CLOEXEC_MODE "e" 1434*4d6fc14bSjoerg#else 1435*4d6fc14bSjoerg# define _LIBCPP_FOPEN_CLOEXEC_MODE 1436*4d6fc14bSjoerg#endif 1437*4d6fc14bSjoerg 1438*4d6fc14bSjoerg#ifdef _LIBCPP_COMPILER_HAS_BUILTIN_CONSTANT_P 1439*4d6fc14bSjoerg#define _LIBCPP_BUILTIN_CONSTANT_P(x) __builtin_constant_p(x) 1440*4d6fc14bSjoerg#else 1441*4d6fc14bSjoerg#define _LIBCPP_BUILTIN_CONSTANT_P(x) false 1442*4d6fc14bSjoerg#endif 1443*4d6fc14bSjoerg 1444*4d6fc14bSjoerg// Support for _FILE_OFFSET_BITS=64 landed gradually in Android, so the full set 1445*4d6fc14bSjoerg// of functions used in cstdio may not be available for low API levels when 1446*4d6fc14bSjoerg// using 64-bit file offsets on LP32. 1447*4d6fc14bSjoerg#if defined(__BIONIC__) && defined(__USE_FILE_OFFSET64) && __ANDROID_API__ < 24 1448*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_FGETPOS_FSETPOS 1449*4d6fc14bSjoerg#endif 1450*4d6fc14bSjoerg 1451*4d6fc14bSjoerg#if __has_attribute(init_priority) 1452*4d6fc14bSjoerg# define _LIBCPP_INIT_PRIORITY_MAX __attribute__((init_priority(101))) 1453*4d6fc14bSjoerg#else 1454*4d6fc14bSjoerg# define _LIBCPP_INIT_PRIORITY_MAX 1455*4d6fc14bSjoerg#endif 1456*4d6fc14bSjoerg 1457*4d6fc14bSjoerg#if defined(__GNUC__) || defined(__clang__) 1458*4d6fc14bSjoerg#define _LIBCPP_FORMAT_PRINTF(a, b) \ 1459*4d6fc14bSjoerg __attribute__((__format__(__printf__, a, b))) 1460*4d6fc14bSjoerg#else 1461*4d6fc14bSjoerg#define _LIBCPP_FORMAT_PRINTF(a, b) 1462*4d6fc14bSjoerg#endif 1463*4d6fc14bSjoerg 1464*4d6fc14bSjoerg#endif // __cplusplus 1465*4d6fc14bSjoerg 1466*4d6fc14bSjoerg#endif // _LIBCPP_CONFIG 1467