Commit 614ca624 authored by Orvid King's avatar Orvid King Committed by facebook-github-bot-9

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
parent 21f7a3c1
...@@ -123,11 +123,9 @@ struct FOLLY_ALIGNED_MAX SpinLockArray { ...@@ -123,11 +123,9 @@ struct FOLLY_ALIGNED_MAX SpinLockArray {
"Invalid size of PaddedSpinLock"); "Invalid size of PaddedSpinLock");
// Check if T can theoretically cross a cache line. // Check if T can theoretically cross a cache line.
// NOTE: It should be alignof(std::max_align_t), but max_align_t static_assert(alignof(std::max_align_t) > 0 &&
// isn't supported by gcc 4.6.2. FOLLY_CACHE_LINE_SIZE % alignof(std::max_align_t) == 0 &&
static_assert(alignof(MaxAlign) > 0 && sizeof(T) <= alignof(std::max_align_t),
FOLLY_CACHE_LINE_SIZE % alignof(MaxAlign) == 0 &&
sizeof(T) <= alignof(MaxAlign),
"T can cross cache line boundaries"); "T can cross cache line boundaries");
char padding_[FOLLY_CACHE_LINE_SIZE]; char padding_[FOLLY_CACHE_LINE_SIZE];
......
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
#ifndef FOLLY_PORTABILITY_H_ #ifndef FOLLY_PORTABILITY_H_
#define FOLLY_PORTABILITY_H_ #define FOLLY_PORTABILITY_H_
#include <cstddef>
#ifndef FOLLY_NO_CONFIG #ifndef FOLLY_NO_CONFIG
#include <folly/folly-config.h> #include <folly/folly-config.h>
#endif #endif
...@@ -53,13 +55,6 @@ ...@@ -53,13 +55,6 @@
#endif #endif
#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 // compiler specific attribute translation
// msvc should come first, so if clang is in msvc mode it gets the right defines // 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__)); ...@@ -70,7 +65,7 @@ struct MaxAlign { char c; } __attribute__((__aligned__));
#else #else
# error Cannot define FOLLY_ALIGNED on this platform # error Cannot define FOLLY_ALIGNED on this platform
#endif #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 // NOTE: this will only do checking in msvc with versions that support /analyze
#if _MSC_VER #if _MSC_VER
...@@ -164,6 +159,12 @@ struct MaxAlign { char c; } __attribute__((__aligned__)); ...@@ -164,6 +159,12 @@ struct MaxAlign { char c; } __attribute__((__aligned__));
# endif # endif
#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 /* Define macro wrappers for C++11's "final" and "override" keywords, which
* are supported in gcc 4.7 but not gcc 4.6. */ * are supported in gcc 4.7 but not gcc 4.6. */
......
...@@ -112,7 +112,7 @@ struct IOBuf::HeapFullStorage { ...@@ -112,7 +112,7 @@ struct IOBuf::HeapFullStorage {
HeapStorage hs; HeapStorage hs;
SharedInfo shared; SharedInfo shared;
MaxAlign align; std::max_align_t align;
}; };
IOBuf::SharedInfo::SharedInfo() IOBuf::SharedInfo::SharedInfo()
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include <folly/Malloc.h> #include <folly/Malloc.h>
#include <folly/Range.h> #include <folly/Range.h>
#include <cstddef>
using folly::fbstring; using folly::fbstring;
using folly::fbvector; using folly::fbvector;
using folly::IOBuf; using folly::IOBuf;
...@@ -792,11 +794,7 @@ TEST(IOBuf, takeOwnershipUniquePtr) { ...@@ -792,11 +794,7 @@ TEST(IOBuf, takeOwnershipUniquePtr) {
} }
TEST(IOBuf, Alignment) { TEST(IOBuf, Alignment) {
// max_align_t doesn't exist in gcc 4.6.2 size_t alignment = alignof(std::max_align_t);
struct MaxAlign {
char c;
} __attribute__((__aligned__));
size_t alignment = alignof(MaxAlign);
std::vector<size_t> sizes {0, 1, 64, 256, 1024, 1 << 10}; std::vector<size_t> sizes {0, 1, 64, 256, 1024, 1 << 10};
for (size_t size : sizes) { for (size_t size : sizes) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment