libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

commit 4088fcc146a689cfbf0b7338a7040b466daef717
parent 65a331c7f65b500ac45d7f33cfffec32d065bf74
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Sat, 30 Aug 2025 18:18:28 +0200

Implemented mhd_ALIGNED()

Diffstat:
Mconfigure.ac | 135+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/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 */