1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
From: David Rheinsberg <david.rheinsberg@gmail.com>
Date: Wed, 18 May 2022 11:31:45 +0200
Subject: c-rbtree: fix alignment assertion on m64k
We want to assert that our alignment-guarantees do not exceed the
guarantees of the system-linker or system-allocator on the target
platform. Hence, we check against max_align_t. This is a lower bound,
but not the exact check we actually want. And as it turns out, on m64k
it is too low. Add a static check against 4-byte alignment for m64k as
a workaround.
Reported-by: Michael Biebl
Signed-off-by: David Rheinsberg <david.rheinsberg@gmail.com>
https://github.com/c-util/c-rbtree/issues/9
https://github.com/c-util/c-rbtree/commit/eb778d39694a0f3389f2438bbc45fb21685a047d
(cherry picked from commit 78831d127fa169b26783ccaa6b534edfbb0adad4)
(cherry picked from commit a83c884fb6e13aad783d547691620d43bed4db84)
---
src/c-rbtree/src/c-rbtree.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/src/c-rbtree/src/c-rbtree.c b/src/c-rbtree/src/c-rbtree.c
index 2f0e608..28de4d9 100644
--- a/src/c-rbtree/src/c-rbtree.c
+++ b/src/c-rbtree/src/c-rbtree.c
@@ -35,12 +35,25 @@
* CRBNode is 4-byte aligned, so the lower 2 bits are actually unused. We also
* sometimes store a pointer to the root-node, so make sure this one is also 4
* byte aligned.
- * Note that there are actually some architectures where `max_align_t` is 4, so
- * we do not have much wiggle-room to extend this flag-set.
+ *
+ * Additionally, we want to avoid an alignment that is bigger than the
+ * alignment guaranteed by the system allocator or supported by the system
+ * linker. As there is no standard way to check this, we simply verify against
+ * `alignof(max_align_t)`, as this alignment must be supported by the
+ * toolchain.
+ *
+ * m64k is special here, as it only has a 2-byte max-alignment, but still
+ * guarantees a >=4-byte alignment on allocations. So hard-code the maximum for
+ * it.
*/
-static_assert(alignof(CRBNode) <= alignof(max_align_t), "Invalid RBNode alignment");
+#ifdef __m68k__
+# define C_RBTREE_MAX_ALIGN (C_MAX(4, alignof(max_align_t)))
+#else
+# define C_RBTREE_MAX_ALIGN (alignof(max_align_t))
+#endif
+static_assert(alignof(CRBNode) <= C_RBTREE_MAX_ALIGN, "Invalid RBNode alignment");
static_assert(alignof(CRBNode) >= 4, "Invalid CRBNode alignment");
-static_assert(alignof(CRBTree) <= alignof(max_align_t), "Invalid RBTree alignment");
+static_assert(alignof(CRBTree) <= C_RBTREE_MAX_ALIGN, "Invalid RBTree alignment");
static_assert(alignof(CRBTree) >= 4, "Invalid CRBTree alignment");
/**
|