diff --git mfbt/Alignment.h mfbt/Alignment.h index e0843ca..353ec36 100644 --- mozilla/mfbt/Alignment.h +++ mozilla/mfbt/Alignment.h @@ -15,6 +15,13 @@ namespace mozilla { +#if defined(MOZ_HAVE_CXX11_ALIGNAS) +#define MOZ_ALIGNOF(T) alignof(T) +#elif defined(__GNUC__) +#define MOZ_ALIGNOF(T) __alignof__(T) +#elif defined(_MSC_VER) +#define MOZ_ALIGNOF(T) __alignof(T) +#else /* * This class, and the corresponding macro MOZ_ALIGNOF, figures out how many * bytes of alignment a given type needs. @@ -32,6 +41,7 @@ public: }; #define MOZ_ALIGNOF(T) mozilla::AlignmentFinder::alignment +#endif /* * Declare the MOZ_ALIGNED_DECL macro for declaring aligned types. @@ -43,7 +53,10 @@ public: * will declare a two-character array |arr| aligned to 8 bytes. */ -#if defined(__GNUC__) +#if defined(MOZ_HAVE_CXX11_ALIGNAS) +# define MOZ_ALIGNED_DECL(_type, _align) \ + alignas(_align) _type +#elif defined(__GNUC__) # define MOZ_ALIGNED_DECL(_type, _align) \ _type __attribute__((aligned(_align))) #elif defined(_MSC_VER) diff --git mfbt/Attributes.h mfbt/Attributes.h index d317766..ddb13da 100644 --- mozilla/mfbt/Attributes.h +++ mozilla/mfbt/Attributes.h @@ -50,6 +50,7 @@ * don't indicate support for them here, due to * http://stackoverflow.com/questions/20498142/visual-studio-2013-explicit-keyword-bug */ +# define MOZ_HAVE_CXX11_ALIGNAS # define MOZ_HAVE_NEVER_INLINE __declspec(noinline) # define MOZ_HAVE_NORETURN __declspec(noreturn) # ifdef __clang__ @@ -70,6 +71,9 @@ # ifndef __has_extension # define __has_extension __has_feature /* compatibility, for older versions of clang */ # endif +# if __has_extension(cxx_alignas) +# define MOZ_HAVE_CXX11_ALIGNAS +# endif # if __has_extension(cxx_constexpr) # define MOZ_HAVE_CXX11_CONSTEXPR # endif @@ -86,6 +90,7 @@ # if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L # define MOZ_HAVE_CXX11_CONSTEXPR # if MOZ_GCC_VERSION_AT_LEAST(4, 8, 0) +# define MOZ_HAVE_CXX11_ALIGNAS # define MOZ_HAVE_CXX11_CONSTEXPR_IN_TEMPLATES # endif # define MOZ_HAVE_EXPLICIT_CONVERSION