X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FPortability.h;h=d42f00318e7ceb175bbcf9ceebab348e30f8ab5d;hb=16b7f86299f935fc16d38d72a8b497e2ab4a1d4f;hp=43953f931a064c4afeb55d8a606afa8f65b1b928;hpb=779cbf35527d33c4073a3c8929e284e9a16b0e50;p=folly.git diff --git a/folly/Portability.h b/folly/Portability.h index 43953f93..d42f0031 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -1,5 +1,5 @@ /* - * Copyright 2014 Facebook, Inc. + * Copyright 2015 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,14 +18,22 @@ #define FOLLY_PORTABILITY_H_ #ifndef FOLLY_NO_CONFIG -#include "folly-config.h" +#include +#endif + +#ifdef FOLLY_PLATFORM_CONFIG +#include FOLLY_PLATFORM_CONFIG #endif #if FOLLY_HAVE_FEATURES_H #include #endif -#include "CPortability.h" +#include + +#ifdef __APPLE__ +# include +#endif #if FOLLY_HAVE_SCHED_H #include @@ -34,10 +42,20 @@ #endif #endif +// A change in folly/MemoryMapping.cpp uses MAP_ANONYMOUS, which is named +// MAP_ANON on OSX/BSD. +#if defined(__APPLE__) || defined(__FreeBSD__) + #include + #ifndef MAP_ANONYMOUS + #ifdef MAP_ANON + #define MAP_ANONYMOUS MAP_ANON + #endif + #endif +#endif // MaxAlign: max_align_t isn't supported by gcc #ifdef __GNUC__ -struct MaxAlign { char c; } __attribute__((aligned)); +struct MaxAlign { char c; } __attribute__((__aligned__)); #else /* !__GNUC__ */ # error Cannot define MaxAlign on this platform #endif @@ -45,11 +63,34 @@ struct MaxAlign { char c; } __attribute__((aligned)); // compiler specific attribute translation // msvc should come first, so if clang is in msvc mode it gets the right defines +// NOTE: this will only do checking in msvc with versions that support /analyze +#if _MSC_VER +# ifdef _USE_ATTRIBUTES_FOR_SAL +# undef _USE_ATTRIBUTES_FOR_SAL +# endif +/* nolint */ +# define _USE_ATTRIBUTES_FOR_SAL 1 +# include +# define FOLLY_PRINTF_FORMAT _Printf_format_string_ +# define FOLLY_PRINTF_FORMAT_ATTR(format_param, dots_param) /**/ +#else +# define FOLLY_PRINTF_FORMAT /**/ +# define FOLLY_PRINTF_FORMAT_ATTR(format_param, dots_param) \ + __attribute__((__format__(__printf__, format_param, dots_param))) +#endif + +// deprecated +#if defined(__clang__) || defined(__GNUC__) +# define FOLLY_DEPRECATED(msg) __attribute__((__deprecated__(msg))) +#else +# define FOLLY_DEPRECATED +#endif + // noreturn #if defined(_MSC_VER) # define FOLLY_NORETURN __declspec(noreturn) #elif defined(__clang__) || defined(__GNUC__) -# define FOLLY_NORETURN __attribute__((noreturn)) +# define FOLLY_NORETURN __attribute__((__noreturn__)) #else # define FOLLY_NORETURN #endif @@ -58,7 +99,7 @@ struct MaxAlign { char c; } __attribute__((aligned)); #ifdef _MSC_VER # define FOLLY_NOINLINE __declspec(noinline) #elif defined(__clang__) || defined(__GNUC__) -# define FOLLY_NOINLINE __attribute__((noinline)) +# define FOLLY_NOINLINE __attribute__((__noinline__)) #else # define FOLLY_NOINLINE #endif @@ -67,7 +108,7 @@ struct MaxAlign { char c; } __attribute__((aligned)); #ifdef _MSC_VER # define FOLLY_ALWAYS_INLINE __forceinline #elif defined(__clang__) || defined(__GNUC__) -# define FOLLY_ALWAYS_INLINE inline __attribute__((always_inline)) +# define FOLLY_ALWAYS_INLINE inline __attribute__((__always_inline__)) #else # define FOLLY_ALWAYS_INLINE #endif @@ -79,12 +120,29 @@ struct MaxAlign { char c; } __attribute__((aligned)); # define FOLLY_X64 0 #endif +// packing is very ugly in msvc +#ifdef _MSC_VER +# define FOLLY_PACK_ATTR /**/ +# define FOLLY_PACK_PUSH __pragma(pack(push, 1)) +# define FOLLY_PACK_POP __pragma(pack(pop)) +#elif defined(__clang__) || defined(__GNUC__) +# define FOLLY_PACK_ATTR __attribute__((__packed__)) +# define FOLLY_PACK_PUSH /**/ +# define FOLLY_PACK_POP /**/ +#else +# define FOLLY_PACK_ATTR /**/ +# define FOLLY_PACK_PUSH /**/ +# define FOLLY_PACK_POP /**/ +#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 #endif @@ -105,7 +163,8 @@ struct MaxAlign { char c; } __attribute__((aligned)); /* Platform specific TLS support * gcc implements __thread * msvc implements __declspec(thread) - * the semantics are the same (but remember __thread is broken on apple) + * the semantics are the same + * (but remember __thread has different semantics when using emutls (ex. apple)) */ #if defined(_MSC_VER) # define FOLLY_TLS __declspec(thread) @@ -129,6 +188,7 @@ struct MaxAlign { char c; } __attribute__((aligned)); // the 'std' namespace; the latter uses inline namepsaces. Wrap this decision // up in a macro to make forward-declarations easier. #if FOLLY_USE_LIBCPP +#include <__config> #define FOLLY_NAMESPACE_STD_BEGIN _LIBCPP_BEGIN_NAMESPACE_STD #define FOLLY_NAMESPACE_STD_END _LIBCPP_END_NAMESPACE_STD #else @@ -141,14 +201,14 @@ struct MaxAlign { char c; } __attribute__((aligned)); #if FOLLY_HAVE_CLOCK_GETTIME #include #else -#include "folly/detail/Clock.h" +#include #endif // Provide our own std::__throw_* wrappers for platforms that don't have them #if FOLLY_HAVE_BITS_FUNCTEXCEPT_H #include #else -#include "folly/detail/FunctionalExcept.h" +#include #endif #if defined(__cplusplus) @@ -173,4 +233,49 @@ struct MaxAlign { char c; } __attribute__((aligned)); #endif #endif // __cplusplus +// MSVC specific defines +// mainly for posix compat +#ifdef _MSC_VER + +// this definition is in a really silly place with a silly name +// and ifdefing it every time we want it is painful +#include +typedef SSIZE_T ssize_t; + +// sprintf semantics are not exactly identical +// but current usage is not a problem +# define snprintf _snprintf + +// semantics here are identical +# define strerror_r(errno,buf,len) strerror_s(buf,len,errno) + +// compiler specific to compiler specific +// nolint +# define __PRETTY_FUNCTION__ __FUNCSIG__ +#endif + +#if FOLLY_UNUSUAL_GFLAGS_NAMESPACE +namespace FOLLY_GFLAGS_NAMESPACE { } +namespace gflags { +using namespace FOLLY_GFLAGS_NAMESPACE; +} // namespace gflags +#endif + +// for TARGET_OS_IPHONE +#ifdef __APPLE__ +#include +#endif + +// MacOS doesn't have malloc_usable_size() +#if defined(__APPLE__) && !defined(FOLLY_HAVE_MALLOC_USABLE_SIZE) +inline size_t malloc_usable_size(void* ptr) { + return malloc_size(ptr); +} +#endif + +// RTTI may not be enabled for this compilation unit. +#if defined(__GXX_RTTI) || defined(__cpp_rtti) +# define FOLLY_HAS_RTTI 1 +#endif + #endif // FOLLY_PORTABILITY_H_