aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2018-09-06 19:17:14 -0700
committerPaul Eggert2018-09-06 23:56:13 -0700
commit2c8520e19c0fe72d046033e39953b7a0a87be24e (patch)
tree2ea12495ed8184e87108e17632ecd8c2ab02c8cf /src
parentbca35315e16cb53415649e5c0ac2ec0cc1368679 (diff)
downloademacs-2c8520e19c0fe72d046033e39953b7a0a87be24e.tar.gz
emacs-2c8520e19c0fe72d046033e39953b7a0a87be24e.zip
Shrink pseudovectors a bit
sizeof (struct Lisp_Marker) was 32 on x86, where 24 would do. Problem noted by Stefan Monnier in: https://lists.gnu.org/r/emacs-devel/2018-09/msg00165.html * src/bignum.h (struct Lisp_Bignum): * src/frame.h (struct frame): * src/lisp.h (struct Lisp_Vector, struct Lisp_Bool_Vector) (struct Lisp_Char_Table, struct Lisp_Hash_Table) (struct Lisp_Marker, struct Lisp_Overlay) (struct Lisp_Misc_Ptr, struct Lisp_User_Ptr) (struct Lisp_Finalizer, struct Lisp_Float) (struct Lisp_Module_Function): * src/process.h (struct Lisp_Process): * src/termhooks.h (struct terminal): * src/thread.h (struct thread_state, struct Lisp_Mutex) (struct Lisp_CondVar): * src/window.c (struct save_window_data): * src/window.h (struct window): * src/xterm.h (struct scroll_bar): * src/xwidget.h (struct xwidget, struct xwidget_view): Add GCALIGNED_STRUCT attribute. * src/lisp.h (GCALIGNED_UNION_MEMBER): Renamed from GCALIGNED_UNION. All uses changed. (GCALIGNED_STRUCT_MEMBER, GCALIGNED_STRUCT, GCALIGNED): New macros. All uses of open-coded GCALIGNED changed to use GCALIGNED. (union vectorlike_header): No longer GC-aligned. (PSEUDOVECSIZE): Yield 0 for pseudovectors without Lisp objects that place a member before where the first Lisp object member would be.
Diffstat (limited to 'src')
-rw-r--r--src/alloc.c8
-rw-r--r--src/bignum.h2
-rw-r--r--src/fileio.c4
-rw-r--r--src/frame.h2
-rw-r--r--src/keymap.c4
-rw-r--r--src/lisp.h90
-rw-r--r--src/process.h2
-rw-r--r--src/termhooks.h2
-rw-r--r--src/thread.h6
-rw-r--r--src/window.c2
-rw-r--r--src/window.h2
-rw-r--r--src/xterm.h2
-rw-r--r--src/xwidget.h4
13 files changed, 76 insertions, 54 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 28ca7804ee9..abb98a9eb68 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -641,9 +641,11 @@ buffer_memory_full (ptrdiff_t nbytes)
641 implement Lisp objects; since pseudovectors can contain any C type, 641 implement Lisp objects; since pseudovectors can contain any C type,
642 this is max_align_t. On recent GNU/Linux x86 and x86-64 this can 642 this is max_align_t. On recent GNU/Linux x86 and x86-64 this can
643 often waste up to 8 bytes, since alignof (max_align_t) is 16 but 643 often waste up to 8 bytes, since alignof (max_align_t) is 16 but
644 typical vectors need only an alignment of 8. However, it is not 644 typical vectors need only an alignment of 8. Although shrinking
645 worth the hassle to avoid this waste. */ 645 the alignment to 8 would save memory, it cost a 20% hit to Emacs
646enum { LISP_ALIGNMENT = alignof (union { max_align_t x; GCALIGNED_UNION }) }; 646 CPU performance on Fedora 28 x86-64 when compiled with gcc -m32. */
647enum { LISP_ALIGNMENT = alignof (union { max_align_t x;
648 GCALIGNED_UNION_MEMBER }) };
647verify (LISP_ALIGNMENT % GCALIGNMENT == 0); 649verify (LISP_ALIGNMENT % GCALIGNMENT == 0);
648 650
649/* True if malloc (N) is known to return storage suitably aligned for 651/* True if malloc (N) is known to return storage suitably aligned for
diff --git a/src/bignum.h b/src/bignum.h
index 0e38c615ee6..65515493436 100644
--- a/src/bignum.h
+++ b/src/bignum.h
@@ -39,7 +39,7 @@ struct Lisp_Bignum
39{ 39{
40 union vectorlike_header header; 40 union vectorlike_header header;
41 mpz_t value; 41 mpz_t value;
42}; 42} GCALIGNED_STRUCT;
43 43
44extern mpz_t mpz[4]; 44extern mpz_t mpz[4];
45 45
diff --git a/src/fileio.c b/src/fileio.c
index 66b23333172..5ca7c595f7d 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -3394,9 +3394,9 @@ union read_non_regular
3394 int fd; 3394 int fd;
3395 ptrdiff_t inserted, trytry; 3395 ptrdiff_t inserted, trytry;
3396 } s; 3396 } s;
3397 GCALIGNED_UNION 3397 GCALIGNED_UNION_MEMBER
3398}; 3398};
3399verify (alignof (union read_non_regular) % GCALIGNMENT == 0); 3399verify (GCALIGNED (union read_non_regular));
3400 3400
3401static Lisp_Object 3401static Lisp_Object
3402read_non_regular (Lisp_Object state) 3402read_non_regular (Lisp_Object state)
diff --git a/src/frame.h b/src/frame.h
index a3bb633e57a..ad7376a6531 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -578,7 +578,7 @@ struct frame
578 enum ns_appearance_type ns_appearance; 578 enum ns_appearance_type ns_appearance;
579 bool_bf ns_transparent_titlebar; 579 bool_bf ns_transparent_titlebar;
580#endif 580#endif
581}; 581} GCALIGNED_STRUCT;
582 582
583/* Most code should use these functions to set Lisp fields in struct frame. */ 583/* Most code should use these functions to set Lisp fields in struct frame. */
584 584
diff --git a/src/keymap.c b/src/keymap.c
index 52db7b491f9..79dce15a812 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -554,9 +554,9 @@ union map_keymap
554 Lisp_Object args; 554 Lisp_Object args;
555 void *data; 555 void *data;
556 } s; 556 } s;
557 GCALIGNED_UNION 557 GCALIGNED_UNION_MEMBER
558}; 558};
559verify (alignof (union map_keymap) % GCALIGNMENT == 0); 559verify (GCALIGNED (union map_keymap));
560 560
561static void 561static void
562map_keymap_char_table_item (Lisp_Object args, Lisp_Object key, Lisp_Object val) 562map_keymap_char_table_item (Lisp_Object args, Lisp_Object key, Lisp_Object val)
diff --git a/src/lisp.h b/src/lisp.h
index 78c25f97dc8..7e365e8f478 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -229,7 +229,7 @@ extern bool suppress_checking EXTERNALLY_VISIBLE;
229 USE_LSB_TAG not only requires the least 3 bits of pointers returned by 229 USE_LSB_TAG not only requires the least 3 bits of pointers returned by
230 malloc to be 0 but also needs to be able to impose a mult-of-8 alignment 230 malloc to be 0 but also needs to be able to impose a mult-of-8 alignment
231 on some non-GC Lisp_Objects, all of which are aligned via 231 on some non-GC Lisp_Objects, all of which are aligned via
232 GCALIGNED_UNION at the end of a union. */ 232 GCALIGNED_UNION_MEMBER, GCALIGNED_STRUCT_MEMBER, and GCALIGNED_STRUCT. */
233 233
234enum Lisp_Bits 234enum Lisp_Bits
235 { 235 {
@@ -282,7 +282,35 @@ error !;
282# define GCALIGNMENT 1 282# define GCALIGNMENT 1
283#endif 283#endif
284 284
285#define GCALIGNED_UNION char alignas (GCALIGNMENT) gcaligned; 285/* If a struct is always allocated by the GC and is therefore always
286 GC-aligned, put GCALIGNED_STRUCT after its closing '}'; this can
287 help the compiler generate better code.
288
289 To cause a union to have alignment of at least GCALIGNMENT, put
290 GCALIGNED_UNION_MEMBER in its member list. Similarly for a struct
291 and GCALIGNED_STRUCT_MEMBER, although this may make the struct a
292 bit bigger on non-GCC platforms. Any struct using
293 GCALIGNED_STRUCT_MEMBER should also use GCALIGNED_STRUCT.
294
295 Although these macros are reasonably portable, they are not
296 guaranteed on non-GCC platforms, as C11 does not require support
297 for alignment to GCALIGNMENT and older compilers may ignore
298 alignment requests. For any type T where garbage collection
299 requires alignment, use verify (GCALIGNED (T)) to verify the
300 requirement on the current platform. Types need this check if
301 their objects can be allocated outside the garbage collector. For
302 example, struct Lisp_Symbol needs the check because of lispsym and
303 struct Lisp_Cons needs it because of STACK_CONS. */
304
305#define GCALIGNED_UNION_MEMBER char alignas (GCALIGNMENT) gcaligned;
306#if HAVE_STRUCT_ATTRIBUTE_ALIGNED
307# define GCALIGNED_STRUCT_MEMBER
308# define GCALIGNED_STRUCT __attribute__ ((aligned (GCALIGNMENT)))
309#else
310# define GCALIGNED_STRUCT_MEMBER GCALIGNED_UNION_MEMBER
311# define GCALIGNED_STRUCT
312#endif
313#define GCALIGNED(type) (alignof (type) % GCALIGNMENT == 0)
286 314
287/* Lisp_Word is a scalar word suitable for holding a tagged pointer or 315/* Lisp_Word is a scalar word suitable for holding a tagged pointer or
288 integer. Usually it is a pointer to a deliberately-incomplete type 316 integer. Usually it is a pointer to a deliberately-incomplete type
@@ -751,10 +779,10 @@ struct Lisp_Symbol
751 /* Next symbol in obarray bucket, if the symbol is interned. */ 779 /* Next symbol in obarray bucket, if the symbol is interned. */
752 struct Lisp_Symbol *next; 780 struct Lisp_Symbol *next;
753 } s; 781 } s;
754 GCALIGNED_UNION 782 GCALIGNED_UNION_MEMBER
755 } u; 783 } u;
756}; 784};
757verify (alignof (struct Lisp_Symbol) % GCALIGNMENT == 0); 785verify (GCALIGNED (struct Lisp_Symbol));
758 786
759/* Declare a Lisp-callable function. The MAXARGS parameter has the same 787/* Declare a Lisp-callable function. The MAXARGS parameter has the same
760 meaning as in the DEFUN macro, and is used to construct a prototype. */ 788 meaning as in the DEFUN macro, and is used to construct a prototype. */
@@ -843,7 +871,9 @@ typedef EMACS_UINT Lisp_Word_tag;
843 and PSEUDOVECTORP cast their pointers to union vectorlike_header *, 871 and PSEUDOVECTORP cast their pointers to union vectorlike_header *,
844 because when two such pointers potentially alias, a compiler won't 872 because when two such pointers potentially alias, a compiler won't
845 incorrectly reorder loads and stores to their size fields. See 873 incorrectly reorder loads and stores to their size fields. See
846 Bug#8546. */ 874 Bug#8546. This union formerly contained more members, and there's
875 no compelling reason to change it to a struct merely because the
876 number of members has been reduced to one. */
847union vectorlike_header 877union vectorlike_header
848 { 878 {
849 /* The main member contains various pieces of information: 879 /* The main member contains various pieces of information:
@@ -866,20 +896,7 @@ union vectorlike_header
866 Current layout limits the pseudovectors to 63 PVEC_xxx subtypes, 896 Current layout limits the pseudovectors to 63 PVEC_xxx subtypes,
867 4095 Lisp_Objects in GC-ed area and 4095 word-sized other slots. */ 897 4095 Lisp_Objects in GC-ed area and 4095 word-sized other slots. */
868 ptrdiff_t size; 898 ptrdiff_t size;
869 /* Align the union so that there is no padding after it.
870 This is needed for the following reason:
871 If the alignment constraint of Lisp_Object is greater than the size of
872 vectorlike_header (e.g. with-wide-int), vectorlike objects which have
873 0 Lisp_Object fields and whose 1st field has a smaller alignment
874 constraint than Lisp_Object may end up with their 1st field "before
875 pseudovector index 0", in which case PSEUDOVECSIZE will return
876 a "negative" number. We could fix PSEUDOVECSIZE, but it's easier to
877 just force rounding up the size of vectorlike_header to the alignment
878 of Lisp_Object. */
879 Lisp_Object align;
880 GCALIGNED_UNION
881 }; 899 };
882verify (alignof (union vectorlike_header) % GCALIGNMENT == 0);
883 900
884INLINE bool 901INLINE bool
885(SYMBOLP) (Lisp_Object x) 902(SYMBOLP) (Lisp_Object x)
@@ -1251,10 +1268,10 @@ struct Lisp_Cons
1251 struct Lisp_Cons *chain; 1268 struct Lisp_Cons *chain;
1252 } u; 1269 } u;
1253 } s; 1270 } s;
1254 GCALIGNED_UNION 1271 GCALIGNED_UNION_MEMBER
1255 } u; 1272 } u;
1256}; 1273};
1257verify (alignof (struct Lisp_Cons) % GCALIGNMENT == 0); 1274verify (GCALIGNED (struct Lisp_Cons));
1258 1275
1259INLINE bool 1276INLINE bool
1260(NILP) (Lisp_Object x) 1277(NILP) (Lisp_Object x)
@@ -1373,10 +1390,10 @@ struct Lisp_String
1373 unsigned char *data; 1390 unsigned char *data;
1374 } s; 1391 } s;
1375 struct Lisp_String *next; 1392 struct Lisp_String *next;
1376 GCALIGNED_UNION 1393 GCALIGNED_UNION_MEMBER
1377 } u; 1394 } u;
1378}; 1395};
1379verify (alignof (struct Lisp_String) % GCALIGNMENT == 0); 1396verify (GCALIGNED (struct Lisp_String));
1380 1397
1381INLINE bool 1398INLINE bool
1382STRINGP (Lisp_Object x) 1399STRINGP (Lisp_Object x)
@@ -1507,7 +1524,7 @@ struct Lisp_Vector
1507 { 1524 {
1508 union vectorlike_header header; 1525 union vectorlike_header header;
1509 Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER]; 1526 Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER];
1510 }; 1527 } GCALIGNED_STRUCT;
1511 1528
1512INLINE bool 1529INLINE bool
1513(VECTORLIKEP) (Lisp_Object x) 1530(VECTORLIKEP) (Lisp_Object x)
@@ -1599,7 +1616,7 @@ struct Lisp_Bool_Vector
1599 The bits are in little-endian order in the bytes, and 1616 The bits are in little-endian order in the bytes, and
1600 the bytes are in little-endian order in the words. */ 1617 the bytes are in little-endian order in the words. */
1601 bits_word data[FLEXIBLE_ARRAY_MEMBER]; 1618 bits_word data[FLEXIBLE_ARRAY_MEMBER];
1602 }; 1619 } GCALIGNED_STRUCT;
1603 1620
1604/* Some handy constants for calculating sizes 1621/* Some handy constants for calculating sizes
1605 and offsets, mostly of vectorlike objects. */ 1622 and offsets, mostly of vectorlike objects. */
@@ -1765,7 +1782,8 @@ memclear (void *p, ptrdiff_t nbytes)
1765 ones that the GC needs to trace). */ 1782 ones that the GC needs to trace). */
1766 1783
1767#define PSEUDOVECSIZE(type, nonlispfield) \ 1784#define PSEUDOVECSIZE(type, nonlispfield) \
1768 ((offsetof (type, nonlispfield) - header_size) / word_size) 1785 (offsetof (type, nonlispfield) < header_size \
1786 ? 0 : (offsetof (type, nonlispfield) - header_size) / word_size)
1769 1787
1770/* Compute A OP B, using the unsigned comparison operator OP. A and B 1788/* Compute A OP B, using the unsigned comparison operator OP. A and B
1771 should be integer expressions. This is not the same as 1789 should be integer expressions. This is not the same as
@@ -1830,7 +1848,7 @@ struct Lisp_Char_Table
1830 1848
1831 /* These hold additional data. It is a vector. */ 1849 /* These hold additional data. It is a vector. */
1832 Lisp_Object extras[FLEXIBLE_ARRAY_MEMBER]; 1850 Lisp_Object extras[FLEXIBLE_ARRAY_MEMBER];
1833 }; 1851 } GCALIGNED_STRUCT;
1834 1852
1835INLINE bool 1853INLINE bool
1836CHAR_TABLE_P (Lisp_Object a) 1854CHAR_TABLE_P (Lisp_Object a)
@@ -1942,7 +1960,9 @@ struct Lisp_Subr
1942 const char *symbol_name; 1960 const char *symbol_name;
1943 const char *intspec; 1961 const char *intspec;
1944 EMACS_INT doc; 1962 EMACS_INT doc;
1945 }; 1963 GCALIGNED_STRUCT_MEMBER
1964 } GCALIGNED_STRUCT;
1965verify (GCALIGNED (struct Lisp_Subr));
1946 1966
1947INLINE bool 1967INLINE bool
1948SUBRP (Lisp_Object a) 1968SUBRP (Lisp_Object a)
@@ -2194,7 +2214,7 @@ struct Lisp_Hash_Table
2194 /* Next weak hash table if this is a weak hash table. The head 2214 /* Next weak hash table if this is a weak hash table. The head
2195 of the list is in weak_hash_tables. */ 2215 of the list is in weak_hash_tables. */
2196 struct Lisp_Hash_Table *next_weak; 2216 struct Lisp_Hash_Table *next_weak;
2197}; 2217} GCALIGNED_STRUCT;
2198 2218
2199 2219
2200INLINE bool 2220INLINE bool
@@ -2313,7 +2333,7 @@ struct Lisp_Marker
2313 used to implement the functionality of markers, but rather to (ab)use 2333 used to implement the functionality of markers, but rather to (ab)use
2314 markers as a cache for char<->byte mappings). */ 2334 markers as a cache for char<->byte mappings). */
2315 ptrdiff_t bytepos; 2335 ptrdiff_t bytepos;
2316}; 2336} GCALIGNED_STRUCT;
2317 2337
2318/* START and END are markers in the overlay's buffer, and 2338/* START and END are markers in the overlay's buffer, and
2319 PLIST is the overlay's property list. */ 2339 PLIST is the overlay's property list. */
@@ -2335,13 +2355,13 @@ struct Lisp_Overlay
2335 Lisp_Object end; 2355 Lisp_Object end;
2336 Lisp_Object plist; 2356 Lisp_Object plist;
2337 struct Lisp_Overlay *next; 2357 struct Lisp_Overlay *next;
2338 }; 2358 } GCALIGNED_STRUCT;
2339 2359
2340struct Lisp_Misc_Ptr 2360struct Lisp_Misc_Ptr
2341 { 2361 {
2342 union vectorlike_header header; 2362 union vectorlike_header header;
2343 void *pointer; 2363 void *pointer;
2344 }; 2364 } GCALIGNED_STRUCT;
2345 2365
2346extern Lisp_Object make_misc_ptr (void *); 2366extern Lisp_Object make_misc_ptr (void *);
2347 2367
@@ -2388,7 +2408,7 @@ struct Lisp_User_Ptr
2388 union vectorlike_header header; 2408 union vectorlike_header header;
2389 void (*finalizer) (void *); 2409 void (*finalizer) (void *);
2390 void *p; 2410 void *p;
2391}; 2411} GCALIGNED_STRUCT;
2392#endif 2412#endif
2393 2413
2394/* A finalizer sentinel. */ 2414/* A finalizer sentinel. */
@@ -2404,7 +2424,7 @@ struct Lisp_Finalizer
2404 /* Circular list of all active weak references. */ 2424 /* Circular list of all active weak references. */
2405 struct Lisp_Finalizer *prev; 2425 struct Lisp_Finalizer *prev;
2406 struct Lisp_Finalizer *next; 2426 struct Lisp_Finalizer *next;
2407 }; 2427 } GCALIGNED_STRUCT;
2408 2428
2409INLINE bool 2429INLINE bool
2410FINALIZERP (Lisp_Object x) 2430FINALIZERP (Lisp_Object x)
@@ -2616,7 +2636,7 @@ struct Lisp_Float
2616 double data; 2636 double data;
2617 struct Lisp_Float *chain; 2637 struct Lisp_Float *chain;
2618 } u; 2638 } u;
2619 }; 2639 } GCALIGNED_STRUCT;
2620 2640
2621INLINE bool 2641INLINE bool
2622(FLOATP) (Lisp_Object x) 2642(FLOATP) (Lisp_Object x)
@@ -3946,7 +3966,7 @@ struct Lisp_Module_Function
3946 ptrdiff_t min_arity, max_arity; 3966 ptrdiff_t min_arity, max_arity;
3947 emacs_subr subr; 3967 emacs_subr subr;
3948 void *data; 3968 void *data;
3949}; 3969} GCALIGNED_STRUCT;
3950 3970
3951INLINE bool 3971INLINE bool
3952MODULE_FUNCTIONP (Lisp_Object o) 3972MODULE_FUNCTIONP (Lisp_Object o)
diff --git a/src/process.h b/src/process.h
index 6bc22146a72..3c6dd7b91f4 100644
--- a/src/process.h
+++ b/src/process.h
@@ -203,7 +203,7 @@ struct Lisp_Process
203 bool_bf gnutls_p : 1; 203 bool_bf gnutls_p : 1;
204 bool_bf gnutls_complete_negotiation_p : 1; 204 bool_bf gnutls_complete_negotiation_p : 1;
205#endif 205#endif
206}; 206 } GCALIGNED_STRUCT;
207 207
208INLINE bool 208INLINE bool
209PROCESSP (Lisp_Object a) 209PROCESSP (Lisp_Object a)
diff --git a/src/termhooks.h b/src/termhooks.h
index 8b5f648b43d..211429169ba 100644
--- a/src/termhooks.h
+++ b/src/termhooks.h
@@ -661,7 +661,7 @@ struct terminal
661 frames on the terminal when it calls this hook, so infinite 661 frames on the terminal when it calls this hook, so infinite
662 recursion is prevented. */ 662 recursion is prevented. */
663 void (*delete_terminal_hook) (struct terminal *); 663 void (*delete_terminal_hook) (struct terminal *);
664}; 664} GCALIGNED_STRUCT;
665 665
666INLINE bool 666INLINE bool
667TERMINALP (Lisp_Object a) 667TERMINALP (Lisp_Object a)
diff --git a/src/thread.h b/src/thread.h
index 8ecb00824df..28d8d864fb4 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -184,7 +184,7 @@ struct thread_state
184 184
185 /* Threads are kept on a linked list. */ 185 /* Threads are kept on a linked list. */
186 struct thread_state *next_thread; 186 struct thread_state *next_thread;
187}; 187} GCALIGNED_STRUCT;
188 188
189INLINE bool 189INLINE bool
190THREADP (Lisp_Object a) 190THREADP (Lisp_Object a)
@@ -231,7 +231,7 @@ struct Lisp_Mutex
231 231
232 /* The lower-level mutex object. */ 232 /* The lower-level mutex object. */
233 lisp_mutex_t mutex; 233 lisp_mutex_t mutex;
234}; 234} GCALIGNED_STRUCT;
235 235
236INLINE bool 236INLINE bool
237MUTEXP (Lisp_Object a) 237MUTEXP (Lisp_Object a)
@@ -265,7 +265,7 @@ struct Lisp_CondVar
265 265
266 /* The lower-level condition variable object. */ 266 /* The lower-level condition variable object. */
267 sys_cond_t cond; 267 sys_cond_t cond;
268}; 268} GCALIGNED_STRUCT;
269 269
270INLINE bool 270INLINE bool
271CONDVARP (Lisp_Object a) 271CONDVARP (Lisp_Object a)
diff --git a/src/window.c b/src/window.c
index d4fc5568a5a..04de9656809 100644
--- a/src/window.c
+++ b/src/window.c
@@ -6268,7 +6268,7 @@ struct save_window_data
6268 /* These are currently unused. We need them as soon as we convert 6268 /* These are currently unused. We need them as soon as we convert
6269 to pixels. */ 6269 to pixels. */
6270 int frame_menu_bar_height, frame_tool_bar_height; 6270 int frame_menu_bar_height, frame_tool_bar_height;
6271 }; 6271 } GCALIGNED_STRUCT;
6272 6272
6273/* This is saved as a Lisp_Vector. */ 6273/* This is saved as a Lisp_Vector. */
6274struct saved_window 6274struct saved_window
diff --git a/src/window.h b/src/window.h
index 013083eb9a8..cc0b6b6667d 100644
--- a/src/window.h
+++ b/src/window.h
@@ -400,7 +400,7 @@ struct window
400 /* Z_BYTE - buffer position of the last glyph in the current matrix of W. 400 /* Z_BYTE - buffer position of the last glyph in the current matrix of W.
401 Should be nonnegative, and only valid if window_end_valid is true. */ 401 Should be nonnegative, and only valid if window_end_valid is true. */
402 ptrdiff_t window_end_bytepos; 402 ptrdiff_t window_end_bytepos;
403 }; 403 } GCALIGNED_STRUCT;
404 404
405INLINE bool 405INLINE bool
406WINDOWP (Lisp_Object a) 406WINDOWP (Lisp_Object a)
diff --git a/src/xterm.h b/src/xterm.h
index 1849a5c9535..2ea8a93f8c1 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -937,7 +937,7 @@ struct scroll_bar
937 937
938 /* True if the scroll bar is horizontal. */ 938 /* True if the scroll bar is horizontal. */
939 bool horizontal; 939 bool horizontal;
940}; 940} GCALIGNED_STRUCT;
941 941
942/* Turning a lisp vector value into a pointer to a struct scroll_bar. */ 942/* Turning a lisp vector value into a pointer to a struct scroll_bar. */
943#define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec)) 943#define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec))
diff --git a/src/xwidget.h b/src/xwidget.h
index 89fc7ff4586..c203d4f60cd 100644
--- a/src/xwidget.h
+++ b/src/xwidget.h
@@ -61,7 +61,7 @@ struct xwidget
61 61
62 /* Kill silently if Emacs is exited. */ 62 /* Kill silently if Emacs is exited. */
63 bool_bf kill_without_query : 1; 63 bool_bf kill_without_query : 1;
64}; 64} GCALIGNED_STRUCT;
65 65
66struct xwidget_view 66struct xwidget_view
67{ 67{
@@ -88,7 +88,7 @@ struct xwidget_view
88 int clip_left; 88 int clip_left;
89 89
90 long handler_id; 90 long handler_id;
91}; 91} GCALIGNED_STRUCT;
92#endif 92#endif
93 93
94/* Test for xwidget pseudovector. */ 94/* Test for xwidget pseudovector. */