diff options
author | Michael Paquier | 2022-09-21 01:11:23 +0000 |
---|---|---|
committer | Michael Paquier | 2022-09-21 01:11:23 +0000 |
commit | ec3c9cc202fb2749fce82483e6dc247cfe286cab (patch) | |
tree | 3de8933a2bdeb4af9950c26844efde71b0588949 | |
parent | 1c27d16e6e5c1f463bbe1e9ece88dda811235165 (diff) |
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
-rw-r--r-- | config/c-compiler.m4 | 2 | ||||
-rwxr-xr-x | configure | 2 | ||||
-rw-r--r-- | src/include/c.h | 11 | ||||
-rw-r--r-- | src/include/port/atomics/generic-msvc.h | 2 |
4 files changed, 16 insertions, 1 deletions
diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index 69efc5bb10..000b075312 100644 --- a/config/c-compiler.m4 +++ b/config/c-compiler.m4 @@ -139,6 +139,8 @@ if test x"$pgac_cv__128bit_int" = xyes ; then /* This must match the corresponding code in c.h: */ #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__) #define pg_attribute_aligned(a) __attribute__((aligned(a))) +#elif defined(_MSC_VER) +#define pg_attribute_aligned(a) __declspec(align(a)) #endif typedef __int128 int128a #if defined(pg_attribute_aligned) @@ -17462,6 +17462,8 @@ else /* This must match the corresponding code in c.h: */ #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__) #define pg_attribute_aligned(a) __attribute__((aligned(a))) +#elif defined(_MSC_VER) +#define pg_attribute_aligned(a) __declspec(align(a)) #endif typedef __int128 int128a #if defined(pg_attribute_aligned) diff --git a/src/include/c.h b/src/include/c.h index 101ba41331..c8f72e44d8 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -181,6 +181,17 @@ #define pg_attribute_noreturn() __attribute__((noreturn)) #define pg_attribute_packed() __attribute__((packed)) #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 /* * NB: aligned and packed are not given default definitions because they diff --git a/src/include/port/atomics/generic-msvc.h b/src/include/port/atomics/generic-msvc.h index 1a4adfde68..f3091b9731 100644 --- a/src/include/port/atomics/generic-msvc.h +++ b/src/include/port/atomics/generic-msvc.h @@ -39,7 +39,7 @@ typedef struct pg_atomic_uint32 } pg_atomic_uint32; #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; } pg_atomic_uint64; |