commit 4088fcc146a689cfbf0b7338a7040b466daef717
parent 65a331c7f65b500ac45d7f33cfffec32d065bf74
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date: Sat, 30 Aug 2025 18:18:28 +0200
Implemented mhd_ALIGNED()
Diffstat:
| M | configure.ac | | | 135 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | src/mhd2/mhd_align.h | | | 66 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
2 files changed, 201 insertions(+), 0 deletions(-)
diff --git a/configure.ac b/configure.ac
@@ -1676,6 +1676,141 @@ AC_CACHE_CHECK([[for C11 'alignof()' support]], [[mhd_cv_c_alignof]],
AS_VAR_IF([mhd_cv_c_alignof], ["yes"],
[AC_DEFINE([[HAVE_C_ALIGNOF]], [1], [Define to 1 if your compiler supports 'alignof()'])])
+AC_CACHE_CHECK([whether $CC supports __attribute__((aligned ( )))],[mhd_cv_cc_attr_aligned],
+ [
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS} ${errattr_CFLAGS}"
+ AC_LINK_IFELSE(
+ [
+ AC_LANG_SOURCE(
+ [[
+int main(void)
+{
+ __attribute__((aligned (4))) signed char schr[1] = {0};
+ return schr[0];
+}
+ ]]
+ )
+ ],
+ [mhd_cv_cc_attr_aligned="yes"],[mhd_cv_cc_attr_aligned="no"]
+ )
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ ]
+)
+AS_VAR_IF([mhd_cv_cc_attr_aligned],["yes"],
+ [AC_DEFINE([[HAVE_ATTR_ALIGNED]], [1], [Define to 1 if compiler supports __attribute__((aligned (X)))])],
+ [
+ AC_CACHE_CHECK([whether $CC supports __declspec(align( )))],[mhd_cv_cc_declspec_align],
+ [
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS} ${errattr_CFLAGS}"
+ AC_LINK_IFELSE(
+ [
+ AC_LANG_SOURCE(
+ [[
+int main(void)
+{
+ __declspec(align(4))) signed char schr[1] = {0};
+ return schr[0];
+}
+ ]]
+ )
+ ],
+ [mhd_cv_cc_declspec_align="yes"],[mhd_cv_cc_declspec_align="no"]
+ )
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ ]
+ )
+ AS_VAR_IF([mhd_cv_cc_declspec_align],["yes"],
+ [AC_DEFINE([[HAVE_DECLSPEC_ALIGN]], [1], [Define to 1 if compiler supports __declspec(align(X)))])]
+ )
+ ]
+)
+AC_CACHE_CHECK([fo][r C11 alignas() support],[mhd_cv_c_alignas],
+ [
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS} ${errattr_CFLAGS}"
+ AC_LINK_IFELSE(
+ [
+ AC_LANG_SOURCE(
+ [[
+#ifdef HAVE_STDALIGN_H
+#if ! defined(__STDC_VERSION__) || (__STDC_VERSION__+0) < 202311
+#include <stdalign.h>
+#endif
+#endif
+
+int main(void)
+{
+ alignas(4) signed char schr[1] = {0};
+ alignas(int) signed char schr_var = 0;
+ return schr[0] + schr_var;
+}
+ ]]
+ )
+ ],
+ [mhd_cv_c_alignas="yes"],[mhd_cv_c_alignas="no"]
+ )
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ ]
+)
+AS_VAR_IF([mhd_cv_c_alignas],["yes"],
+ [AC_DEFINE([[HAVE_C_ALIGNAS]], [1], [Define to 1 if C11 alignas() is supported])]
+)
+AS_IF([test "x${mhd_cv_cc_attr_aligned}${mhd_cv_cc_declspec_align}${mhd_cv_c_alignas}" != "xnonono"],
+ [
+ AC_CACHE_CHECK([fo][r large alignment number supported],[mhd_cv_alignment_large_num],
+ [
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS} ${errattr_CFLAGS}"
+ MHD_SAVED_ac_c_werror_flag="$ac_c_werror_flag"
+ ac_c_werror_flag=yes
+ for mhd_cv_alignment_large_num in 65536 32768 16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1 0; do
+ AC_LINK_IFELSE(
+ [
+ AC_LANG_SOURCE(
+ [[
+#ifdef HAVE_STDALIGN_H
+#if ! defined(__STDC_VERSION__) || (__STDC_VERSION__+0) < 202311
+#include <stdalign.h>
+#endif
+#endif
+
+/* Priority for alignas() implementation as it should warn more */
+#ifdef HAVE_C_ALIGNAS
+#define test_alignas(x) alignas(x)
+#elif defined(HAVE_ATTR_ALIGNED)
+#define test_alignas(x) __attribute__((aligned (x)))
+#elif defined(HAVE_DECLSPEC_ALIGN)
+#define test_alignas(x) __declspec(align(x)))
+#else
+#error No alignas() implementation available
+choke me now
+#endif
+
+int main(void)
+{
+ test_alignas($mhd_cv_alignment_large_num) signed char ret = 0;
+ return ret;
+}
+ ]]
+ )
+ ],
+ [break
+ ]
+ )
+ done
+ ac_c_werror_flag="$MHD_SAVED_ac_c_werror_flag"
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ ]
+ )
+ AS_IF([test "$mhd_cv_alignment_large_num" -gt "1"],
+ [
+ AC_DEFINE_UNQUOTED([MHD_ALIGNMENT_LARGE_NUM],[$mhd_cv_alignment_large_num],
+ [Define to large enough number that is still supported as an alignment])
+ ]
+ ,
+ [AC_MSG_WARN([no supported aligment number can be detected])]
+ )
+ ]
+)
+
# Check system type
AC_MSG_CHECKING([[for target host OS]])
diff --git a/src/mhd2/mhd_align.h b/src/mhd2/mhd_align.h
@@ -97,4 +97,70 @@
#define mhd_UINT64_ALIGN mhd_ALIGNOF (uint_least32_t)
#define mhd_UINT_FAST32_ALIGN mhd_ALIGNOF (uint_fast32_t)
+
+#if defined(HAVE_ATTR_ALIGNED)
+# define mhd_ALIGNED(num) __attribute__((aligned (num)))
+#elif defined(HAVE_DECLSPEC_ALIGN)
+# define mhd_ALIGNED(num) __declspec(align (num)))
+#endif
+
+#ifdef HAVE_C_ALIGNAS
+# if ! defined(__STDC_VERSION__) || (__STDC_VERSION__ + 0) < 202311
+# ifdef HAVE_STDALIGN_H
+# include <stdalign.h>
+# endif /* HAVE_STDALIGN_H */
+# endif /* before C23 */
+# if defined(alignas) || defined(__alignas_is_defined) || \
+ (defined(__STDC_VERSION__) && (__STDC_VERSION__ + 0) >= 202311)
+# define mhd_ALIGNED_AS(type) alignas (type)
+# ifndef mhd_ALIGNED
+# define mhd_ALIGNED(num) alignas (num)
+# endif /* ! mhd_ALIGNED */
+# endif /* alignas || C23 or later */
+#endif /* ! HAVE_C_ALIGNAS */
+
+#ifndef mhd_ALIGNED
+# define mhd_ALIGNED(num) /* Empty fallback */
+#endif
+
+#ifndef mhd_ALIGNED_AS
+# define mhd_ALIGNED_AS(type) mhd_ALIGNED (mhd_ALIGNOF (type))
+#endif
+
+#if defined(MHD_ALIGNMENT_LARGE_NUM) && (MHD_ALIGNMENT_LARGE_NUM + 0) >= 8
+# define mhd_ALIGNED_8 mhd_ALIGNED (8)
+#else
+# define mhd_ALIGNED_8 mhd_ALIGNED_AS (void*)
+#endif
+
+#if defined(MHD_ALIGNMENT_LARGE_NUM) && (MHD_ALIGNMENT_LARGE_NUM + 0) >= 16
+# define mhd_ALIGNED_16 mhd_ALIGNED (16)
+#else
+# define mhd_ALIGNED_16 mhd_ALIGNED_8
+#endif
+
+#if defined(MHD_ALIGNMENT_LARGE_NUM) && (MHD_ALIGNMENT_LARGE_NUM + 0) >= 32
+# define mhd_ALIGNED_32 mhd_ALIGNED (32)
+#else
+# define mhd_ALIGNED_32 mhd_ALIGNED_16
+#endif
+
+#if defined(MHD_ALIGNMENT_LARGE_NUM) && (MHD_ALIGNMENT_LARGE_NUM + 0) >= 64
+# define mhd_ALIGNED_64 mhd_ALIGNED (64)
+#else
+# define mhd_ALIGNED_64 mhd_ALIGNED_32
+#endif
+
+#if defined(MHD_ALIGNMENT_LARGE_NUM) && (MHD_ALIGNMENT_LARGE_NUM + 0) >= 128
+# define mhd_ALIGNED_128 mhd_ALIGNED (128)
+#else
+# define mhd_ALIGNED_128 mhd_ALIGNED_64
+#endif
+
+#if defined(MHD_ALIGNMENT_LARGE_NUM) && (MHD_ALIGNMENT_LARGE_NUM + 0) >= 256
+# define mhd_ALIGNED_256 mhd_ALIGNED (256)
+#else
+# define mhd_ALIGNED_256 mhd_ALIGNED_128
+#endif
+
#endif /* ! MHD_ALIGN_H */