X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FPortability.h;h=49d48f071f8022628c8ebaa232b91c95371629b6;hb=74560278227a11b3080a756d2fffb154caf9e2f1;hp=e6d06a4d2ebb4ba954b42fad712ad3eb538844f3;hpb=4da4f3311fa21190626b6a50eefde436028415c8;p=folly.git diff --git a/folly/Portability.h b/folly/Portability.h index e6d06a4d..49d48f07 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,10 +24,6 @@ #include -#if FOLLY_HAVE_SCHED_H - #include -#endif - // Unaligned loads and stores namespace folly { #if FOLLY_HAVE_UNALIGNED_ACCESS @@ -74,32 +70,22 @@ constexpr bool kHasUnalignedAccess = false; # define FOLLY_DEPRECATED(msg) #endif -// noinline -#ifdef _MSC_VER -# define FOLLY_NOINLINE __declspec(noinline) -#elif defined(__clang__) || defined(__GNUC__) -# define FOLLY_NOINLINE __attribute__((__noinline__)) -#else -# define FOLLY_NOINLINE +// warn unused result +#if defined(__has_cpp_attribute) +#if __has_cpp_attribute(nodiscard) +#define FOLLY_NODISCARD [[nodiscard]] #endif - -// always inline -#ifdef _MSC_VER -# define FOLLY_ALWAYS_INLINE __forceinline -#elif defined(__clang__) || defined(__GNUC__) -# define FOLLY_ALWAYS_INLINE inline __attribute__((__always_inline__)) -#else -# define FOLLY_ALWAYS_INLINE inline #endif - -// warn unused result +#if !defined FOLLY_NODISCARD #if defined(_MSC_VER) && (_MSC_VER >= 1700) -#define FOLLY_WARN_UNUSED_RESULT _Check_return_ +#define FOLLY_NODISCARD _Check_return_ #elif defined(__clang__) || defined(__GNUC__) -#define FOLLY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) +#define FOLLY_NODISCARD __attribute__((__warn_unused_result__)) #else -#define FOLLY_WARN_UNUSED_RESULT +#define FOLLY_NODISCARD +#endif #endif +#define FOLLY_WARN_UNUSED_RESULT FOLLY_NODISCARD // target #ifdef _MSC_VER @@ -127,6 +113,27 @@ constexpr bool kHasUnalignedAccess = false; # define FOLLY_PPC64 0 #endif +namespace folly { +constexpr bool kIsArchAmd64 = FOLLY_X64 == 1; +constexpr bool kIsArchAArch64 = FOLLY_A64 == 1; +constexpr bool kIsArchPPC64 = FOLLY_PPC64 == 1; +} + +namespace folly { + +#if FOLLY_SANITIZE_ADDRESS +constexpr bool kIsSanitizeAddress = true; +#else +constexpr bool kIsSanitizeAddress = false; +#endif + +#if FOLLY_SANITIZE_THREAD +constexpr bool kIsSanitizeThread = true; +#else +constexpr bool kIsSanitizeThread = false; +#endif +} + // packing is very ugly in msvc #ifdef _MSC_VER # define FOLLY_PACK_ATTR /**/ @@ -152,12 +159,10 @@ constexpr bool kHasUnalignedAccess = false; #elif defined(__clang__) || defined(__GNUC__) # define FOLLY_PUSH_WARNING _Pragma("GCC diagnostic push") # define FOLLY_POP_WARNING _Pragma("GCC diagnostic pop") -#define FOLLY_GCC_DISABLE_WARNING_INTERNAL3(warningName) #warningName -#define FOLLY_GCC_DISABLE_WARNING_INTERNAL2(warningName) \ - FOLLY_GCC_DISABLE_WARNING_INTERNAL3(warningName) -#define FOLLY_GCC_DISABLE_WARNING(warningName) \ - _Pragma(FOLLY_GCC_DISABLE_WARNING_INTERNAL2(GCC diagnostic ignored \ - FOLLY_GCC_DISABLE_WARNING_INTERNAL3(-W##warningName))) +# define FOLLY_GCC_DISABLE_WARNING_INTERNAL2(warningName) #warningName +# define FOLLY_GCC_DISABLE_WARNING(warningName) \ + _Pragma( \ + FOLLY_GCC_DISABLE_WARNING_INTERNAL2(GCC diagnostic ignored warningName)) // Disable the MSVC warnings. # define FOLLY_MSVC_DISABLE_WARNING(warningNumber) #else @@ -167,16 +172,12 @@ constexpr bool kHasUnalignedAccess = false; # define FOLLY_MSVC_DISABLE_WARNING(warningNumber) #endif -// portable version check -#ifndef __GNUC_PREREQ -# if defined __GNUC__ && defined __GNUC_MINOR__ -/* nolint */ -# define __GNUC_PREREQ(maj, min) ((__GNUC__ << 16) + __GNUC_MINOR__ >= \ - ((maj) << 16) + (min)) -# else -/* nolint */ -# define __GNUC_PREREQ(maj, min) 0 -# endif +#ifdef HAVE_SHADOW_LOCAL_WARNINGS +#define FOLLY_GCC_DISABLE_NEW_SHADOW_WARNINGS \ + FOLLY_GCC_DISABLE_WARNING("-Wshadow-compatible-local") \ + FOLLY_GCC_DISABLE_WARNING("-Wshadow-local") +#else +#define FOLLY_GCC_DISABLE_NEW_SHADOW_WARNINGS /* empty */ #endif #if defined(__GNUC__) && !defined(__APPLE__) && !__GNUC_PREREQ(4,9) @@ -231,42 +232,14 @@ namespace std { typedef ::max_align_t max_align_t; } // If the new c++ ABI is used, __cxx11 inline namespace needs to be added to // some types, e.g. std::list. #if _GLIBCXX_USE_CXX11_ABI -# define FOLLY_GLIBCXX_NAMESPACE_CXX11_BEGIN _GLIBCXX_BEGIN_NAMESPACE_CXX11 +#define FOLLY_GLIBCXX_NAMESPACE_CXX11_BEGIN \ + inline _GLIBCXX_BEGIN_NAMESPACE_CXX11 # define FOLLY_GLIBCXX_NAMESPACE_CXX11_END _GLIBCXX_END_NAMESPACE_CXX11 #else # define FOLLY_GLIBCXX_NAMESPACE_CXX11_BEGIN # define FOLLY_GLIBCXX_NAMESPACE_CXX11_END #endif -// Provide our own std::__throw_* wrappers for platforms that don't have them -#if FOLLY_HAVE_BITS_FUNCTEXCEPT_H -#include -#else -#include -#endif - -#if defined(__cplusplus) -// Unfortunately, boost::has_trivial_copy is broken in libc++ due to its -// usage of __has_trivial_copy(), so we can't use it as a -// least-common-denominator for C++11 implementations that don't support -// std::is_trivially_copyable. -// -// http://stackoverflow.com/questions/12754886/has-trivial-copy-behaves-differently-in-clang-and-gcc-whos-right -// -// As a result, use std::is_trivially_copyable() where it exists, and fall back -// to Boost otherwise. -#if FOLLY_HAVE_STD__IS_TRIVIALLY_COPYABLE -#include -#define FOLLY_IS_TRIVIALLY_COPYABLE(T) \ - (std::is_trivially_copyable::value) -#else -#include -#define FOLLY_IS_TRIVIALLY_COPYABLE(T) \ - (boost::has_trivial_copy::value && \ - boost::has_trivial_destructor::value) -#endif -#endif // __cplusplus - // MSVC specific defines // mainly for posix compat #ifdef _MSC_VER @@ -366,9 +339,21 @@ using namespace FOLLY_GFLAGS_NAMESPACE; namespace folly { +#if __OBJC__ +constexpr auto kIsObjC = true; +#else +constexpr auto kIsObjC = false; +#endif + #if defined(__linux__) && !FOLLY_MOBILE constexpr auto kIsLinux = true; #else constexpr auto kIsLinux = false; #endif + +#if defined(_WIN32) +constexpr auto kIsWindows = true; +#else +constexpr auto kIsWindows = false; +#endif }