• Paul Eggert's avatar
    Use alignas to fix GCALIGN-related bugs · b1573a97
    Paul Eggert authored
    Use alignas and unions to specify alignments of objects needing
    addresses that are at least a multiple of GCALIGNMENT.  Using
    these standard C facilities should be safer than relying on ad hoc
    and poorly-understood features like GCC’s __attribute__
    ((aligned (N))), the root cause for recent porting bugs like
    Bug#29040.  The alignas macro was standardized by C11 and Gnulib
    supports alignas for pre-C11 platforms.  I have tested this on Sun
    Studio 12 sparc (2007) and GCC 4.4.7 x86-64 (2012) as well as on
    more recent platforms like GCC 7.2.1 (2017) on Fedora 26 (both
    x86-64 and x86).
    * lib-src/make-docfile.c (close_emacs_globals): lispsym is now
    just an array of struct Lisp_Symbol, since struct Lisp_Symbol is
    now properly aligned.  All uses changed.
    * src/alloc.c (NEXT_FREE_LISP_STRING): Just use the new u.next
    member; this is simpler and safer than casting a pointer that
    might not be aligned properly.
    (aligned_Lisp_Symbol): Remove.  No longer needed, now that struct
    Lisp_Symbol is aligned properly.  All uses replaced with struct
    Lisp_Symbol.
    * src/lisp.h (GCALIGNED): Remove, as it does not work as expected:
    it can cause the natural alignment to be ignored.  All uses
    replaced by unions with a ‘char alignas (GCALIGNMENT)’ member as
    described below.
    (struct Lisp_Symbol, struct Lisp_Cons, struct Lisp_String):
    Change definition from ‘struct TAG { MEMBERS };’ to
    ‘struct TAG { union { struct { MEMBERS } s; char alignas
    (GCALIGNMENT) gcaligned; } u; };’.  This guarantees ‘struct TAG’
    to have an alignment that at least max (GCALIGNMENT, N) where N is
    its old alignment.  All uses like ‘PTR->MEMBER’ changed to
    ‘PTR->u.s.MEMBER’; these uses were supposed to be mostly private
    anyway.  Verify that the resulting ‘struct TAG’ is properly
    aligned for Emacs.
    (union vectorlike_header): New member ‘gcaligned’ to guarantee
    that this type, and its containing types like ‘struct Lisp_Subr’,
    ‘struct buffer’ and ‘struct thread_state’, are all properly
    aligned for Emacs.
    (struct Lisp_String): New union member ‘next’, for the benefit
    of NEXT_FREE_LISP_STRING.
    (union Aligned_Cons, union Aligned_String): Remove.  All uses
    replaced by struct Lisp_Cons and struct Lisp_String, since they
    are now properly aligned.
    (USE_STACK_CONS, USE_STACK_STRING): Simplify now that we can
    assume struct Lisp_Cons and struct Lisp_String are properly
    aligned.
    b1573a97
buffer.c 204 KB