diff options
| author | Paul Eggert | 2018-09-06 19:17:14 -0700 |
|---|---|---|
| committer | Paul Eggert | 2018-09-06 23:56:13 -0700 |
| commit | 2c8520e19c0fe72d046033e39953b7a0a87be24e (patch) | |
| tree | 2ea12495ed8184e87108e17632ecd8c2ab02c8cf /src | |
| parent | bca35315e16cb53415649e5c0ac2ec0cc1368679 (diff) | |
| download | emacs-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.c | 8 | ||||
| -rw-r--r-- | src/bignum.h | 2 | ||||
| -rw-r--r-- | src/fileio.c | 4 | ||||
| -rw-r--r-- | src/frame.h | 2 | ||||
| -rw-r--r-- | src/keymap.c | 4 | ||||
| -rw-r--r-- | src/lisp.h | 90 | ||||
| -rw-r--r-- | src/process.h | 2 | ||||
| -rw-r--r-- | src/termhooks.h | 2 | ||||
| -rw-r--r-- | src/thread.h | 6 | ||||
| -rw-r--r-- | src/window.c | 2 | ||||
| -rw-r--r-- | src/window.h | 2 | ||||
| -rw-r--r-- | src/xterm.h | 2 | ||||
| -rw-r--r-- | src/xwidget.h | 4 |
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 |
| 646 | enum { LISP_ALIGNMENT = alignof (union { max_align_t x; GCALIGNED_UNION }) }; | 646 | CPU performance on Fedora 28 x86-64 when compiled with gcc -m32. */ |
| 647 | enum { LISP_ALIGNMENT = alignof (union { max_align_t x; | ||
| 648 | GCALIGNED_UNION_MEMBER }) }; | ||
| 647 | verify (LISP_ALIGNMENT % GCALIGNMENT == 0); | 649 | verify (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 | ||
| 44 | extern mpz_t mpz[4]; | 44 | extern 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 | }; |
| 3399 | verify (alignof (union read_non_regular) % GCALIGNMENT == 0); | 3399 | verify (GCALIGNED (union read_non_regular)); |
| 3400 | 3400 | ||
| 3401 | static Lisp_Object | 3401 | static Lisp_Object |
| 3402 | read_non_regular (Lisp_Object state) | 3402 | read_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 | }; |
| 559 | verify (alignof (union map_keymap) % GCALIGNMENT == 0); | 559 | verify (GCALIGNED (union map_keymap)); |
| 560 | 560 | ||
| 561 | static void | 561 | static void |
| 562 | map_keymap_char_table_item (Lisp_Object args, Lisp_Object key, Lisp_Object val) | 562 | map_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 | ||
| 234 | enum Lisp_Bits | 234 | enum 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 | }; |
| 757 | verify (alignof (struct Lisp_Symbol) % GCALIGNMENT == 0); | 785 | verify (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. */ | ||
| 847 | union vectorlike_header | 877 | union 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 | }; |
| 882 | verify (alignof (union vectorlike_header) % GCALIGNMENT == 0); | ||
| 883 | 900 | ||
| 884 | INLINE bool | 901 | INLINE 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 | }; |
| 1257 | verify (alignof (struct Lisp_Cons) % GCALIGNMENT == 0); | 1274 | verify (GCALIGNED (struct Lisp_Cons)); |
| 1258 | 1275 | ||
| 1259 | INLINE bool | 1276 | INLINE 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 | }; |
| 1379 | verify (alignof (struct Lisp_String) % GCALIGNMENT == 0); | 1396 | verify (GCALIGNED (struct Lisp_String)); |
| 1380 | 1397 | ||
| 1381 | INLINE bool | 1398 | INLINE bool |
| 1382 | STRINGP (Lisp_Object x) | 1399 | STRINGP (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 | ||
| 1512 | INLINE bool | 1529 | INLINE 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 | ||
| 1835 | INLINE bool | 1853 | INLINE bool |
| 1836 | CHAR_TABLE_P (Lisp_Object a) | 1854 | CHAR_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; | ||
| 1965 | verify (GCALIGNED (struct Lisp_Subr)); | ||
| 1946 | 1966 | ||
| 1947 | INLINE bool | 1967 | INLINE bool |
| 1948 | SUBRP (Lisp_Object a) | 1968 | SUBRP (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 | ||
| 2200 | INLINE bool | 2220 | INLINE 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 | ||
| 2340 | struct Lisp_Misc_Ptr | 2360 | struct 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 | ||
| 2346 | extern Lisp_Object make_misc_ptr (void *); | 2366 | extern 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 | ||
| 2409 | INLINE bool | 2429 | INLINE bool |
| 2410 | FINALIZERP (Lisp_Object x) | 2430 | FINALIZERP (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 | ||
| 2621 | INLINE bool | 2641 | INLINE 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 | ||
| 3951 | INLINE bool | 3971 | INLINE bool |
| 3952 | MODULE_FUNCTIONP (Lisp_Object o) | 3972 | MODULE_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 | ||
| 208 | INLINE bool | 208 | INLINE bool |
| 209 | PROCESSP (Lisp_Object a) | 209 | PROCESSP (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 | ||
| 666 | INLINE bool | 666 | INLINE bool |
| 667 | TERMINALP (Lisp_Object a) | 667 | TERMINALP (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 | ||
| 189 | INLINE bool | 189 | INLINE bool |
| 190 | THREADP (Lisp_Object a) | 190 | THREADP (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 | ||
| 236 | INLINE bool | 236 | INLINE bool |
| 237 | MUTEXP (Lisp_Object a) | 237 | MUTEXP (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 | ||
| 270 | INLINE bool | 270 | INLINE bool |
| 271 | CONDVARP (Lisp_Object a) | 271 | CONDVARP (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. */ |
| 6274 | struct saved_window | 6274 | struct 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 | ||
| 405 | INLINE bool | 405 | INLINE bool |
| 406 | WINDOWP (Lisp_Object a) | 406 | WINDOWP (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 | ||
| 66 | struct xwidget_view | 66 | struct 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. */ |