summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier2022-09-21 01:11:23 +0000
committerMichael Paquier2022-09-21 01:11:23 +0000
commitec3c9cc202fb2749fce82483e6dc247cfe286cab (patch)
tree3de8933a2bdeb4af9950c26844efde71b0588949
parent1c27d16e6e5c1f463bbe1e9ece88dda811235165 (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.m42
-rwxr-xr-xconfigure2
-rw-r--r--src/include/c.h11
-rw-r--r--src/include/port/atomics/generic-msvc.h2
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)
diff --git a/configure b/configure
index b04d9c8e80..4efed743a1 100755
--- a/configure
+++ b/configure
@@ -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;