[gcc(refs/vendors/ARM/heads/morello)] libiberty: Account for CHERI alignment requirement in objalloc

Alex Coplan acoplan@gcc.gnu.org
Tue Nov 1 12:57:41 GMT 2022


https://gcc.gnu.org/g:a8af417a8a1559a3ebceb0c761cf26ebce5eab7f

commit a8af417a8a1559a3ebceb0c761cf26ebce5eab7f
Author: Alex Coplan <alex.coplan@arm.com>
Date:   Tue Nov 1 12:54:03 2022 +0000

    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.
    
    We are upstreaming this patch to GCC first since GCC is the canonical
    upstream for libiberty, but the patch is currently motivated mainly by
    binutils.

Diff:
---
 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.  */


More information about the Gcc-cvs mailing list