X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FPortability.h;h=1498db30bfca9f4b6512f090491e4360eadad9e2;hp=cf2c8d32749897faab4c5409bef86ef8f468a11a;hb=c5a4f4c8d0097e02c380967fc7a3a2b39bb78a53;hpb=ccb56f3caf60f77d912704fb3a221bc9f12dbfb7 diff --git a/folly/Portability.h b/folly/Portability.h index cf2c8d32..1498db30 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -1,5 +1,5 @@ /* - * Copyright 2017 Facebook, Inc. + * Copyright 2017-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +16,7 @@ #pragma once -#include - #include -#include #include @@ -32,73 +29,6 @@ constexpr bool kHasUnalignedAccess = true; #else constexpr bool kHasUnalignedAccess = false; #endif - -namespace portability_detail { - -template -using integral_max = std::integral_constant; - -template -struct integral_sequence_max - : integral_max::value> {}; - -template -struct integral_sequence_max : std::integral_constant {}; - -template -using max_alignment = integral_sequence_max; - -using max_basic_alignment = max_alignment< - std::max_align_t, - long double, - double, - float, - long long int, - long int, - int, - short int, - bool, - char, - char16_t, - char32_t, - wchar_t, - std::nullptr_t>; -} // namespace detail - -constexpr size_t max_align_v = portability_detail::max_basic_alignment::value; - -// max_align_t is a type which is aligned at least as strictly as the -// most-aligned basic type (see the specification of std::max_align_t). This -// implementation exists because 32-bit iOS platforms have a broken -// std::max_align_t (see below). -// -// You should refer to this as `::folly::max_align_t` in portable code, even if -// you have `using namespace folly;` because C11 defines a global namespace -// `max_align_t` type. -// -// To be certain, we consider every non-void fundamental type specified by the -// standard. On most platforms `long double` would be enough, but iOS 32-bit -// has an 8-byte aligned `double` and `long long int` and a 4-byte aligned -// `long double`. -// -// So far we've covered locals and other non-allocated storage, but we also need -// confidence that allocated storage from `malloc`, `new`, etc will also be -// suitable for objects with this alignment reuirement. -// -// Apple document that their implementation of malloc will issue 16-byte -// granularity chunks for small allocations (large allocations are page-size -// granularity and page-aligned). We think that allocated storage will be -// suitable for these objects based on the following assumptions: -// -// 1. 16-byte granularity also means 16-byte aligned. -// 2. `new` and other allocators follow the `malloc` rules. -// -// We also have some anecdotal evidence: we don't see lots of misaligned-storage -// crashes on 32-bit iOS apps that use `double`. -// -// Apple's allocation reference: http://bit.ly/malloc-small -struct alignas(max_align_v) max_align_t {}; - } // namespace folly // compiler specific attribute translation @@ -111,7 +41,6 @@ struct alignas(max_align_v) max_align_t {}; #else # error Cannot define FOLLY_ALIGNED on this platform #endif -#define FOLLY_ALIGNED_MAX FOLLY_ALIGNED(::folly::max_align_v) // NOTE: this will only do checking in msvc with versions that support /analyze #if _MSC_VER @@ -169,9 +98,9 @@ struct alignas(max_align_v) max_align_t {}; #endif #if defined(__aarch64__) -# define FOLLY_A64 1 +# define FOLLY_AARCH64 1 #else -# define FOLLY_A64 0 +# define FOLLY_AARCH64 0 #endif #if defined (__powerpc64__) @@ -182,9 +111,9 @@ struct alignas(max_align_v) max_align_t {}; namespace folly { constexpr bool kIsArchAmd64 = FOLLY_X64 == 1; -constexpr bool kIsArchAArch64 = FOLLY_A64 == 1; +constexpr bool kIsArchAArch64 = FOLLY_AARCH64 == 1; constexpr bool kIsArchPPC64 = FOLLY_PPC64 == 1; -} +} // namespace folly namespace folly { @@ -199,7 +128,13 @@ constexpr bool kIsSanitizeThread = true; #else constexpr bool kIsSanitizeThread = false; #endif -} + +#if FOLLY_SANITIZE +constexpr bool kIsSanitize = true; +#else +constexpr bool kIsSanitize = false; +#endif +} // namespace folly // packing is very ugly in msvc #ifdef _MSC_VER @@ -313,7 +248,7 @@ constexpr auto kIsDebug = false; #else constexpr auto kIsDebug = true; #endif -} +} // namespace folly // Endianness namespace folly { @@ -328,7 +263,7 @@ constexpr auto kIsLittleEndian = true; constexpr auto kIsLittleEndian = __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__; #endif constexpr auto kIsBigEndian = !kIsLittleEndian; -} +} // namespace folly #ifndef FOLLY_SSE # if defined(__SSE4_2__) @@ -393,6 +328,12 @@ constexpr auto kIsObjC = true; constexpr auto kIsObjC = false; #endif +#if FOLLY_MOBILE +constexpr auto kIsMobile = true; +#else +constexpr auto kIsMobile = false; +#endif + #if defined(__linux__) && !FOLLY_MOBILE constexpr auto kIsLinux = true; #else @@ -406,7 +347,7 @@ constexpr auto kMscVer = _MSC_VER; constexpr auto kIsWindows = false; constexpr auto kMscVer = 0; #endif -} +} // namespace folly // Define FOLLY_USE_CPP14_CONSTEXPR to be true if the compiler's C++14 // constexpr support is "good enough". @@ -425,3 +366,12 @@ constexpr auto kMscVer = 0; #else #define FOLLY_CPP14_CONSTEXPR inline #endif + +#if __cpp_coroutines >= 201703L || (_MSC_VER && _RESUMABLE_FUNCTIONS_SUPPORTED) +#define FOLLY_HAS_COROUTINES 1 +#endif + +// MSVC 2017.5 +#if __cpp_noexcept_function_type >= 201510 || _MSC_FULL_VER >= 191225816 +#define FOLLY_HAVE_NOEXCEPT_FUNCTION_TYPE 1 +#endif