From 75311e2f9aabd1e4775176e9adff5cd5f1fe42aa Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Fri, 19 Apr 2024 15:44:36 -0400 Subject: config: Check for max_align_t --- config/header.mk | 1 + config/max-align-t.c | 8 ++++++++ src/prelude.h | 19 +++++++++++++++---- 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 config/max-align-t.c diff --git a/config/header.mk b/config/header.mk index 86a4dc5..bba03ef 100644 --- a/config/header.mk +++ b/config/header.mk @@ -18,6 +18,7 @@ HEADERS := \ ${GEN}/getdents64-syscall.h \ ${GEN}/getprogname.h \ ${GEN}/getprogname-gnu.h \ + ${GEN}/max-align-t.h \ ${GEN}/pipe2.h \ ${GEN}/posix-spawn-addfchdir.h \ ${GEN}/posix-spawn-addfchdir-np.h \ diff --git a/config/max-align-t.c b/config/max-align-t.c new file mode 100644 index 0000000..96165ce --- /dev/null +++ b/config/max-align-t.c @@ -0,0 +1,8 @@ +// Copyright © Tavian Barnes +// SPDX-License-Identifier: 0BSD + +#include + +int main(void) { + return _Alignof(max_align_t); +} diff --git a/src/prelude.h b/src/prelude.h index a23b167..390666b 100644 --- a/src/prelude.h +++ b/src/prelude.h @@ -181,15 +181,26 @@ extern const char bfs_version[]; # define TRUE_SHARING_SIZE 64 #endif +/** + * Polyfill max_align_t if we don't already have it. + */ +#if !BFS_HAS_MAX_ALIGN_T +typedef union { +# ifdef __BIGGEST_ALIGNMENT__ + alignas(__BIGGEST_ALIGNMENT__) char c; +# else + long double ld; + long long ll; + void *ptr; +# endif +} max_align_t; +#endif + /** * Alignment specifier that avoids false sharing. */ #define cache_align alignas(FALSE_SHARING_SIZE) -#if __COSMOPOLITAN__ -typedef long double max_align_t; -#endif - // Wrappers for attributes /** -- cgit v1.2.3