X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FPortability.h;h=6c140379de9e9920755e3eb70cb615c6bd8acb88;hp=d0c14dd7e388122d732b9f29fb1ae11c0aebde1c;hb=614eb71734a284e1a9fefabcc48743a3c8efd653;hpb=2177f05a16891e5dc381ccfa56d36ce91418aa09 diff --git a/folly/Portability.h b/folly/Portability.h index d0c14dd7..6c140379 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -33,21 +33,20 @@ constexpr bool kHasUnalignedAccess = true; constexpr bool kHasUnalignedAccess = false; #endif -namespace detail { +namespace portability_detail { + +template +using integral_max = std::integral_constant; template -struct integral_max - : std::integral_constant< - I, - (A > integral_max::value) ? A - : integral_max::value> { -}; +struct integral_sequence_max + : integral_max::value> {}; -template -struct integral_max : std::integral_constant {}; +template +struct integral_sequence_max : std::integral_constant {}; template -using max_alignment = integral_max; +using max_alignment = integral_sequence_max; using max_basic_alignment = max_alignment< std::max_align_t, @@ -64,9 +63,9 @@ using max_basic_alignment = max_alignment< char32_t, wchar_t, std::nullptr_t>; -} // namespace detail +} // namespace portability_detail -constexpr size_t max_align_v = detail::max_basic_alignment::value; +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 @@ -170,9 +169,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__) @@ -183,9 +182,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 { @@ -200,7 +199,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 @@ -240,7 +245,7 @@ constexpr bool kIsSanitizeThread = false; # define FOLLY_MSVC_DISABLE_WARNING(warningNumber) #endif -#ifdef HAVE_SHADOW_LOCAL_WARNINGS +#ifdef FOLLY_HAVE_SHADOW_LOCAL_WARNINGS #define FOLLY_GCC_DISABLE_NEW_SHADOW_WARNINGS \ FOLLY_GCC_DISABLE_WARNING("-Wshadow-compatible-local") \ FOLLY_GCC_DISABLE_WARNING("-Wshadow-local") @@ -248,18 +253,6 @@ constexpr bool kIsSanitizeThread = false; #define FOLLY_GCC_DISABLE_NEW_SHADOW_WARNINGS /* empty */ #endif -// portable version check for clang -#ifndef __CLANG_PREREQ -# if defined __clang__ && defined __clang_major__ && defined __clang_minor__ -/* nolint */ -# define __CLANG_PREREQ(maj, min) \ - ((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min)) -# else -/* nolint */ -# define __CLANG_PREREQ(maj, min) 0 -# endif -#endif - /* Platform specific TLS support * gcc implements __thread * msvc implements __declspec(thread) @@ -326,7 +319,7 @@ constexpr auto kIsDebug = false; #else constexpr auto kIsDebug = true; #endif -} +} // namespace folly // Endianness namespace folly { @@ -341,7 +334,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__) @@ -375,7 +368,7 @@ constexpr auto kIsBigEndian = !kIsLittleEndian; namespace FOLLY_GFLAGS_NAMESPACE { } namespace gflags { using namespace FOLLY_GFLAGS_NAMESPACE; -} // namespace gflags +} // namespace gflags #endif // for TARGET_OS_IPHONE @@ -419,4 +412,31 @@ 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". +#ifndef FOLLY_USE_CPP14_CONSTEXPR +#if defined(__clang__) +#define FOLLY_USE_CPP14_CONSTEXPR __cplusplus >= 201300L +#elif defined(__GNUC__) +#define FOLLY_USE_CPP14_CONSTEXPR __cplusplus >= 201304L +#else +#define FOLLY_USE_CPP14_CONSTEXPR 0 // MSVC? +#endif +#endif + +#if FOLLY_USE_CPP14_CONSTEXPR +#define FOLLY_CPP14_CONSTEXPR constexpr +#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