Add definition pg_attribute_aligned() for MSVC
Visual Studio 2015+ has support for a macro to control the alignement of structures as of __declspec(align(#)), and this commit adds a definition of pg_attribute_aligned() based on that. It happens that this was already used in the implementation of atomics for MSVC. Note that there is still no definition fo pg_attribute_packed(), so this does not impact itemptr.h. Author: James Coleman Discussion: https://postgr.es/m/CAAaqYe-HbtZvR3msoMtk+hYW2S0e0OapzMW8icSMYTMA+mN8Aw@mail.gmail.com
This commit is contained in:
parent
1c27d16e6e
commit
ec3c9cc202
@ -139,6 +139,8 @@ if test x"$pgac_cv__128bit_int" = xyes ; then
|
|||||||
/* This must match the corresponding code in c.h: */
|
/* This must match the corresponding code in c.h: */
|
||||||
#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
|
#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
|
||||||
#define pg_attribute_aligned(a) __attribute__((aligned(a)))
|
#define pg_attribute_aligned(a) __attribute__((aligned(a)))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define pg_attribute_aligned(a) __declspec(align(a))
|
||||||
#endif
|
#endif
|
||||||
typedef __int128 int128a
|
typedef __int128 int128a
|
||||||
#if defined(pg_attribute_aligned)
|
#if defined(pg_attribute_aligned)
|
||||||
|
2
configure
vendored
2
configure
vendored
@ -17462,6 +17462,8 @@ else
|
|||||||
/* This must match the corresponding code in c.h: */
|
/* This must match the corresponding code in c.h: */
|
||||||
#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
|
#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
|
||||||
#define pg_attribute_aligned(a) __attribute__((aligned(a)))
|
#define pg_attribute_aligned(a) __attribute__((aligned(a)))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define pg_attribute_aligned(a) __declspec(align(a))
|
||||||
#endif
|
#endif
|
||||||
typedef __int128 int128a
|
typedef __int128 int128a
|
||||||
#if defined(pg_attribute_aligned)
|
#if defined(pg_attribute_aligned)
|
||||||
|
@ -181,6 +181,17 @@
|
|||||||
#define pg_attribute_noreturn() __attribute__((noreturn))
|
#define pg_attribute_noreturn() __attribute__((noreturn))
|
||||||
#define pg_attribute_packed() __attribute__((packed))
|
#define pg_attribute_packed() __attribute__((packed))
|
||||||
#define HAVE_PG_ATTRIBUTE_NORETURN 1
|
#define HAVE_PG_ATTRIBUTE_NORETURN 1
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
/*
|
||||||
|
* MSVC supports aligned. noreturn is also possible but in MSVC it is
|
||||||
|
* declared before the definition while pg_attribute_noreturn() macro
|
||||||
|
* is currently used after the definition.
|
||||||
|
*
|
||||||
|
* Packing is also possible but only by wrapping the entire struct definition
|
||||||
|
* which doesn't fit into our current macro declarations.
|
||||||
|
*/
|
||||||
|
#define pg_attribute_aligned(a) __declspec(align(a))
|
||||||
|
#define pg_attribute_noreturn()
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
* NB: aligned and packed are not given default definitions because they
|
* NB: aligned and packed are not given default definitions because they
|
||||||
|
@ -39,7 +39,7 @@ typedef struct pg_atomic_uint32
|
|||||||
} pg_atomic_uint32;
|
} pg_atomic_uint32;
|
||||||
|
|
||||||
#define PG_HAVE_ATOMIC_U64_SUPPORT
|
#define PG_HAVE_ATOMIC_U64_SUPPORT
|
||||||
typedef struct __declspec(align(8)) pg_atomic_uint64
|
typedef struct pg_attribute_aligned(8) pg_atomic_uint64
|
||||||
{
|
{
|
||||||
volatile uint64 value;
|
volatile uint64 value;
|
||||||
} pg_atomic_uint64;
|
} pg_atomic_uint64;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user