From 9e59de9449b53c3ecd85b624c11360ba9cafee75 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 8 Nov 2017 19:11:18 -0800 Subject: [PATCH] Use GCALIGNED properly for GCC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apparently GCC requires that ‘__attribute__ ((aligned (8)))’ must immediately follow the ‘struct’ keyword when aligning a structure. The attribute silently does not work if it follows a tag after the ‘struct’ keyword. Who knew? Anyway, this patch is designed to fix a SIGSEGV problem reported by John Mastro (Bug#29183). * lib-src/make-docfile.c (close_emacs_globals): * src/buffer.c (buffer_defaults, buffer_local_symbols): * src/lisp.h (DEFUN): * src/thread.c (main_thread): Put 'GCALIGNED' immediately after 'struct'. --- lib-src/make-docfile.c | 2 +- src/buffer.c | 4 ++-- src/lisp.h | 16 ++++++++++------ src/thread.c | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib-src/make-docfile.c b/lib-src/make-docfile.c index 0ea3f7b..ff84df9 100644 --- a/lib-src/make-docfile.c +++ b/lib-src/make-docfile.c @@ -668,7 +668,7 @@ close_emacs_globals (ptrdiff_t num_symbols) "extern\n" "#endif\n" "struct {\n" - " struct Lisp_Symbol GCALIGNED s;\n" + " struct GCALIGNED Lisp_Symbol s;\n" "} lispsym[%td];\n"), num_symbols); } diff --git a/src/buffer.c b/src/buffer.c index 15735a2..edeed55 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -61,7 +61,7 @@ struct buffer *all_buffers; Setting the default value also goes through the alist of buffers and stores into each buffer that does not say it has a local value. */ -struct buffer GCALIGNED buffer_defaults; +struct GCALIGNED buffer buffer_defaults; /* This structure marks which slots in a buffer have corresponding default values in buffer_defaults. @@ -84,7 +84,7 @@ struct buffer buffer_local_flags; /* This structure holds the names of symbols whose values may be buffer-local. It is indexed and accessed in the same way as the above. */ -struct buffer GCALIGNED buffer_local_symbols; +struct GCALIGNED buffer buffer_local_symbols; /* Return the symbol of the per-buffer variable at offset OFFSET in the buffer structure. */ diff --git a/src/lisp.h b/src/lisp.h index 4dd4720..0153468 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -277,10 +277,14 @@ DEFINE_GDB_SYMBOL_END (VALMASK) error !; #endif -/* Declare an object to have an address that is a multiple of - GCALIGNMENT. This is a no-op if the object's natural alignment is - already a multiple of GCALIGNMENT. alignas is not suitable here, - as it fails if the object's natural alignment exceeds GCALIGNMENT. */ +/* Use GCALIGNED immediately after the 'struct' keyword to require the + struct to have an address that is a multiple of GCALIGNMENT. This + is a no-op if the struct's natural alignment is already a multiple + of GCALIGNMENT. GCALIGNED's implementation uses the 'aligned' + attribute instead of 'alignas (GCALIGNMENT)', as the latter would + fail if an object's natural alignment exceeds GCALIGNMENT. The + implementation hopes that natural alignment suffices on platforms + lacking 'aligned'. */ #ifdef HAVE_STRUCT_ATTRIBUTE_ALIGNED # define GCALIGNED __attribute__ ((aligned (GCALIGNMENT))) #else @@ -2944,7 +2948,7 @@ CHECK_NUMBER_CDR (Lisp_Object x) #ifdef _MSC_VER #define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) \ Lisp_Object fnname DEFUN_ARGS_ ## maxargs ; \ - static struct Lisp_Subr GCALIGNED sname = \ + static struct GCALIGNED Lisp_Subr sname = \ { { (PVEC_SUBR << PSEUDOVECTOR_AREA_BITS) \ | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)) }, \ { (Lisp_Object (__cdecl *)(void))fnname }, \ @@ -2952,7 +2956,7 @@ CHECK_NUMBER_CDR (Lisp_Object x) Lisp_Object fnname #else /* not _MSC_VER */ #define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) \ - static struct Lisp_Subr GCALIGNED sname = \ + static struct GCALIGNED Lisp_Subr sname = \ { { PVEC_SUBR << PSEUDOVECTOR_AREA_BITS }, \ { .a ## maxargs = fnname }, \ minargs, maxargs, lname, intspec, 0}; \ diff --git a/src/thread.c b/src/thread.c index 03f5b31..7335833 100644 --- a/src/thread.c +++ b/src/thread.c @@ -26,7 +26,7 @@ along with GNU Emacs. If not, see . */ #include "coding.h" #include "syssignal.h" -static struct thread_state GCALIGNED main_thread; +static struct GCALIGNED thread_state main_thread; struct thread_state *current_thread = &main_thread; -- 2.7.4