From fb1ff58603dd0ebc184b0e07c0628c6eb746c491 Mon Sep 17 00:00:00 2001 From: Alex Coplan Date: Thu, 3 Nov 2022 12:11:45 +0000 Subject: [PATCH] libiberty: Account for CHERI alignment requirement in objalloc The calculation of OBJALLOC_ALIGN in include/objalloc.h ensures that allocations are sufficiently aligned for doubles, but on CHERI architectures it is possible that void * has a greater alignment requirement than double. Instead of deriving the alignment requirement from double alone, this patch uses a union to compute the maximum alignment between double and void *. This fixes alignment faults seen when compiling the binutils for pure-capability Morello. With this patch applied, the majority of binutils tests pass when the binutils themselves are compiled for purecap. This patch is a backport of commit a8af417a8a1559a3ebceb0c761cf26ebce5eab7f, initially upstreamed to Morello GCC. --- include/objalloc.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/include/objalloc.h b/include/objalloc.h index 3d86dcca69c..23fb3f25ba3 100644 --- a/include/objalloc.h +++ b/include/objalloc.h @@ -50,7 +50,13 @@ struct objalloc /* Work out the required alignment. */ -struct objalloc_align { char x; double d; }; +struct objalloc_align { + char x; + union { + double d; + void *p; + } u; +}; #if defined (__STDC__) && __STDC__ #ifndef offsetof @@ -60,7 +66,7 @@ struct objalloc_align { char x; double d; }; #ifndef offsetof #define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) #endif -#define OBJALLOC_ALIGN offsetof (struct objalloc_align, d) +#define OBJALLOC_ALIGN offsetof (struct objalloc_align, u) /* Create an objalloc structure. Returns NULL if malloc fails. */ -- 2.39.2