From 614ca62428e304c8d710f97aaf2881e8b6a297a4 Mon Sep 17 00:00:00 2001 From: Orvid King Date: Wed, 12 Aug 2015 13:39:29 -0700 Subject: [PATCH] Add MSVC support to MaxAlign Summary: This adds MSVC support to the detection of `MaxAlign` in `Portability.h`. Closes #256 Reviewed By: @yfeldblum Differential Revision: D2283221 Pulled By: @sgolemon --- folly/MicroSpinLock.h | 8 +++----- folly/Portability.h | 17 +++++++++-------- folly/io/IOBuf.cpp | 2 +- folly/io/test/IOBufTest.cpp | 8 +++----- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/folly/MicroSpinLock.h b/folly/MicroSpinLock.h index 6a7588f9..256ab866 100644 --- a/folly/MicroSpinLock.h +++ b/folly/MicroSpinLock.h @@ -123,11 +123,9 @@ struct FOLLY_ALIGNED_MAX SpinLockArray { "Invalid size of PaddedSpinLock"); // Check if T can theoretically cross a cache line. - // NOTE: It should be alignof(std::max_align_t), but max_align_t - // isn't supported by gcc 4.6.2. - static_assert(alignof(MaxAlign) > 0 && - FOLLY_CACHE_LINE_SIZE % alignof(MaxAlign) == 0 && - sizeof(T) <= alignof(MaxAlign), + static_assert(alignof(std::max_align_t) > 0 && + FOLLY_CACHE_LINE_SIZE % alignof(std::max_align_t) == 0 && + sizeof(T) <= alignof(std::max_align_t), "T can cross cache line boundaries"); char padding_[FOLLY_CACHE_LINE_SIZE]; diff --git a/folly/Portability.h b/folly/Portability.h index fad35b1d..5e2eff3d 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,13 +55,6 @@ #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 @@ -70,7 +65,7 @@ struct MaxAlign { char c; } __attribute__((__aligned__)); #else # error Cannot define FOLLY_ALIGNED on this platform #endif -#define FOLLY_ALIGNED_MAX FOLLY_ALIGNED(alignof(MaxAlign)) +#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 @@ -164,6 +159,12 @@ struct MaxAlign { char c; } __attribute__((__aligned__)); # endif #endif +#if defined(__GNUC__) && !__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. */ diff --git a/folly/io/IOBuf.cpp b/folly/io/IOBuf.cpp index 65903b8f..35c4e102 100644 --- a/folly/io/IOBuf.cpp +++ b/folly/io/IOBuf.cpp @@ -112,7 +112,7 @@ struct IOBuf::HeapFullStorage { HeapStorage hs; SharedInfo shared; - MaxAlign align; + std::max_align_t align; }; IOBuf::SharedInfo::SharedInfo() diff --git a/folly/io/test/IOBufTest.cpp b/folly/io/test/IOBufTest.cpp index 20688505..ba926177 100644 --- a/folly/io/test/IOBufTest.cpp +++ b/folly/io/test/IOBufTest.cpp @@ -24,6 +24,8 @@ #include #include +#include + using folly::fbstring; using folly::fbvector; using folly::IOBuf; @@ -792,11 +794,7 @@ TEST(IOBuf, takeOwnershipUniquePtr) { } TEST(IOBuf, Alignment) { - // max_align_t doesn't exist in gcc 4.6.2 - struct MaxAlign { - char c; - } __attribute__((__aligned__)); - size_t alignment = alignof(MaxAlign); + size_t alignment = alignof(std::max_align_t); std::vector sizes {0, 1, 64, 256, 1024, 1 << 10}; for (size_t size : sizes) { -- 2.34.1