]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
libiberty: Account for CHERI alignment requirement in objalloc
authorAlex Coplan <alex.coplan@arm.com>
Thu, 3 Nov 2022 12:11:45 +0000 (12:11 +0000)
committerAlex Coplan <alex.coplan@arm.com>
Thu, 3 Nov 2022 12:11:45 +0000 (12:11 +0000)
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

index 3d86dcca69c0763d71f390998d51e3078090e52e..23fb3f25ba3cac10e2060560376f25b7568c4b43 100644 (file)
@@ -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.  */