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 {
"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];
......
......@@ -17,6 +17,8 @@
#ifndef FOLLY_PORTABILITY_H_
#define FOLLY_PORTABILITY_H_
#include <cstddef>
#ifndef FOLLY_NO_CONFIG
#include <folly/folly-config.h>
#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. */
......
......@@ -112,7 +112,7 @@ struct IOBuf::HeapFullStorage {
HeapStorage hs;
SharedInfo shared;
MaxAlign align;
std::max_align_t align;
};
IOBuf::SharedInfo::SharedInfo()
......
......@@ -24,6 +24,8 @@
#include <folly/Malloc.h>
#include <folly/Range.h>
#include <cstddef>
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<size_t> sizes {0, 1, 64, 256, 1024, 1 << 10};
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