X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FPortability.h;h=b990b302938c138d5b82a34d382c99c2372df119;hb=3e6ccd5c48456a86f19e1f3022545b3a2b52786e;hp=a9c3679313f38c892380ac1a923a18776d1672e5;hpb=0c1113b9d64f7c805f1030f28329198fa2dd926d;p=folly.git diff --git a/folly/Portability.h b/folly/Portability.h index a9c36793..b990b302 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -17,6 +17,8 @@ #ifndef FOLLY_PORTABILITY_H_ #define FOLLY_PORTABILITY_H_ +#include + #ifndef FOLLY_NO_CONFIG #include #endif @@ -53,16 +55,18 @@ #endif #endif -// MaxAlign: max_align_t isn't supported by gcc -#ifdef __GNUC__ -struct MaxAlign { char c; } __attribute__((__aligned__)); -#else /* !__GNUC__ */ -# error Cannot define MaxAlign on this platform -#endif - // compiler specific attribute translation // msvc should come first, so if clang is in msvc mode it gets the right defines +#if defined(__clang__) || defined(__GNUC__) +# define FOLLY_ALIGNED(size) __attribute__((__aligned__(size))) +#elif defined(_MSC_VER) +# define FOLLY_ALIGNED(size) __declspec(align(size)) +#else +# error Cannot define FOLLY_ALIGNED on this platform +#endif +#define FOLLY_ALIGNED_MAX FOLLY_ALIGNED(alignof(std::max_align_t)) + // NOTE: this will only do checking in msvc with versions that support /analyze #if _MSC_VER # ifdef _USE_ATTRIBUTES_FOR_SAL @@ -82,8 +86,10 @@ struct MaxAlign { char c; } __attribute__((__aligned__)); // deprecated #if defined(__clang__) || defined(__GNUC__) # define FOLLY_DEPRECATED(msg) __attribute__((__deprecated__(msg))) +#elif defined(_MSC_VER) +# define FOLLY_DEPRECATED(msg) __declspec(deprecated(msg)) #else -# define FOLLY_DEPRECATED +# define FOLLY_DEPRECATED(msg) #endif // noreturn @@ -110,7 +116,7 @@ struct MaxAlign { char c; } __attribute__((__aligned__)); #elif defined(__clang__) || defined(__GNUC__) # define FOLLY_ALWAYS_INLINE inline __attribute__((__always_inline__)) #else -# define FOLLY_ALWAYS_INLINE +# define FOLLY_ALWAYS_INLINE inline #endif // detection for 64 bit @@ -153,6 +159,12 @@ struct MaxAlign { char c; } __attribute__((__aligned__)); # endif #endif +#if defined(__GNUC__) && !defined(__APPLE__) && !__GNUC_PREREQ(4,9) +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56019 +// gcc 4.8.x incorrectly placed max_align_t in the root namespace +// Alias it into std (where it's found in 4.9 and later) +namespace std { typedef ::max_align_t max_align_t; } +#endif /* Define macro wrappers for C++11's "final" and "override" keywords, which * are supported in gcc 4.7 but not gcc 4.6. */ @@ -261,6 +273,40 @@ typedef SSIZE_T ssize_t; // compiler specific to compiler specific // nolint # define __PRETTY_FUNCTION__ __FUNCSIG__ + +// Hide a GCC specific thing that breaks MSVC if left alone. +# define __extension__ + +#ifdef _M_IX86_FP +# define FOLLY_SSE _M_IX86_FP +# define FOLLY_SSE_MINOR 0 +#endif + +#endif + +#ifndef FOLLY_SSE +# if defined(__SSE4_2__) +# define FOLLY_SSE 4 +# define FOLLY_SSE_MINOR 2 +# elif defined(__SSE4_1__) +# define FOLLY_SSE 4 +# define FOLLY_SSE_MINOR 1 +# elif defined(__SSE4__) +# define FOLLY_SSE 4 +# define FOLLY_SSE_MINOR 0 +# elif defined(__SSE3__) +# define FOLLY_SSE 3 +# define FOLLY_SSE_MINOR 0 +# elif defined(__SSE2__) +# define FOLLY_SSE 2 +# define FOLLY_SSE_MINOR 0 +# elif defined(__SSE__) +# define FOLLY_SSE 1 +# define FOLLY_SSE_MINOR 0 +# else +# define FOLLY_SSE 0 +# define FOLLY_SSE_MINOR 0 +# endif #endif #if FOLLY_UNUSUAL_GFLAGS_NAMESPACE @@ -294,6 +340,14 @@ inline size_t malloc_usable_size(void* ptr) { namespace folly { +inline void asm_volatile_memory() { +#if defined(__clang__) || defined(__GNUC__) + asm volatile("" : : : "memory"); +#elif defined(_MSC_VER) + ::_ReadWriteBarrier(); +#endif +} + inline void asm_volatile_pause() { #if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) ::_mm_pause();