A simpler, centralized INLINE.
[bpt/emacs.git] / src / alloc.c
CommitLineData
7146af97 1/* Storage allocation and gc for GNU Emacs Lisp interpreter.
999dd333 2
ab422c4d
PE
3Copyright (C) 1985-1986, 1988, 1993-1995, 1997-2013 Free Software
4Foundation, Inc.
7146af97
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
7146af97 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
7146af97
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
7146af97 20
18160b98 21#include <config.h>
f162bcc3 22
e9b309ac 23#include <stdio.h>
ab6780cd 24#include <limits.h> /* For CHAR_BIT. */
92939d31 25
bc8000ff 26#ifdef ENABLE_CHECKING
b09cca6a 27#include <signal.h> /* For SIGABRT. */
bc8000ff
EZ
28#endif
29
ae9e757a 30#ifdef HAVE_PTHREAD
aa477689
JD
31#include <pthread.h>
32#endif
33
7146af97 34#include "lisp.h"
ece93c02 35#include "process.h"
d5e35230 36#include "intervals.h"
4c0be5f4 37#include "puresize.h"
e5560ff7 38#include "character.h"
7146af97
JB
39#include "buffer.h"
40#include "window.h"
2538fae4 41#include "keyboard.h"
502b9b64 42#include "frame.h"
9ac0d9e0 43#include "blockinput.h"
4a729fd8 44#include "termhooks.h" /* For struct terminal. */
0328b6de 45
0065d054 46#include <verify.h>
e065a56e 47
52828e02
PE
48/* GC_CHECK_MARKED_OBJECTS means do sanity checks on allocated objects.
49 Doable only if GC_MARK_STACK. */
50#if ! GC_MARK_STACK
51# undef GC_CHECK_MARKED_OBJECTS
52#endif
53
6b61353c 54/* GC_MALLOC_CHECK defined means perform validity checks of malloc'd
52828e02
PE
55 memory. Can do this only if using gmalloc.c and if not checking
56 marked objects. */
6b61353c 57
52828e02
PE
58#if (defined SYSTEM_MALLOC || defined DOUG_LEA_MALLOC \
59 || defined GC_CHECK_MARKED_OBJECTS)
6b61353c
KH
60#undef GC_MALLOC_CHECK
61#endif
62
bf952fb6 63#include <unistd.h>
de7124a7 64#include <fcntl.h>
de7124a7 65
a411ac43
PE
66#ifdef USE_GTK
67# include "gtkutil.h"
68#endif
69666f77 69#ifdef WINDOWSNT
f892cf9c 70#include "w32.h"
62aba0d4 71#include "w32heap.h" /* for sbrk */
69666f77
EZ
72#endif
73
d1658221 74#ifdef DOUG_LEA_MALLOC
2e471eb5 75
d1658221 76#include <malloc.h>
81d492d5 77
2e471eb5
GM
78/* Specify maximum number of areas to mmap. It would be nice to use a
79 value that explicitly means "no limit". */
80
81d492d5
RS
81#define MMAP_MAX_AREAS 100000000
82
2e471eb5 83#endif /* not DOUG_LEA_MALLOC */
276cbe5a 84
2e471eb5
GM
85/* Mark, unmark, query mark bit of a Lisp string. S must be a pointer
86 to a struct Lisp_String. */
87
7cdee936
SM
88#define MARK_STRING(S) ((S)->size |= ARRAY_MARK_FLAG)
89#define UNMARK_STRING(S) ((S)->size &= ~ARRAY_MARK_FLAG)
b059de99 90#define STRING_MARKED_P(S) (((S)->size & ARRAY_MARK_FLAG) != 0)
2e471eb5 91
eab3844f
PE
92#define VECTOR_MARK(V) ((V)->header.size |= ARRAY_MARK_FLAG)
93#define VECTOR_UNMARK(V) ((V)->header.size &= ~ARRAY_MARK_FLAG)
94#define VECTOR_MARKED_P(V) (((V)->header.size & ARRAY_MARK_FLAG) != 0)
3ef06d12 95
0dd6d66d
DA
96/* Default value of gc_cons_threshold (see below). */
97
663e2b3f 98#define GC_DEFAULT_THRESHOLD (100000 * word_size)
0dd6d66d 99
29208e82
TT
100/* Global variables. */
101struct emacs_globals globals;
102
2e471eb5
GM
103/* Number of bytes of consing done since the last gc. */
104
dac616ff 105EMACS_INT consing_since_gc;
7146af97 106
974aae61
RS
107/* Similar minimum, computed from Vgc_cons_percentage. */
108
dac616ff 109EMACS_INT gc_relative_threshold;
310ea200 110
24d8a105
RS
111/* Minimum number of bytes of consing since GC before next GC,
112 when memory is full. */
113
dac616ff 114EMACS_INT memory_full_cons_threshold;
24d8a105 115
fce31d69 116/* True during GC. */
2e471eb5 117
fce31d69 118bool gc_in_progress;
7146af97 119
fce31d69 120/* True means abort if try to GC.
3de0effb
RS
121 This is for code which is written on the assumption that
122 no GC will happen, so as to verify that assumption. */
123
fce31d69 124bool abort_on_gc;
3de0effb 125
34400008
GM
126/* Number of live and free conses etc. */
127
3ab6e069 128static EMACS_INT total_conses, total_markers, total_symbols, total_buffers;
c0c5c8ae 129static EMACS_INT total_free_conses, total_free_markers, total_free_symbols;
3ab6e069 130static EMACS_INT total_free_floats, total_floats;
fd27a537 131
2e471eb5 132/* Points to memory space allocated as "spare", to be freed if we run
24d8a105
RS
133 out of memory. We keep one large block, four cons-blocks, and
134 two string blocks. */
2e471eb5 135
d3d47262 136static char *spare_memory[7];
276cbe5a 137
2b6148e4
PE
138/* Amount of spare memory to keep in large reserve block, or to see
139 whether this much is available when malloc fails on a larger request. */
2e471eb5 140
276cbe5a 141#define SPARE_MEMORY (1 << 14)
4d09bcf6 142
1b8950e5
RS
143/* Initialize it to a nonzero value to force it into data space
144 (rather than bss space). That way unexec will remap it into text
145 space (pure), on some systems. We have not implemented the
146 remapping on more recent systems because this is less important
147 nowadays than in the days of small memories and timesharing. */
2e471eb5 148
2c4685ee 149EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,};
7146af97 150#define PUREBEG (char *) pure
2e471eb5 151
9e713715 152/* Pointer to the pure area, and its size. */
2e471eb5 153
9e713715 154static char *purebeg;
903fe15d 155static ptrdiff_t pure_size;
9e713715
GM
156
157/* Number of bytes of pure storage used before pure storage overflowed.
158 If this is non-zero, this implies that an overflow occurred. */
159
903fe15d 160static ptrdiff_t pure_bytes_used_before_overflow;
7146af97 161
fce31d69 162/* True if P points into pure space. */
34400008
GM
163
164#define PURE_POINTER_P(P) \
6a0bf43d 165 ((uintptr_t) (P) - (uintptr_t) purebeg <= pure_size)
34400008 166
fecbd8ff 167/* Index in pure at which next pure Lisp object will be allocated.. */
e5bc14d4 168
d311d28c 169static ptrdiff_t pure_bytes_used_lisp;
e5bc14d4
YM
170
171/* Number of bytes allocated for non-Lisp objects in pure storage. */
172
d311d28c 173static ptrdiff_t pure_bytes_used_non_lisp;
e5bc14d4 174
2e471eb5
GM
175/* If nonzero, this is a warning delivered by malloc and not yet
176 displayed. */
177
a8fe7202 178const char *pending_malloc_warning;
7146af97
JB
179
180/* Maximum amount of C stack to save when a GC happens. */
181
182#ifndef MAX_SAVE_STACK
183#define MAX_SAVE_STACK 16000
184#endif
185
186/* Buffer in which we save a copy of the C stack at each GC. */
187
dd3f25f7 188#if MAX_SAVE_STACK > 0
d3d47262 189static char *stack_copy;
903fe15d 190static ptrdiff_t stack_copy_size;
dd3f25f7 191#endif
7146af97 192
fecbd8ff
SM
193static Lisp_Object Qconses;
194static Lisp_Object Qsymbols;
195static Lisp_Object Qmiscs;
196static Lisp_Object Qstrings;
197static Lisp_Object Qvectors;
198static Lisp_Object Qfloats;
199static Lisp_Object Qintervals;
200static Lisp_Object Qbuffers;
f8643a6b 201static Lisp_Object Qstring_bytes, Qvector_slots, Qheap;
955cbe7b 202static Lisp_Object Qgc_cons_threshold;
3d80c99f 203Lisp_Object Qautomatic_gc;
955cbe7b 204Lisp_Object Qchar_table_extra_slots;
e8197642 205
9e713715
GM
206/* Hook run after GC has finished. */
207
955cbe7b 208static Lisp_Object Qpost_gc_hook;
2c5bd608 209
f57e2426 210static void mark_terminals (void);
f57e2426 211static void gc_sweep (void);
72cb32cf 212static Lisp_Object make_pure_vector (ptrdiff_t);
c752cfa9 213static void mark_buffer (struct buffer *);
41c28a37 214
69003fd8
PE
215#if !defined REL_ALLOC || defined SYSTEM_MALLOC
216static void refill_memory_reserve (void);
217#endif
f57e2426
J
218static void compact_small_strings (void);
219static void free_large_strings (void);
196e41e4 220extern Lisp_Object which_symbols (Lisp_Object, EMACS_INT) EXTERNALLY_VISIBLE;
34400008 221
914adc42
DA
222/* When scanning the C stack for live Lisp objects, Emacs keeps track of
223 what memory allocated via lisp_malloc and lisp_align_malloc is intended
224 for what purpose. This enumeration specifies the type of memory. */
34400008
GM
225
226enum mem_type
227{
228 MEM_TYPE_NON_LISP,
229 MEM_TYPE_BUFFER,
230 MEM_TYPE_CONS,
231 MEM_TYPE_STRING,
232 MEM_TYPE_MISC,
233 MEM_TYPE_SYMBOL,
234 MEM_TYPE_FLOAT,
914adc42
DA
235 /* Since all non-bool pseudovectors are small enough to be
236 allocated from vector blocks, this memory type denotes
237 large regular vectors and large bool pseudovectors. */
f3372c87
DA
238 MEM_TYPE_VECTORLIKE,
239 /* Special type to denote vector blocks. */
35aaa1ea
DA
240 MEM_TYPE_VECTOR_BLOCK,
241 /* Special type to denote reserved memory. */
242 MEM_TYPE_SPARE
34400008
GM
243};
244
877935b1 245#if GC_MARK_STACK || defined GC_MALLOC_CHECK
0b378936 246
0b378936
GM
247/* A unique object in pure space used to make some Lisp objects
248 on free lists recognizable in O(1). */
249
d3d47262 250static Lisp_Object Vdead;
ca78dc43 251#define DEADP(x) EQ (x, Vdead)
0b378936 252
877935b1
GM
253#ifdef GC_MALLOC_CHECK
254
255enum mem_type allocated_mem_type;
877935b1
GM
256
257#endif /* GC_MALLOC_CHECK */
258
259/* A node in the red-black tree describing allocated memory containing
260 Lisp data. Each such block is recorded with its start and end
261 address when it is allocated, and removed from the tree when it
262 is freed.
263
264 A red-black tree is a balanced binary tree with the following
265 properties:
266
267 1. Every node is either red or black.
268 2. Every leaf is black.
269 3. If a node is red, then both of its children are black.
270 4. Every simple path from a node to a descendant leaf contains
271 the same number of black nodes.
272 5. The root is always black.
273
274 When nodes are inserted into the tree, or deleted from the tree,
275 the tree is "fixed" so that these properties are always true.
276
277 A red-black tree with N internal nodes has height at most 2
278 log(N+1). Searches, insertions and deletions are done in O(log N).
279 Please see a text book about data structures for a detailed
280 description of red-black trees. Any book worth its salt should
281 describe them. */
282
283struct mem_node
284{
9f7d9210
RS
285 /* Children of this node. These pointers are never NULL. When there
286 is no child, the value is MEM_NIL, which points to a dummy node. */
287 struct mem_node *left, *right;
288
289 /* The parent of this node. In the root node, this is NULL. */
290 struct mem_node *parent;
877935b1
GM
291
292 /* Start and end of allocated region. */
293 void *start, *end;
294
295 /* Node color. */
296 enum {MEM_BLACK, MEM_RED} color;
177c0ea7 297
877935b1
GM
298 /* Memory type. */
299 enum mem_type type;
300};
301
302/* Base address of stack. Set in main. */
303
304Lisp_Object *stack_base;
305
306/* Root of the tree describing allocated Lisp memory. */
307
308static struct mem_node *mem_root;
309
ece93c02
GM
310/* Lowest and highest known address in the heap. */
311
312static void *min_heap_address, *max_heap_address;
313
877935b1
GM
314/* Sentinel node of the tree. */
315
316static struct mem_node mem_z;
317#define MEM_NIL &mem_z
318
f57e2426
J
319static struct mem_node *mem_insert (void *, void *, enum mem_type);
320static void mem_insert_fixup (struct mem_node *);
321static void mem_rotate_left (struct mem_node *);
322static void mem_rotate_right (struct mem_node *);
323static void mem_delete (struct mem_node *);
324static void mem_delete_fixup (struct mem_node *);
b0ab8123 325static struct mem_node *mem_find (void *);
34400008 326
877935b1 327#endif /* GC_MARK_STACK || GC_MALLOC_CHECK */
34400008 328
ca78dc43
PE
329#ifndef DEADP
330# define DEADP(x) 0
331#endif
332
1f0b3fd2
GM
333/* Recording what needs to be marked for gc. */
334
335struct gcpro *gcprolist;
336
379b98b1
PE
337/* Addresses of staticpro'd variables. Initialize it to a nonzero
338 value; otherwise some compilers put it into BSS. */
1f0b3fd2 339
4195afc3 340enum { NSTATICS = 2048 };
d3d47262 341static Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag};
1f0b3fd2
GM
342
343/* Index of next unused slot in staticvec. */
344
fff62aa9 345static int staticidx;
1f0b3fd2 346
261cb4bb 347static void *pure_alloc (size_t, int);
1f0b3fd2
GM
348
349
350/* Value is SZ rounded up to the next multiple of ALIGNMENT.
351 ALIGNMENT must be a power of 2. */
352
ab6780cd 353#define ALIGN(ptr, ALIGNMENT) \
261cb4bb
PE
354 ((void *) (((uintptr_t) (ptr) + (ALIGNMENT) - 1) \
355 & ~ ((ALIGNMENT) - 1)))
1f0b3fd2 356
84575e67
PE
357static void
358XFLOAT_INIT (Lisp_Object f, double n)
359{
360 XFLOAT (f)->u.data = n;
361}
ece93c02 362
7146af97 363\f
34400008
GM
364/************************************************************************
365 Malloc
366 ************************************************************************/
367
4455ad75 368/* Function malloc calls this if it finds we are near exhausting storage. */
d457598b
AS
369
370void
a8fe7202 371malloc_warning (const char *str)
7146af97
JB
372{
373 pending_malloc_warning = str;
374}
375
34400008 376
4455ad75 377/* Display an already-pending malloc warning. */
34400008 378
d457598b 379void
971de7fb 380display_malloc_warning (void)
7146af97 381{
4455ad75
RS
382 call3 (intern ("display-warning"),
383 intern ("alloc"),
384 build_string (pending_malloc_warning),
385 intern ("emergency"));
7146af97 386 pending_malloc_warning = 0;
7146af97 387}
49efed3a 388\f
276cbe5a
RS
389/* Called if we can't allocate relocatable space for a buffer. */
390
391void
d311d28c 392buffer_memory_full (ptrdiff_t nbytes)
276cbe5a 393{
2e471eb5
GM
394 /* If buffers use the relocating allocator, no need to free
395 spare_memory, because we may have plenty of malloc space left
396 that we could get, and if we don't, the malloc that fails will
397 itself cause spare_memory to be freed. If buffers don't use the
398 relocating allocator, treat this like any other failing
399 malloc. */
276cbe5a
RS
400
401#ifndef REL_ALLOC
531b0165 402 memory_full (nbytes);
d9df6f40 403#else
2e471eb5
GM
404 /* This used to call error, but if we've run out of memory, we could
405 get infinite recursion trying to build the string. */
9b306d37 406 xsignal (Qnil, Vmemory_signal_data);
d9df6f40 407#endif
7146af97
JB
408}
409
f3372c87
DA
410/* A common multiple of the positive integers A and B. Ideally this
411 would be the least common multiple, but there's no way to do that
412 as a constant expression in C, so do the best that we can easily do. */
413#define COMMON_MULTIPLE(a, b) \
414 ((a) % (b) == 0 ? (a) : (b) % (a) == 0 ? (b) : (a) * (b))
34400008 415
c9d624c6 416#ifndef XMALLOC_OVERRUN_CHECK
903fe15d 417#define XMALLOC_OVERRUN_CHECK_OVERHEAD 0
c9d624c6 418#else
212f33f1 419
903fe15d
PE
420/* Check for overrun in malloc'ed buffers by wrapping a header and trailer
421 around each block.
bdbed949 422
f701dc2a
PE
423 The header consists of XMALLOC_OVERRUN_CHECK_SIZE fixed bytes
424 followed by XMALLOC_OVERRUN_SIZE_SIZE bytes containing the original
425 block size in little-endian order. The trailer consists of
426 XMALLOC_OVERRUN_CHECK_SIZE fixed bytes.
bdbed949
KS
427
428 The header is used to detect whether this block has been allocated
f701dc2a
PE
429 through these functions, as some low-level libc functions may
430 bypass the malloc hooks. */
bdbed949 431
212f33f1 432#define XMALLOC_OVERRUN_CHECK_SIZE 16
903fe15d 433#define XMALLOC_OVERRUN_CHECK_OVERHEAD \
38532ce6
PE
434 (2 * XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE)
435
436/* Define XMALLOC_OVERRUN_SIZE_SIZE so that (1) it's large enough to
f701dc2a
PE
437 hold a size_t value and (2) the header size is a multiple of the
438 alignment that Emacs needs for C types and for USE_LSB_TAG. */
439#define XMALLOC_BASE_ALIGNMENT \
e32a5799 440 alignof (union { long double d; intmax_t i; void *p; })
f3372c87 441
bfe3e0a2 442#if USE_LSB_TAG
f701dc2a 443# define XMALLOC_HEADER_ALIGNMENT \
2b90362b 444 COMMON_MULTIPLE (GCALIGNMENT, XMALLOC_BASE_ALIGNMENT)
38532ce6
PE
445#else
446# define XMALLOC_HEADER_ALIGNMENT XMALLOC_BASE_ALIGNMENT
447#endif
448#define XMALLOC_OVERRUN_SIZE_SIZE \
f701dc2a
PE
449 (((XMALLOC_OVERRUN_CHECK_SIZE + sizeof (size_t) \
450 + XMALLOC_HEADER_ALIGNMENT - 1) \
451 / XMALLOC_HEADER_ALIGNMENT * XMALLOC_HEADER_ALIGNMENT) \
452 - XMALLOC_OVERRUN_CHECK_SIZE)
bdbed949 453
903fe15d
PE
454static char const xmalloc_overrun_check_header[XMALLOC_OVERRUN_CHECK_SIZE] =
455 { '\x9a', '\x9b', '\xae', '\xaf',
456 '\xbf', '\xbe', '\xce', '\xcf',
457 '\xea', '\xeb', '\xec', '\xed',
458 '\xdf', '\xde', '\x9c', '\x9d' };
212f33f1 459
903fe15d
PE
460static char const xmalloc_overrun_check_trailer[XMALLOC_OVERRUN_CHECK_SIZE] =
461 { '\xaa', '\xab', '\xac', '\xad',
462 '\xba', '\xbb', '\xbc', '\xbd',
463 '\xca', '\xcb', '\xcc', '\xcd',
464 '\xda', '\xdb', '\xdc', '\xdd' };
212f33f1 465
903fe15d 466/* Insert and extract the block size in the header. */
bdbed949 467
903fe15d
PE
468static void
469xmalloc_put_size (unsigned char *ptr, size_t size)
470{
471 int i;
38532ce6 472 for (i = 0; i < XMALLOC_OVERRUN_SIZE_SIZE; i++)
903fe15d 473 {
38532ce6 474 *--ptr = size & ((1 << CHAR_BIT) - 1);
903fe15d
PE
475 size >>= CHAR_BIT;
476 }
477}
bdbed949 478
903fe15d
PE
479static size_t
480xmalloc_get_size (unsigned char *ptr)
481{
482 size_t size = 0;
483 int i;
38532ce6
PE
484 ptr -= XMALLOC_OVERRUN_SIZE_SIZE;
485 for (i = 0; i < XMALLOC_OVERRUN_SIZE_SIZE; i++)
903fe15d
PE
486 {
487 size <<= CHAR_BIT;
488 size += *ptr++;
489 }
490 return size;
491}
bdbed949
KS
492
493
494/* Like malloc, but wraps allocated block with header and trailer. */
495
261cb4bb 496static void *
e7974947 497overrun_check_malloc (size_t size)
212f33f1 498{
bdbed949 499 register unsigned char *val;
0caaedb1 500 if (SIZE_MAX - XMALLOC_OVERRUN_CHECK_OVERHEAD < size)
1088b922 501 emacs_abort ();
212f33f1 502
0caaedb1
PE
503 val = malloc (size + XMALLOC_OVERRUN_CHECK_OVERHEAD);
504 if (val)
212f33f1 505 {
903fe15d 506 memcpy (val, xmalloc_overrun_check_header, XMALLOC_OVERRUN_CHECK_SIZE);
38532ce6 507 val += XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
903fe15d 508 xmalloc_put_size (val, size);
72af86bd
AS
509 memcpy (val + size, xmalloc_overrun_check_trailer,
510 XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 511 }
261cb4bb 512 return val;
212f33f1
KS
513}
514
bdbed949
KS
515
516/* Like realloc, but checks old block for overrun, and wraps new block
517 with header and trailer. */
518
261cb4bb
PE
519static void *
520overrun_check_realloc (void *block, size_t size)
212f33f1 521{
e7974947 522 register unsigned char *val = (unsigned char *) block;
0caaedb1 523 if (SIZE_MAX - XMALLOC_OVERRUN_CHECK_OVERHEAD < size)
1088b922 524 emacs_abort ();
212f33f1
KS
525
526 if (val
72af86bd 527 && memcmp (xmalloc_overrun_check_header,
38532ce6 528 val - XMALLOC_OVERRUN_CHECK_SIZE - XMALLOC_OVERRUN_SIZE_SIZE,
903fe15d 529 XMALLOC_OVERRUN_CHECK_SIZE) == 0)
212f33f1 530 {
903fe15d 531 size_t osize = xmalloc_get_size (val);
72af86bd
AS
532 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
533 XMALLOC_OVERRUN_CHECK_SIZE))
1088b922 534 emacs_abort ();
72af86bd 535 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
38532ce6
PE
536 val -= XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
537 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE);
212f33f1
KS
538 }
539
0caaedb1 540 val = realloc (val, size + XMALLOC_OVERRUN_CHECK_OVERHEAD);
212f33f1 541
0caaedb1 542 if (val)
212f33f1 543 {
903fe15d 544 memcpy (val, xmalloc_overrun_check_header, XMALLOC_OVERRUN_CHECK_SIZE);
38532ce6 545 val += XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
903fe15d 546 xmalloc_put_size (val, size);
72af86bd
AS
547 memcpy (val + size, xmalloc_overrun_check_trailer,
548 XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 549 }
261cb4bb 550 return val;
212f33f1
KS
551}
552
bdbed949
KS
553/* Like free, but checks block for overrun. */
554
2538aa2f 555static void
261cb4bb 556overrun_check_free (void *block)
212f33f1 557{
e7974947 558 unsigned char *val = (unsigned char *) block;
212f33f1
KS
559
560 if (val
72af86bd 561 && memcmp (xmalloc_overrun_check_header,
38532ce6 562 val - XMALLOC_OVERRUN_CHECK_SIZE - XMALLOC_OVERRUN_SIZE_SIZE,
903fe15d 563 XMALLOC_OVERRUN_CHECK_SIZE) == 0)
212f33f1 564 {
903fe15d 565 size_t osize = xmalloc_get_size (val);
72af86bd
AS
566 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
567 XMALLOC_OVERRUN_CHECK_SIZE))
1088b922 568 emacs_abort ();
454d7973 569#ifdef XMALLOC_CLEAR_FREE_MEMORY
38532ce6 570 val -= XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
903fe15d 571 memset (val, 0xff, osize + XMALLOC_OVERRUN_CHECK_OVERHEAD);
454d7973 572#else
72af86bd 573 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
38532ce6
PE
574 val -= XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
575 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE);
454d7973 576#endif
212f33f1
KS
577 }
578
579 free (val);
580}
581
582#undef malloc
583#undef realloc
584#undef free
585#define malloc overrun_check_malloc
586#define realloc overrun_check_realloc
587#define free overrun_check_free
588#endif
589
0caaedb1
PE
590/* If compiled with XMALLOC_BLOCK_INPUT_CHECK, define a symbol
591 BLOCK_INPUT_IN_MEMORY_ALLOCATORS that is visible to the debugger.
592 If that variable is set, block input while in one of Emacs's memory
593 allocation functions. There should be no need for this debugging
594 option, since signal handlers do not allocate memory, but Emacs
595 formerly allocated memory in signal handlers and this compile-time
596 option remains as a way to help debug the issue should it rear its
597 ugly head again. */
598#ifdef XMALLOC_BLOCK_INPUT_CHECK
599bool block_input_in_memory_allocators EXTERNALLY_VISIBLE;
600static void
601malloc_block_input (void)
602{
603 if (block_input_in_memory_allocators)
4d7e6e51 604 block_input ();
0caaedb1
PE
605}
606static void
607malloc_unblock_input (void)
608{
609 if (block_input_in_memory_allocators)
4d7e6e51 610 unblock_input ();
0caaedb1
PE
611}
612# define MALLOC_BLOCK_INPUT malloc_block_input ()
613# define MALLOC_UNBLOCK_INPUT malloc_unblock_input ()
dafc79fa 614#else
0caaedb1
PE
615# define MALLOC_BLOCK_INPUT ((void) 0)
616# define MALLOC_UNBLOCK_INPUT ((void) 0)
dafc79fa 617#endif
bdbed949 618
3a880af4
SM
619#define MALLOC_PROBE(size) \
620 do { \
621 if (profiler_memory_running) \
622 malloc_probe (size); \
623 } while (0)
624
625
34400008 626/* Like malloc but check for no memory and block interrupt input.. */
7146af97 627
261cb4bb 628void *
971de7fb 629xmalloc (size_t size)
7146af97 630{
261cb4bb 631 void *val;
7146af97 632
dafc79fa 633 MALLOC_BLOCK_INPUT;
261cb4bb 634 val = malloc (size);
dafc79fa 635 MALLOC_UNBLOCK_INPUT;
7146af97 636
2e471eb5 637 if (!val && size)
531b0165 638 memory_full (size);
c2d7786e 639 MALLOC_PROBE (size);
7146af97
JB
640 return val;
641}
642
23f86fce
DA
643/* Like the above, but zeroes out the memory just allocated. */
644
645void *
646xzalloc (size_t size)
647{
648 void *val;
649
650 MALLOC_BLOCK_INPUT;
651 val = malloc (size);
652 MALLOC_UNBLOCK_INPUT;
653
654 if (!val && size)
655 memory_full (size);
656 memset (val, 0, size);
c2d7786e 657 MALLOC_PROBE (size);
23f86fce
DA
658 return val;
659}
34400008
GM
660
661/* Like realloc but check for no memory and block interrupt input.. */
662
261cb4bb
PE
663void *
664xrealloc (void *block, size_t size)
7146af97 665{
261cb4bb 666 void *val;
7146af97 667
dafc79fa 668 MALLOC_BLOCK_INPUT;
56d2031b
JB
669 /* We must call malloc explicitly when BLOCK is 0, since some
670 reallocs don't do this. */
671 if (! block)
261cb4bb 672 val = malloc (size);
f048679d 673 else
261cb4bb 674 val = realloc (block, size);
dafc79fa 675 MALLOC_UNBLOCK_INPUT;
7146af97 676
531b0165
PE
677 if (!val && size)
678 memory_full (size);
c2d7786e 679 MALLOC_PROBE (size);
7146af97
JB
680 return val;
681}
9ac0d9e0 682
34400008 683
005ca5c7 684/* Like free but block interrupt input. */
34400008 685
9ac0d9e0 686void
261cb4bb 687xfree (void *block)
9ac0d9e0 688{
70fdbb46
JM
689 if (!block)
690 return;
dafc79fa 691 MALLOC_BLOCK_INPUT;
9ac0d9e0 692 free (block);
dafc79fa 693 MALLOC_UNBLOCK_INPUT;
24d8a105 694 /* We don't call refill_memory_reserve here
0caaedb1 695 because in practice the call in r_alloc_free seems to suffice. */
9ac0d9e0
JB
696}
697
c8099634 698
0065d054
PE
699/* Other parts of Emacs pass large int values to allocator functions
700 expecting ptrdiff_t. This is portable in practice, but check it to
701 be safe. */
702verify (INT_MAX <= PTRDIFF_MAX);
703
704
705/* Allocate an array of NITEMS items, each of size ITEM_SIZE.
706 Signal an error on memory exhaustion, and block interrupt input. */
707
708void *
709xnmalloc (ptrdiff_t nitems, ptrdiff_t item_size)
710{
a54e2c05 711 eassert (0 <= nitems && 0 < item_size);
0065d054
PE
712 if (min (PTRDIFF_MAX, SIZE_MAX) / item_size < nitems)
713 memory_full (SIZE_MAX);
714 return xmalloc (nitems * item_size);
715}
716
717
718/* Reallocate an array PA to make it of NITEMS items, each of size ITEM_SIZE.
719 Signal an error on memory exhaustion, and block interrupt input. */
720
721void *
722xnrealloc (void *pa, ptrdiff_t nitems, ptrdiff_t item_size)
723{
a54e2c05 724 eassert (0 <= nitems && 0 < item_size);
0065d054
PE
725 if (min (PTRDIFF_MAX, SIZE_MAX) / item_size < nitems)
726 memory_full (SIZE_MAX);
727 return xrealloc (pa, nitems * item_size);
728}
729
730
731/* Grow PA, which points to an array of *NITEMS items, and return the
732 location of the reallocated array, updating *NITEMS to reflect its
733 new size. The new array will contain at least NITEMS_INCR_MIN more
734 items, but will not contain more than NITEMS_MAX items total.
735 ITEM_SIZE is the size of each item, in bytes.
736
737 ITEM_SIZE and NITEMS_INCR_MIN must be positive. *NITEMS must be
738 nonnegative. If NITEMS_MAX is -1, it is treated as if it were
739 infinity.
740
741 If PA is null, then allocate a new array instead of reallocating
2dd2e622 742 the old one.
0065d054
PE
743
744 Block interrupt input as needed. If memory exhaustion occurs, set
745 *NITEMS to zero if PA is null, and signal an error (i.e., do not
2dd2e622
PE
746 return).
747
748 Thus, to grow an array A without saving its old contents, do
749 { xfree (A); A = NULL; A = xpalloc (NULL, &AITEMS, ...); }.
750 The A = NULL avoids a dangling pointer if xpalloc exhausts memory
751 and signals an error, and later this code is reexecuted and
752 attempts to free A. */
0065d054
PE
753
754void *
755xpalloc (void *pa, ptrdiff_t *nitems, ptrdiff_t nitems_incr_min,
756 ptrdiff_t nitems_max, ptrdiff_t item_size)
757{
758 /* The approximate size to use for initial small allocation
759 requests. This is the largest "small" request for the GNU C
760 library malloc. */
761 enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
762
763 /* If the array is tiny, grow it to about (but no greater than)
764 DEFAULT_MXFAST bytes. Otherwise, grow it by about 50%. */
765 ptrdiff_t n = *nitems;
766 ptrdiff_t tiny_max = DEFAULT_MXFAST / item_size - n;
767 ptrdiff_t half_again = n >> 1;
768 ptrdiff_t incr_estimate = max (tiny_max, half_again);
769
770 /* Adjust the increment according to three constraints: NITEMS_INCR_MIN,
771 NITEMS_MAX, and what the C language can represent safely. */
772 ptrdiff_t C_language_max = min (PTRDIFF_MAX, SIZE_MAX) / item_size;
773 ptrdiff_t n_max = (0 <= nitems_max && nitems_max < C_language_max
774 ? nitems_max : C_language_max);
775 ptrdiff_t nitems_incr_max = n_max - n;
776 ptrdiff_t incr = max (nitems_incr_min, min (incr_estimate, nitems_incr_max));
777
7216e43b 778 eassert (0 < item_size && 0 < nitems_incr_min && 0 <= n && -1 <= nitems_max);
0065d054
PE
779 if (! pa)
780 *nitems = 0;
781 if (nitems_incr_max < incr)
782 memory_full (SIZE_MAX);
783 n += incr;
784 pa = xrealloc (pa, n * item_size);
785 *nitems = n;
786 return pa;
787}
788
789
dca7c6a8
GM
790/* Like strdup, but uses xmalloc. */
791
792char *
971de7fb 793xstrdup (const char *s)
dca7c6a8 794{
9acc1074 795 ptrdiff_t size;
309f24d1 796 eassert (s);
9acc1074
PE
797 size = strlen (s) + 1;
798 return memcpy (xmalloc (size), s, size);
dca7c6a8
GM
799}
800
5b71542d
DA
801/* Like above, but duplicates Lisp string to C string. */
802
803char *
804xlispstrdup (Lisp_Object string)
805{
806 ptrdiff_t size = SBYTES (string) + 1;
807 return memcpy (xmalloc (size), SSDATA (string), size);
808}
809
5745a7df
PE
810/* Like putenv, but (1) use the equivalent of xmalloc and (2) the
811 argument is a const pointer. */
812
813void
814xputenv (char const *string)
815{
816 if (putenv ((char *) string) != 0)
817 memory_full (0);
818}
dca7c6a8 819
98c6f1e3
PE
820/* Return a newly allocated memory block of SIZE bytes, remembering
821 to free it when unwinding. */
822void *
823record_xmalloc (size_t size)
824{
825 void *p = xmalloc (size);
27e498e6 826 record_unwind_protect_ptr (xfree, p);
98c6f1e3
PE
827 return p;
828}
829
f61bef8b 830
34400008
GM
831/* Like malloc but used for allocating Lisp data. NBYTES is the
832 number of bytes to allocate, TYPE describes the intended use of the
91af3942 833 allocated memory block (for strings, for conses, ...). */
34400008 834
bfe3e0a2
PE
835#if ! USE_LSB_TAG
836void *lisp_malloc_loser EXTERNALLY_VISIBLE;
212f33f1 837#endif
918a23a7 838
261cb4bb 839static void *
971de7fb 840lisp_malloc (size_t nbytes, enum mem_type type)
c8099634 841{
34400008 842 register void *val;
c8099634 843
dafc79fa 844 MALLOC_BLOCK_INPUT;
877935b1
GM
845
846#ifdef GC_MALLOC_CHECK
847 allocated_mem_type = type;
848#endif
177c0ea7 849
38182d90 850 val = malloc (nbytes);
c8099634 851
bfe3e0a2 852#if ! USE_LSB_TAG
918a23a7
RS
853 /* If the memory just allocated cannot be addressed thru a Lisp
854 object's pointer, and it needs to be,
855 that's equivalent to running out of memory. */
856 if (val && type != MEM_TYPE_NON_LISP)
857 {
858 Lisp_Object tem;
859 XSETCONS (tem, (char *) val + nbytes - 1);
860 if ((char *) XCONS (tem) != (char *) val + nbytes - 1)
861 {
862 lisp_malloc_loser = val;
863 free (val);
864 val = 0;
865 }
866 }
6b61353c 867#endif
918a23a7 868
877935b1 869#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
dca7c6a8 870 if (val && type != MEM_TYPE_NON_LISP)
34400008
GM
871 mem_insert (val, (char *) val + nbytes, type);
872#endif
177c0ea7 873
dafc79fa 874 MALLOC_UNBLOCK_INPUT;
dca7c6a8 875 if (!val && nbytes)
531b0165 876 memory_full (nbytes);
c2d7786e 877 MALLOC_PROBE (nbytes);
c8099634
RS
878 return val;
879}
880
34400008
GM
881/* Free BLOCK. This must be called to free memory allocated with a
882 call to lisp_malloc. */
883
bf952fb6 884static void
261cb4bb 885lisp_free (void *block)
c8099634 886{
dafc79fa 887 MALLOC_BLOCK_INPUT;
c8099634 888 free (block);
877935b1 889#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
34400008
GM
890 mem_delete (mem_find (block));
891#endif
dafc79fa 892 MALLOC_UNBLOCK_INPUT;
c8099634 893}
34400008 894
453b951e
SM
895/***** Allocation of aligned blocks of memory to store Lisp data. *****/
896
897/* The entry point is lisp_align_malloc which returns blocks of at most
898 BLOCK_BYTES and guarantees they are aligned on a BLOCK_ALIGN boundary. */
ab6780cd 899
b4181b01
KS
900#if defined (HAVE_POSIX_MEMALIGN) && defined (SYSTEM_MALLOC)
901#define USE_POSIX_MEMALIGN 1
902#endif
ab6780cd
SM
903
904/* BLOCK_ALIGN has to be a power of 2. */
905#define BLOCK_ALIGN (1 << 10)
ab6780cd
SM
906
907/* Padding to leave at the end of a malloc'd block. This is to give
908 malloc a chance to minimize the amount of memory wasted to alignment.
909 It should be tuned to the particular malloc library used.
19bcad1f
SM
910 On glibc-2.3.2, malloc never tries to align, so a padding of 0 is best.
911 posix_memalign on the other hand would ideally prefer a value of 4
912 because otherwise, there's 1020 bytes wasted between each ablocks.
f501ccb4
SM
913 In Emacs, testing shows that those 1020 can most of the time be
914 efficiently used by malloc to place other objects, so a value of 0 can
915 still preferable unless you have a lot of aligned blocks and virtually
916 nothing else. */
19bcad1f
SM
917#define BLOCK_PADDING 0
918#define BLOCK_BYTES \
0b432f21 919 (BLOCK_ALIGN - sizeof (struct ablocks *) - BLOCK_PADDING)
19bcad1f
SM
920
921/* Internal data structures and constants. */
922
ab6780cd
SM
923#define ABLOCKS_SIZE 16
924
925/* An aligned block of memory. */
926struct ablock
927{
928 union
929 {
930 char payload[BLOCK_BYTES];
931 struct ablock *next_free;
932 } x;
933 /* `abase' is the aligned base of the ablocks. */
934 /* It is overloaded to hold the virtual `busy' field that counts
935 the number of used ablock in the parent ablocks.
936 The first ablock has the `busy' field, the others have the `abase'
937 field. To tell the difference, we assume that pointers will have
938 integer values larger than 2 * ABLOCKS_SIZE. The lowest bit of `busy'
939 is used to tell whether the real base of the parent ablocks is `abase'
940 (if not, the word before the first ablock holds a pointer to the
941 real base). */
942 struct ablocks *abase;
943 /* The padding of all but the last ablock is unused. The padding of
944 the last ablock in an ablocks is not allocated. */
19bcad1f
SM
945#if BLOCK_PADDING
946 char padding[BLOCK_PADDING];
ebb8d410 947#endif
ab6780cd
SM
948};
949
950/* A bunch of consecutive aligned blocks. */
951struct ablocks
952{
953 struct ablock blocks[ABLOCKS_SIZE];
954};
955
4b5afbb0 956/* Size of the block requested from malloc or posix_memalign. */
19bcad1f 957#define ABLOCKS_BYTES (sizeof (struct ablocks) - BLOCK_PADDING)
ab6780cd
SM
958
959#define ABLOCK_ABASE(block) \
d01a7826 960 (((uintptr_t) (block)->abase) <= (1 + 2 * ABLOCKS_SIZE) \
ab6780cd
SM
961 ? (struct ablocks *)(block) \
962 : (block)->abase)
963
964/* Virtual `busy' field. */
965#define ABLOCKS_BUSY(abase) ((abase)->blocks[0].abase)
966
967/* Pointer to the (not necessarily aligned) malloc block. */
349a4500 968#ifdef USE_POSIX_MEMALIGN
19bcad1f
SM
969#define ABLOCKS_BASE(abase) (abase)
970#else
ab6780cd 971#define ABLOCKS_BASE(abase) \
d01a7826 972 (1 & (intptr_t) ABLOCKS_BUSY (abase) ? abase : ((void**)abase)[-1])
19bcad1f 973#endif
ab6780cd
SM
974
975/* The list of free ablock. */
976static struct ablock *free_ablock;
977
978/* Allocate an aligned block of nbytes.
979 Alignment is on a multiple of BLOCK_ALIGN and `nbytes' has to be
980 smaller or equal to BLOCK_BYTES. */
261cb4bb 981static void *
971de7fb 982lisp_align_malloc (size_t nbytes, enum mem_type type)
ab6780cd
SM
983{
984 void *base, *val;
985 struct ablocks *abase;
986
987 eassert (nbytes <= BLOCK_BYTES);
988
dafc79fa 989 MALLOC_BLOCK_INPUT;
ab6780cd
SM
990
991#ifdef GC_MALLOC_CHECK
992 allocated_mem_type = type;
993#endif
994
995 if (!free_ablock)
996 {
005ca5c7 997 int i;
d01a7826 998 intptr_t aligned; /* int gets warning casting to 64-bit pointer. */
ab6780cd
SM
999
1000#ifdef DOUG_LEA_MALLOC
1001 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
1002 because mapped region contents are not preserved in
1003 a dumped Emacs. */
1004 mallopt (M_MMAP_MAX, 0);
1005#endif
1006
349a4500 1007#ifdef USE_POSIX_MEMALIGN
19bcad1f
SM
1008 {
1009 int err = posix_memalign (&base, BLOCK_ALIGN, ABLOCKS_BYTES);
ab349c19
RS
1010 if (err)
1011 base = NULL;
1012 abase = base;
19bcad1f
SM
1013 }
1014#else
ab6780cd
SM
1015 base = malloc (ABLOCKS_BYTES);
1016 abase = ALIGN (base, BLOCK_ALIGN);
ab349c19
RS
1017#endif
1018
6b61353c
KH
1019 if (base == 0)
1020 {
dafc79fa 1021 MALLOC_UNBLOCK_INPUT;
531b0165 1022 memory_full (ABLOCKS_BYTES);
6b61353c 1023 }
ab6780cd
SM
1024
1025 aligned = (base == abase);
1026 if (!aligned)
1027 ((void**)abase)[-1] = base;
1028
1029#ifdef DOUG_LEA_MALLOC
1030 /* Back to a reasonable maximum of mmap'ed areas. */
1031 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1032#endif
1033
bfe3e0a2 1034#if ! USE_LSB_TAG
8f924df7
KH
1035 /* If the memory just allocated cannot be addressed thru a Lisp
1036 object's pointer, and it needs to be, that's equivalent to
1037 running out of memory. */
1038 if (type != MEM_TYPE_NON_LISP)
1039 {
1040 Lisp_Object tem;
1041 char *end = (char *) base + ABLOCKS_BYTES - 1;
1042 XSETCONS (tem, end);
1043 if ((char *) XCONS (tem) != end)
1044 {
1045 lisp_malloc_loser = base;
1046 free (base);
dafc79fa 1047 MALLOC_UNBLOCK_INPUT;
531b0165 1048 memory_full (SIZE_MAX);
8f924df7
KH
1049 }
1050 }
6b61353c 1051#endif
8f924df7 1052
ab6780cd 1053 /* Initialize the blocks and put them on the free list.
453b951e 1054 If `base' was not properly aligned, we can't use the last block. */
ab6780cd
SM
1055 for (i = 0; i < (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1); i++)
1056 {
1057 abase->blocks[i].abase = abase;
1058 abase->blocks[i].x.next_free = free_ablock;
1059 free_ablock = &abase->blocks[i];
1060 }
8ac068ac 1061 ABLOCKS_BUSY (abase) = (struct ablocks *) aligned;
ab6780cd 1062
d01a7826 1063 eassert (0 == ((uintptr_t) abase) % BLOCK_ALIGN);
ab6780cd
SM
1064 eassert (ABLOCK_ABASE (&abase->blocks[3]) == abase); /* 3 is arbitrary */
1065 eassert (ABLOCK_ABASE (&abase->blocks[0]) == abase);
1066 eassert (ABLOCKS_BASE (abase) == base);
d01a7826 1067 eassert (aligned == (intptr_t) ABLOCKS_BUSY (abase));
ab6780cd
SM
1068 }
1069
1070 abase = ABLOCK_ABASE (free_ablock);
8ac068ac 1071 ABLOCKS_BUSY (abase) =
d01a7826 1072 (struct ablocks *) (2 + (intptr_t) ABLOCKS_BUSY (abase));
ab6780cd
SM
1073 val = free_ablock;
1074 free_ablock = free_ablock->x.next_free;
1075
ab6780cd 1076#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
3687c2ef 1077 if (type != MEM_TYPE_NON_LISP)
ab6780cd
SM
1078 mem_insert (val, (char *) val + nbytes, type);
1079#endif
1080
dafc79fa 1081 MALLOC_UNBLOCK_INPUT;
ab6780cd 1082
c2d7786e
TM
1083 MALLOC_PROBE (nbytes);
1084
d01a7826 1085 eassert (0 == ((uintptr_t) val) % BLOCK_ALIGN);
ab6780cd
SM
1086 return val;
1087}
1088
1089static void
261cb4bb 1090lisp_align_free (void *block)
ab6780cd
SM
1091{
1092 struct ablock *ablock = block;
1093 struct ablocks *abase = ABLOCK_ABASE (ablock);
1094
dafc79fa 1095 MALLOC_BLOCK_INPUT;
ab6780cd
SM
1096#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
1097 mem_delete (mem_find (block));
1098#endif
1099 /* Put on free list. */
1100 ablock->x.next_free = free_ablock;
1101 free_ablock = ablock;
1102 /* Update busy count. */
453b951e
SM
1103 ABLOCKS_BUSY (abase)
1104 = (struct ablocks *) (-2 + (intptr_t) ABLOCKS_BUSY (abase));
d2db1c32 1105
d01a7826 1106 if (2 > (intptr_t) ABLOCKS_BUSY (abase))
ab6780cd 1107 { /* All the blocks are free. */
d01a7826 1108 int i = 0, aligned = (intptr_t) ABLOCKS_BUSY (abase);
ab6780cd
SM
1109 struct ablock **tem = &free_ablock;
1110 struct ablock *atop = &abase->blocks[aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1];
1111
1112 while (*tem)
1113 {
1114 if (*tem >= (struct ablock *) abase && *tem < atop)
1115 {
1116 i++;
1117 *tem = (*tem)->x.next_free;
1118 }
1119 else
1120 tem = &(*tem)->x.next_free;
1121 }
1122 eassert ((aligned & 1) == aligned);
1123 eassert (i == (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1));
349a4500 1124#ifdef USE_POSIX_MEMALIGN
d01a7826 1125 eassert ((uintptr_t) ABLOCKS_BASE (abase) % BLOCK_ALIGN == 0);
cfb2f32e 1126#endif
ab6780cd
SM
1127 free (ABLOCKS_BASE (abase));
1128 }
dafc79fa 1129 MALLOC_UNBLOCK_INPUT;
ab6780cd 1130}
3ef06d12 1131
9ac0d9e0 1132\f
2e471eb5
GM
1133/***********************************************************************
1134 Interval Allocation
1135 ***********************************************************************/
1a4f1e2c 1136
34400008
GM
1137/* Number of intervals allocated in an interval_block structure.
1138 The 1020 is 1024 minus malloc overhead. */
1139
d5e35230
JA
1140#define INTERVAL_BLOCK_SIZE \
1141 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
1142
bad98418 1143/* Intervals are allocated in chunks in the form of an interval_block
34400008
GM
1144 structure. */
1145
d5e35230 1146struct interval_block
2e471eb5 1147{
6b61353c 1148 /* Place `intervals' first, to preserve alignment. */
2e471eb5 1149 struct interval intervals[INTERVAL_BLOCK_SIZE];
6b61353c 1150 struct interval_block *next;
2e471eb5 1151};
d5e35230 1152
34400008
GM
1153/* Current interval block. Its `next' pointer points to older
1154 blocks. */
1155
d3d47262 1156static struct interval_block *interval_block;
34400008
GM
1157
1158/* Index in interval_block above of the next unused interval
1159 structure. */
1160
fff62aa9 1161static int interval_block_index = INTERVAL_BLOCK_SIZE;
34400008
GM
1162
1163/* Number of free and live intervals. */
1164
c0c5c8ae 1165static EMACS_INT total_free_intervals, total_intervals;
d5e35230 1166
34400008
GM
1167/* List of free intervals. */
1168
244ed907 1169static INTERVAL interval_free_list;
d5e35230 1170
34400008 1171/* Return a new interval. */
d5e35230
JA
1172
1173INTERVAL
971de7fb 1174make_interval (void)
d5e35230
JA
1175{
1176 INTERVAL val;
1177
dafc79fa 1178 MALLOC_BLOCK_INPUT;
cfb2f32e 1179
d5e35230
JA
1180 if (interval_free_list)
1181 {
1182 val = interval_free_list;
439d5cb4 1183 interval_free_list = INTERVAL_PARENT (interval_free_list);
d5e35230
JA
1184 }
1185 else
1186 {
1187 if (interval_block_index == INTERVAL_BLOCK_SIZE)
1188 {
38182d90
PE
1189 struct interval_block *newi
1190 = lisp_malloc (sizeof *newi, MEM_TYPE_NON_LISP);
d5e35230 1191
d5e35230
JA
1192 newi->next = interval_block;
1193 interval_block = newi;
1194 interval_block_index = 0;
3900d5de 1195 total_free_intervals += INTERVAL_BLOCK_SIZE;
d5e35230
JA
1196 }
1197 val = &interval_block->intervals[interval_block_index++];
1198 }
e2984df0 1199
dafc79fa 1200 MALLOC_UNBLOCK_INPUT;
e2984df0 1201
d5e35230 1202 consing_since_gc += sizeof (struct interval);
310ea200 1203 intervals_consed++;
3900d5de 1204 total_free_intervals--;
d5e35230 1205 RESET_INTERVAL (val);
2336fe58 1206 val->gcmarkbit = 0;
d5e35230
JA
1207 return val;
1208}
1209
34400008 1210
ee28be33 1211/* Mark Lisp objects in interval I. */
d5e35230
JA
1212
1213static void
971de7fb 1214mark_interval (register INTERVAL i, Lisp_Object dummy)
d5e35230 1215{
cce7fefc
DA
1216 /* Intervals should never be shared. So, if extra internal checking is
1217 enabled, GC aborts if it seems to have visited an interval twice. */
1218 eassert (!i->gcmarkbit);
2336fe58 1219 i->gcmarkbit = 1;
49723c04 1220 mark_object (i->plist);
d5e35230
JA
1221}
1222
34400008
GM
1223/* Mark the interval tree rooted in I. */
1224
8707c1e5
DA
1225#define MARK_INTERVAL_TREE(i) \
1226 do { \
1227 if (i && !i->gcmarkbit) \
1228 traverse_intervals_noorder (i, mark_interval, Qnil); \
2e471eb5 1229 } while (0)
77c7bcb1 1230
2e471eb5
GM
1231/***********************************************************************
1232 String Allocation
1233 ***********************************************************************/
1a4f1e2c 1234
2e471eb5
GM
1235/* Lisp_Strings are allocated in string_block structures. When a new
1236 string_block is allocated, all the Lisp_Strings it contains are
e0fead5d 1237 added to a free-list string_free_list. When a new Lisp_String is
2e471eb5
GM
1238 needed, it is taken from that list. During the sweep phase of GC,
1239 string_blocks that are entirely free are freed, except two which
1240 we keep.
7146af97 1241
2e471eb5
GM
1242 String data is allocated from sblock structures. Strings larger
1243 than LARGE_STRING_BYTES, get their own sblock, data for smaller
1244 strings is sub-allocated out of sblocks of size SBLOCK_SIZE.
7146af97 1245
2e471eb5
GM
1246 Sblocks consist internally of sdata structures, one for each
1247 Lisp_String. The sdata structure points to the Lisp_String it
1248 belongs to. The Lisp_String points back to the `u.data' member of
1249 its sdata structure.
7146af97 1250
2e471eb5
GM
1251 When a Lisp_String is freed during GC, it is put back on
1252 string_free_list, and its `data' member and its sdata's `string'
1253 pointer is set to null. The size of the string is recorded in the
fbe9e0b9 1254 `n.nbytes' member of the sdata. So, sdata structures that are no
2e471eb5
GM
1255 longer used, can be easily recognized, and it's easy to compact the
1256 sblocks of small strings which we do in compact_small_strings. */
7146af97 1257
2e471eb5
GM
1258/* Size in bytes of an sblock structure used for small strings. This
1259 is 8192 minus malloc overhead. */
7146af97 1260
2e471eb5 1261#define SBLOCK_SIZE 8188
c8099634 1262
2e471eb5
GM
1263/* Strings larger than this are considered large strings. String data
1264 for large strings is allocated from individual sblocks. */
7146af97 1265
2e471eb5
GM
1266#define LARGE_STRING_BYTES 1024
1267
fbe9e0b9 1268/* Struct or union describing string memory sub-allocated from an sblock.
2e471eb5
GM
1269 This is where the contents of Lisp strings are stored. */
1270
fbe9e0b9
PE
1271#ifdef GC_CHECK_STRING_BYTES
1272
1273typedef struct
7146af97 1274{
2e471eb5
GM
1275 /* Back-pointer to the string this sdata belongs to. If null, this
1276 structure is free, and the NBYTES member of the union below
34400008 1277 contains the string's byte size (the same value that STRING_BYTES
2e471eb5
GM
1278 would return if STRING were non-null). If non-null, STRING_BYTES
1279 (STRING) is the size of the data, and DATA contains the string's
1280 contents. */
1281 struct Lisp_String *string;
7146af97 1282
d311d28c 1283 ptrdiff_t nbytes;
fbe9e0b9
PE
1284 unsigned char data[FLEXIBLE_ARRAY_MEMBER];
1285} sdata;
177c0ea7 1286
31d929e5
GM
1287#define SDATA_NBYTES(S) (S)->nbytes
1288#define SDATA_DATA(S) (S)->data
36372bf9 1289#define SDATA_SELECTOR(member) member
177c0ea7 1290
fbe9e0b9 1291#else
31d929e5 1292
fbe9e0b9
PE
1293typedef union
1294{
1295 struct Lisp_String *string;
1296
1297 /* When STRING is non-null. */
1298 struct
2e471eb5 1299 {
fbe9e0b9
PE
1300 struct Lisp_String *string;
1301 unsigned char data[FLEXIBLE_ARRAY_MEMBER];
1302 } u;
2e471eb5 1303
fbe9e0b9
PE
1304 /* When STRING is null. */
1305 struct
1306 {
1307 struct Lisp_String *string;
d311d28c 1308 ptrdiff_t nbytes;
fbe9e0b9
PE
1309 } n;
1310} sdata;
177c0ea7 1311
fbe9e0b9 1312#define SDATA_NBYTES(S) (S)->n.nbytes
31d929e5 1313#define SDATA_DATA(S) (S)->u.data
36372bf9 1314#define SDATA_SELECTOR(member) u.member
31d929e5
GM
1315
1316#endif /* not GC_CHECK_STRING_BYTES */
36372bf9 1317
fbe9e0b9 1318#define SDATA_DATA_OFFSET offsetof (sdata, SDATA_SELECTOR (data))
2e471eb5 1319
31d929e5 1320
2e471eb5
GM
1321/* Structure describing a block of memory which is sub-allocated to
1322 obtain string data memory for strings. Blocks for small strings
1323 are of fixed size SBLOCK_SIZE. Blocks for large strings are made
1324 as large as needed. */
1325
1326struct sblock
7146af97 1327{
2e471eb5
GM
1328 /* Next in list. */
1329 struct sblock *next;
7146af97 1330
2e471eb5
GM
1331 /* Pointer to the next free sdata block. This points past the end
1332 of the sblock if there isn't any space left in this block. */
fbe9e0b9 1333 sdata *next_free;
2e471eb5
GM
1334
1335 /* Start of data. */
fbe9e0b9 1336 sdata first_data;
2e471eb5
GM
1337};
1338
1339/* Number of Lisp strings in a string_block structure. The 1020 is
1340 1024 minus malloc overhead. */
1341
19bcad1f 1342#define STRING_BLOCK_SIZE \
2e471eb5
GM
1343 ((1020 - sizeof (struct string_block *)) / sizeof (struct Lisp_String))
1344
1345/* Structure describing a block from which Lisp_String structures
1346 are allocated. */
1347
1348struct string_block
7146af97 1349{
6b61353c 1350 /* Place `strings' first, to preserve alignment. */
19bcad1f 1351 struct Lisp_String strings[STRING_BLOCK_SIZE];
6b61353c 1352 struct string_block *next;
2e471eb5 1353};
7146af97 1354
2e471eb5
GM
1355/* Head and tail of the list of sblock structures holding Lisp string
1356 data. We always allocate from current_sblock. The NEXT pointers
1357 in the sblock structures go from oldest_sblock to current_sblock. */
3c06d205 1358
2e471eb5 1359static struct sblock *oldest_sblock, *current_sblock;
7146af97 1360
2e471eb5 1361/* List of sblocks for large strings. */
7146af97 1362
2e471eb5 1363static struct sblock *large_sblocks;
7146af97 1364
5a25e253 1365/* List of string_block structures. */
7146af97 1366
2e471eb5 1367static struct string_block *string_blocks;
7146af97 1368
2e471eb5 1369/* Free-list of Lisp_Strings. */
7146af97 1370
2e471eb5 1371static struct Lisp_String *string_free_list;
7146af97 1372
2e471eb5 1373/* Number of live and free Lisp_Strings. */
c8099634 1374
c0c5c8ae 1375static EMACS_INT total_strings, total_free_strings;
7146af97 1376
2e471eb5
GM
1377/* Number of bytes used by live strings. */
1378
3ab6e069 1379static EMACS_INT total_string_bytes;
2e471eb5
GM
1380
1381/* Given a pointer to a Lisp_String S which is on the free-list
1382 string_free_list, return a pointer to its successor in the
1383 free-list. */
1384
1385#define NEXT_FREE_LISP_STRING(S) (*(struct Lisp_String **) (S))
1386
1387/* Return a pointer to the sdata structure belonging to Lisp string S.
1388 S must be live, i.e. S->data must not be null. S->data is actually
1389 a pointer to the `u.data' member of its sdata structure; the
1390 structure starts at a constant offset in front of that. */
177c0ea7 1391
fbe9e0b9 1392#define SDATA_OF_STRING(S) ((sdata *) ((S)->data - SDATA_DATA_OFFSET))
31d929e5 1393
212f33f1
KS
1394
1395#ifdef GC_CHECK_STRING_OVERRUN
bdbed949
KS
1396
1397/* We check for overrun in string data blocks by appending a small
1398 "cookie" after each allocated string data block, and check for the
8349069c 1399 presence of this cookie during GC. */
bdbed949
KS
1400
1401#define GC_STRING_OVERRUN_COOKIE_SIZE 4
bfd1c781
PE
1402static char const string_overrun_cookie[GC_STRING_OVERRUN_COOKIE_SIZE] =
1403 { '\xde', '\xad', '\xbe', '\xef' };
bdbed949 1404
212f33f1 1405#else
bdbed949 1406#define GC_STRING_OVERRUN_COOKIE_SIZE 0
212f33f1
KS
1407#endif
1408
2e471eb5
GM
1409/* Value is the size of an sdata structure large enough to hold NBYTES
1410 bytes of string data. The value returned includes a terminating
1411 NUL byte, the size of the sdata structure, and padding. */
1412
31d929e5
GM
1413#ifdef GC_CHECK_STRING_BYTES
1414
2e471eb5 1415#define SDATA_SIZE(NBYTES) \
36372bf9 1416 ((SDATA_DATA_OFFSET \
2e471eb5 1417 + (NBYTES) + 1 \
d311d28c
PE
1418 + sizeof (ptrdiff_t) - 1) \
1419 & ~(sizeof (ptrdiff_t) - 1))
2e471eb5 1420
31d929e5
GM
1421#else /* not GC_CHECK_STRING_BYTES */
1422
f2d3008d
PE
1423/* The 'max' reserves space for the nbytes union member even when NBYTES + 1 is
1424 less than the size of that member. The 'max' is not needed when
d311d28c 1425 SDATA_DATA_OFFSET is a multiple of sizeof (ptrdiff_t), because then the
f2d3008d
PE
1426 alignment code reserves enough space. */
1427
1428#define SDATA_SIZE(NBYTES) \
1429 ((SDATA_DATA_OFFSET \
d311d28c 1430 + (SDATA_DATA_OFFSET % sizeof (ptrdiff_t) == 0 \
f2d3008d 1431 ? NBYTES \
d311d28c 1432 : max (NBYTES, sizeof (ptrdiff_t) - 1)) \
f2d3008d 1433 + 1 \
d311d28c
PE
1434 + sizeof (ptrdiff_t) - 1) \
1435 & ~(sizeof (ptrdiff_t) - 1))
31d929e5
GM
1436
1437#endif /* not GC_CHECK_STRING_BYTES */
2e471eb5 1438
bdbed949
KS
1439/* Extra bytes to allocate for each string. */
1440
1441#define GC_STRING_EXTRA (GC_STRING_OVERRUN_COOKIE_SIZE)
1442
c9d624c6
PE
1443/* Exact bound on the number of bytes in a string, not counting the
1444 terminating null. A string cannot contain more bytes than
1445 STRING_BYTES_BOUND, nor can it be so long that the size_t
1446 arithmetic in allocate_string_data would overflow while it is
1447 calculating a value to be passed to malloc. */
03a660a6
PE
1448static ptrdiff_t const STRING_BYTES_MAX =
1449 min (STRING_BYTES_BOUND,
1450 ((SIZE_MAX - XMALLOC_OVERRUN_CHECK_OVERHEAD
1451 - GC_STRING_EXTRA
1452 - offsetof (struct sblock, first_data)
1453 - SDATA_DATA_OFFSET)
1454 & ~(sizeof (EMACS_INT) - 1)));
c9d624c6 1455
2e471eb5 1456/* Initialize string allocation. Called from init_alloc_once. */
d457598b 1457
d3d47262 1458static void
971de7fb 1459init_strings (void)
7146af97 1460{
4d774b0f
JB
1461 empty_unibyte_string = make_pure_string ("", 0, 0, 0);
1462 empty_multibyte_string = make_pure_string ("", 0, 0, 1);
7146af97
JB
1463}
1464
2e471eb5 1465
361b097f
GM
1466#ifdef GC_CHECK_STRING_BYTES
1467
361b097f
GM
1468static int check_string_bytes_count;
1469
e499d0ee
DA
1470/* Like STRING_BYTES, but with debugging check. Can be
1471 called during GC, so pay attention to the mark bit. */
676a7251 1472
d311d28c 1473ptrdiff_t
14162469 1474string_bytes (struct Lisp_String *s)
676a7251 1475{
d311d28c 1476 ptrdiff_t nbytes =
14162469
EZ
1477 (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte);
1478
676a7251
GM
1479 if (!PURE_POINTER_P (s)
1480 && s->data
1481 && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
1088b922 1482 emacs_abort ();
676a7251
GM
1483 return nbytes;
1484}
177c0ea7 1485
2c5bd608 1486/* Check validity of Lisp strings' string_bytes member in B. */
676a7251 1487
d3d47262 1488static void
d0f4e1f5 1489check_sblock (struct sblock *b)
361b097f 1490{
fbe9e0b9 1491 sdata *from, *end, *from_end;
177c0ea7 1492
676a7251 1493 end = b->next_free;
177c0ea7 1494
676a7251 1495 for (from = &b->first_data; from < end; from = from_end)
361b097f 1496 {
676a7251
GM
1497 /* Compute the next FROM here because copying below may
1498 overwrite data we need to compute it. */
d311d28c 1499 ptrdiff_t nbytes;
177c0ea7 1500
676a7251 1501 /* Check that the string size recorded in the string is the
ee28be33 1502 same as the one recorded in the sdata structure. */
e499d0ee
DA
1503 nbytes = SDATA_SIZE (from->string ? string_bytes (from->string)
1504 : SDATA_NBYTES (from));
fbe9e0b9 1505 from_end = (sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
676a7251
GM
1506 }
1507}
361b097f 1508
676a7251
GM
1509
1510/* Check validity of Lisp strings' string_bytes member. ALL_P
fce31d69 1511 means check all strings, otherwise check only most
676a7251
GM
1512 recently allocated strings. Used for hunting a bug. */
1513
d3d47262 1514static void
fce31d69 1515check_string_bytes (bool all_p)
676a7251
GM
1516{
1517 if (all_p)
1518 {
1519 struct sblock *b;
1520
1521 for (b = large_sblocks; b; b = b->next)
1522 {
1523 struct Lisp_String *s = b->first_data.string;
1524 if (s)
e499d0ee 1525 string_bytes (s);
361b097f 1526 }
177c0ea7 1527
676a7251
GM
1528 for (b = oldest_sblock; b; b = b->next)
1529 check_sblock (b);
361b097f 1530 }
296094c3 1531 else if (current_sblock)
676a7251 1532 check_sblock (current_sblock);
361b097f
GM
1533}
1534
e499d0ee
DA
1535#else /* not GC_CHECK_STRING_BYTES */
1536
1537#define check_string_bytes(all) ((void) 0)
1538
361b097f
GM
1539#endif /* GC_CHECK_STRING_BYTES */
1540
212f33f1
KS
1541#ifdef GC_CHECK_STRING_FREE_LIST
1542
bdbed949
KS
1543/* Walk through the string free list looking for bogus next pointers.
1544 This may catch buffer overrun from a previous string. */
1545
212f33f1 1546static void
d0f4e1f5 1547check_string_free_list (void)
212f33f1
KS
1548{
1549 struct Lisp_String *s;
1550
1551 /* Pop a Lisp_String off the free-list. */
1552 s = string_free_list;
1553 while (s != NULL)
1554 {
d01a7826 1555 if ((uintptr_t) s < 1024)
1088b922 1556 emacs_abort ();
212f33f1
KS
1557 s = NEXT_FREE_LISP_STRING (s);
1558 }
1559}
1560#else
1561#define check_string_free_list()
1562#endif
361b097f 1563
2e471eb5
GM
1564/* Return a new Lisp_String. */
1565
1566static struct Lisp_String *
971de7fb 1567allocate_string (void)
7146af97 1568{
2e471eb5 1569 struct Lisp_String *s;
7146af97 1570
dafc79fa 1571 MALLOC_BLOCK_INPUT;
cfb2f32e 1572
2e471eb5
GM
1573 /* If the free-list is empty, allocate a new string_block, and
1574 add all the Lisp_Strings in it to the free-list. */
1575 if (string_free_list == NULL)
7146af97 1576 {
38182d90 1577 struct string_block *b = lisp_malloc (sizeof *b, MEM_TYPE_STRING);
2e471eb5
GM
1578 int i;
1579
2e471eb5
GM
1580 b->next = string_blocks;
1581 string_blocks = b;
2e471eb5 1582
19bcad1f 1583 for (i = STRING_BLOCK_SIZE - 1; i >= 0; --i)
7146af97 1584 {
2e471eb5 1585 s = b->strings + i;
3fe6dd74
DA
1586 /* Every string on a free list should have NULL data pointer. */
1587 s->data = NULL;
2e471eb5
GM
1588 NEXT_FREE_LISP_STRING (s) = string_free_list;
1589 string_free_list = s;
7146af97 1590 }
2e471eb5 1591
19bcad1f 1592 total_free_strings += STRING_BLOCK_SIZE;
7146af97 1593 }
c0f51373 1594
bdbed949 1595 check_string_free_list ();
212f33f1 1596
2e471eb5
GM
1597 /* Pop a Lisp_String off the free-list. */
1598 s = string_free_list;
1599 string_free_list = NEXT_FREE_LISP_STRING (s);
c0f51373 1600
dafc79fa 1601 MALLOC_UNBLOCK_INPUT;
e2984df0 1602
2e471eb5
GM
1603 --total_free_strings;
1604 ++total_strings;
1605 ++strings_consed;
1606 consing_since_gc += sizeof *s;
c0f51373 1607
361b097f 1608#ifdef GC_CHECK_STRING_BYTES
e39a993c 1609 if (!noninteractive)
361b097f 1610 {
676a7251
GM
1611 if (++check_string_bytes_count == 200)
1612 {
1613 check_string_bytes_count = 0;
1614 check_string_bytes (1);
1615 }
1616 else
1617 check_string_bytes (0);
361b097f 1618 }
676a7251 1619#endif /* GC_CHECK_STRING_BYTES */
361b097f 1620
2e471eb5 1621 return s;
c0f51373 1622}
7146af97 1623
7146af97 1624
2e471eb5
GM
1625/* Set up Lisp_String S for holding NCHARS characters, NBYTES bytes,
1626 plus a NUL byte at the end. Allocate an sdata structure for S, and
1627 set S->data to its `u.data' member. Store a NUL byte at the end of
1628 S->data. Set S->size to NCHARS and S->size_byte to NBYTES. Free
1629 S->data if it was initially non-null. */
7146af97 1630
2e471eb5 1631void
413d18e7
EZ
1632allocate_string_data (struct Lisp_String *s,
1633 EMACS_INT nchars, EMACS_INT nbytes)
7146af97 1634{
fbe9e0b9 1635 sdata *data, *old_data;
2e471eb5 1636 struct sblock *b;
b7ffe040 1637 ptrdiff_t needed, old_nbytes;
7146af97 1638
c9d624c6
PE
1639 if (STRING_BYTES_MAX < nbytes)
1640 string_overflow ();
1641
2e471eb5
GM
1642 /* Determine the number of bytes needed to store NBYTES bytes
1643 of string data. */
1644 needed = SDATA_SIZE (nbytes);
b7ffe040
DA
1645 if (s->data)
1646 {
1647 old_data = SDATA_OF_STRING (s);
e499d0ee 1648 old_nbytes = STRING_BYTES (s);
b7ffe040
DA
1649 }
1650 else
1651 old_data = NULL;
e2984df0 1652
dafc79fa 1653 MALLOC_BLOCK_INPUT;
7146af97 1654
2e471eb5
GM
1655 if (nbytes > LARGE_STRING_BYTES)
1656 {
36372bf9 1657 size_t size = offsetof (struct sblock, first_data) + needed;
2e471eb5
GM
1658
1659#ifdef DOUG_LEA_MALLOC
f8608968
GM
1660 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
1661 because mapped region contents are not preserved in
d36b182f
DL
1662 a dumped Emacs.
1663
1664 In case you think of allowing it in a dumped Emacs at the
1665 cost of not being able to re-dump, there's another reason:
1666 mmap'ed data typically have an address towards the top of the
1667 address space, which won't fit into an EMACS_INT (at least on
1668 32-bit systems with the current tagging scheme). --fx */
2e471eb5
GM
1669 mallopt (M_MMAP_MAX, 0);
1670#endif
1671
38182d90 1672 b = lisp_malloc (size + GC_STRING_EXTRA, MEM_TYPE_NON_LISP);
177c0ea7 1673
2e471eb5 1674#ifdef DOUG_LEA_MALLOC
b09cca6a 1675 /* Back to a reasonable maximum of mmap'ed areas. */
2e471eb5
GM
1676 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1677#endif
177c0ea7 1678
2e471eb5
GM
1679 b->next_free = &b->first_data;
1680 b->first_data.string = NULL;
1681 b->next = large_sblocks;
1682 large_sblocks = b;
1683 }
1684 else if (current_sblock == NULL
1685 || (((char *) current_sblock + SBLOCK_SIZE
1686 - (char *) current_sblock->next_free)
212f33f1 1687 < (needed + GC_STRING_EXTRA)))
2e471eb5
GM
1688 {
1689 /* Not enough room in the current sblock. */
38182d90 1690 b = lisp_malloc (SBLOCK_SIZE, MEM_TYPE_NON_LISP);
2e471eb5
GM
1691 b->next_free = &b->first_data;
1692 b->first_data.string = NULL;
1693 b->next = NULL;
1694
1695 if (current_sblock)
1696 current_sblock->next = b;
1697 else
1698 oldest_sblock = b;
1699 current_sblock = b;
1700 }
1701 else
1702 b = current_sblock;
5c5fecb3 1703
2e471eb5 1704 data = b->next_free;
fbe9e0b9 1705 b->next_free = (sdata *) ((char *) data + needed + GC_STRING_EXTRA);
a0b08700 1706
dafc79fa 1707 MALLOC_UNBLOCK_INPUT;
e2984df0 1708
2e471eb5 1709 data->string = s;
31d929e5
GM
1710 s->data = SDATA_DATA (data);
1711#ifdef GC_CHECK_STRING_BYTES
1712 SDATA_NBYTES (data) = nbytes;
1713#endif
2e471eb5
GM
1714 s->size = nchars;
1715 s->size_byte = nbytes;
1716 s->data[nbytes] = '\0';
212f33f1 1717#ifdef GC_CHECK_STRING_OVERRUN
000098c1
PE
1718 memcpy ((char *) data + needed, string_overrun_cookie,
1719 GC_STRING_OVERRUN_COOKIE_SIZE);
212f33f1 1720#endif
b7ffe040
DA
1721
1722 /* Note that Faset may call to this function when S has already data
1723 assigned. In this case, mark data as free by setting it's string
1724 back-pointer to null, and record the size of the data in it. */
1725 if (old_data)
1726 {
1727 SDATA_NBYTES (old_data) = old_nbytes;
1728 old_data->string = NULL;
1729 }
1730
2e471eb5
GM
1731 consing_since_gc += needed;
1732}
1733
1734
1735/* Sweep and compact strings. */
1736
1737static void
971de7fb 1738sweep_strings (void)
2e471eb5
GM
1739{
1740 struct string_block *b, *next;
1741 struct string_block *live_blocks = NULL;
177c0ea7 1742
2e471eb5
GM
1743 string_free_list = NULL;
1744 total_strings = total_free_strings = 0;
3ab6e069 1745 total_string_bytes = 0;
2e471eb5
GM
1746
1747 /* Scan strings_blocks, free Lisp_Strings that aren't marked. */
1748 for (b = string_blocks; b; b = next)
1749 {
1750 int i, nfree = 0;
1751 struct Lisp_String *free_list_before = string_free_list;
1752
1753 next = b->next;
1754
19bcad1f 1755 for (i = 0; i < STRING_BLOCK_SIZE; ++i)
2e471eb5
GM
1756 {
1757 struct Lisp_String *s = b->strings + i;
1758
1759 if (s->data)
1760 {
1761 /* String was not on free-list before. */
1762 if (STRING_MARKED_P (s))
1763 {
1764 /* String is live; unmark it and its intervals. */
1765 UNMARK_STRING (s);
177c0ea7 1766
8707c1e5
DA
1767 /* Do not use string_(set|get)_intervals here. */
1768 s->intervals = balance_intervals (s->intervals);
2e471eb5
GM
1769
1770 ++total_strings;
3ab6e069 1771 total_string_bytes += STRING_BYTES (s);
2e471eb5
GM
1772 }
1773 else
1774 {
1775 /* String is dead. Put it on the free-list. */
fbe9e0b9 1776 sdata *data = SDATA_OF_STRING (s);
2e471eb5
GM
1777
1778 /* Save the size of S in its sdata so that we know
1779 how large that is. Reset the sdata's string
1780 back-pointer so that we know it's free. */
31d929e5 1781#ifdef GC_CHECK_STRING_BYTES
e499d0ee 1782 if (string_bytes (s) != SDATA_NBYTES (data))
1088b922 1783 emacs_abort ();
31d929e5 1784#else
fbe9e0b9 1785 data->n.nbytes = STRING_BYTES (s);
31d929e5 1786#endif
2e471eb5
GM
1787 data->string = NULL;
1788
1789 /* Reset the strings's `data' member so that we
1790 know it's free. */
1791 s->data = NULL;
1792
1793 /* Put the string on the free-list. */
1794 NEXT_FREE_LISP_STRING (s) = string_free_list;
1795 string_free_list = s;
1796 ++nfree;
1797 }
1798 }
1799 else
1800 {
1801 /* S was on the free-list before. Put it there again. */
1802 NEXT_FREE_LISP_STRING (s) = string_free_list;
1803 string_free_list = s;
1804 ++nfree;
1805 }
1806 }
1807
34400008 1808 /* Free blocks that contain free Lisp_Strings only, except
2e471eb5 1809 the first two of them. */
19bcad1f
SM
1810 if (nfree == STRING_BLOCK_SIZE
1811 && total_free_strings > STRING_BLOCK_SIZE)
2e471eb5
GM
1812 {
1813 lisp_free (b);
2e471eb5
GM
1814 string_free_list = free_list_before;
1815 }
1816 else
1817 {
1818 total_free_strings += nfree;
1819 b->next = live_blocks;
1820 live_blocks = b;
1821 }
1822 }
1823
bdbed949 1824 check_string_free_list ();
212f33f1 1825
2e471eb5
GM
1826 string_blocks = live_blocks;
1827 free_large_strings ();
1828 compact_small_strings ();
212f33f1 1829
bdbed949 1830 check_string_free_list ();
2e471eb5
GM
1831}
1832
1833
1834/* Free dead large strings. */
1835
1836static void
971de7fb 1837free_large_strings (void)
2e471eb5
GM
1838{
1839 struct sblock *b, *next;
1840 struct sblock *live_blocks = NULL;
177c0ea7 1841
2e471eb5
GM
1842 for (b = large_sblocks; b; b = next)
1843 {
1844 next = b->next;
1845
1846 if (b->first_data.string == NULL)
1847 lisp_free (b);
1848 else
1849 {
1850 b->next = live_blocks;
1851 live_blocks = b;
1852 }
1853 }
1854
1855 large_sblocks = live_blocks;
1856}
1857
1858
1859/* Compact data of small strings. Free sblocks that don't contain
1860 data of live strings after compaction. */
1861
1862static void
971de7fb 1863compact_small_strings (void)
2e471eb5
GM
1864{
1865 struct sblock *b, *tb, *next;
fbe9e0b9
PE
1866 sdata *from, *to, *end, *tb_end;
1867 sdata *to_end, *from_end;
2e471eb5
GM
1868
1869 /* TB is the sblock we copy to, TO is the sdata within TB we copy
1870 to, and TB_END is the end of TB. */
1871 tb = oldest_sblock;
fbe9e0b9 1872 tb_end = (sdata *) ((char *) tb + SBLOCK_SIZE);
2e471eb5
GM
1873 to = &tb->first_data;
1874
1875 /* Step through the blocks from the oldest to the youngest. We
1876 expect that old blocks will stabilize over time, so that less
1877 copying will happen this way. */
1878 for (b = oldest_sblock; b; b = b->next)
1879 {
1880 end = b->next_free;
a54e2c05 1881 eassert ((char *) end <= (char *) b + SBLOCK_SIZE);
177c0ea7 1882
2e471eb5
GM
1883 for (from = &b->first_data; from < end; from = from_end)
1884 {
1885 /* Compute the next FROM here because copying below may
1886 overwrite data we need to compute it. */
d311d28c 1887 ptrdiff_t nbytes;
e499d0ee 1888 struct Lisp_String *s = from->string;
2e471eb5 1889
31d929e5
GM
1890#ifdef GC_CHECK_STRING_BYTES
1891 /* Check that the string size recorded in the string is the
b09cca6a 1892 same as the one recorded in the sdata structure. */
e499d0ee 1893 if (s && string_bytes (s) != SDATA_NBYTES (from))
1088b922 1894 emacs_abort ();
31d929e5 1895#endif /* GC_CHECK_STRING_BYTES */
177c0ea7 1896
e499d0ee
DA
1897 nbytes = s ? STRING_BYTES (s) : SDATA_NBYTES (from);
1898 eassert (nbytes <= LARGE_STRING_BYTES);
212f33f1 1899
2e471eb5 1900 nbytes = SDATA_SIZE (nbytes);
fbe9e0b9 1901 from_end = (sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
212f33f1
KS
1902
1903#ifdef GC_CHECK_STRING_OVERRUN
72af86bd
AS
1904 if (memcmp (string_overrun_cookie,
1905 (char *) from_end - GC_STRING_OVERRUN_COOKIE_SIZE,
1906 GC_STRING_OVERRUN_COOKIE_SIZE))
1088b922 1907 emacs_abort ();
212f33f1 1908#endif
177c0ea7 1909
e499d0ee
DA
1910 /* Non-NULL S means it's alive. Copy its data. */
1911 if (s)
2e471eb5
GM
1912 {
1913 /* If TB is full, proceed with the next sblock. */
fbe9e0b9 1914 to_end = (sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
2e471eb5
GM
1915 if (to_end > tb_end)
1916 {
1917 tb->next_free = to;
1918 tb = tb->next;
fbe9e0b9 1919 tb_end = (sdata *) ((char *) tb + SBLOCK_SIZE);
2e471eb5 1920 to = &tb->first_data;
fbe9e0b9 1921 to_end = (sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
2e471eb5 1922 }
177c0ea7 1923
2e471eb5
GM
1924 /* Copy, and update the string's `data' pointer. */
1925 if (from != to)
1926 {
a54e2c05 1927 eassert (tb != b || to < from);
72af86bd 1928 memmove (to, from, nbytes + GC_STRING_EXTRA);
31d929e5 1929 to->string->data = SDATA_DATA (to);
2e471eb5
GM
1930 }
1931
1932 /* Advance past the sdata we copied to. */
1933 to = to_end;
1934 }
1935 }
1936 }
1937
1938 /* The rest of the sblocks following TB don't contain live data, so
1939 we can free them. */
1940 for (b = tb->next; b; b = next)
1941 {
1942 next = b->next;
1943 lisp_free (b);
1944 }
1945
1946 tb->next_free = to;
1947 tb->next = NULL;
1948 current_sblock = tb;
1949}
1950
cb93f9be
PE
1951void
1952string_overflow (void)
1953{
1954 error ("Maximum string size exceeded");
1955}
2e471eb5 1956
a7ca3326 1957DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
69623621
RS
1958 doc: /* Return a newly created string of length LENGTH, with INIT in each element.
1959LENGTH must be an integer.
1960INIT must be an integer that represents a character. */)
5842a27b 1961 (Lisp_Object length, Lisp_Object init)
2e471eb5
GM
1962{
1963 register Lisp_Object val;
1964 register unsigned char *p, *end;
14162469
EZ
1965 int c;
1966 EMACS_INT nbytes;
2e471eb5 1967
b7826503 1968 CHECK_NATNUM (length);
2bccce07 1969 CHECK_CHARACTER (init);
2e471eb5 1970
2bccce07 1971 c = XFASTINT (init);
830ff83b 1972 if (ASCII_CHAR_P (c))
2e471eb5
GM
1973 {
1974 nbytes = XINT (length);
1975 val = make_uninit_string (nbytes);
d5db4077
KR
1976 p = SDATA (val);
1977 end = p + SCHARS (val);
2e471eb5
GM
1978 while (p != end)
1979 *p++ = c;
1980 }
1981 else
1982 {
d942b71c 1983 unsigned char str[MAX_MULTIBYTE_LENGTH];
2e471eb5 1984 int len = CHAR_STRING (c, str);
14162469 1985 EMACS_INT string_len = XINT (length);
2e471eb5 1986
d1f3d2af 1987 if (string_len > STRING_BYTES_MAX / len)
cb93f9be 1988 string_overflow ();
14162469
EZ
1989 nbytes = len * string_len;
1990 val = make_uninit_multibyte_string (string_len, nbytes);
d5db4077 1991 p = SDATA (val);
2e471eb5
GM
1992 end = p + nbytes;
1993 while (p != end)
1994 {
72af86bd 1995 memcpy (p, str, len);
2e471eb5
GM
1996 p += len;
1997 }
1998 }
177c0ea7 1999
2e471eb5
GM
2000 *p = 0;
2001 return val;
2002}
2003
2004
a7ca3326 2005DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
909e3b33 2006 doc: /* Return a new bool-vector of length LENGTH, using INIT for each element.
7ee72033 2007LENGTH must be a number. INIT matters only in whether it is t or nil. */)
5842a27b 2008 (Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2009{
2010 register Lisp_Object val;
2011 struct Lisp_Bool_Vector *p;
d311d28c
PE
2012 ptrdiff_t length_in_chars;
2013 EMACS_INT length_in_elts;
14162469 2014 int bits_per_value;
d06714cb
PE
2015 int extra_bool_elts = ((bool_header_size - header_size + word_size - 1)
2016 / word_size);
2e471eb5 2017
b7826503 2018 CHECK_NATNUM (length);
2e471eb5 2019
a097329f 2020 bits_per_value = sizeof (EMACS_INT) * BOOL_VECTOR_BITS_PER_CHAR;
2e471eb5
GM
2021
2022 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
2e471eb5 2023
d06714cb 2024 val = Fmake_vector (make_number (length_in_elts + extra_bool_elts), Qnil);
177c0ea7 2025
eab3844f 2026 /* No Lisp_Object to trace in there. */
914adc42 2027 XSETPVECTYPESIZE (XVECTOR (val), PVEC_BOOL_VECTOR, 0, 0);
d2029e5b
SM
2028
2029 p = XBOOL_VECTOR (val);
2e471eb5 2030 p->size = XFASTINT (length);
177c0ea7 2031
d311d28c
PE
2032 length_in_chars = ((XFASTINT (length) + BOOL_VECTOR_BITS_PER_CHAR - 1)
2033 / BOOL_VECTOR_BITS_PER_CHAR);
c0c1ee9f
PE
2034 if (length_in_chars)
2035 {
2036 memset (p->data, ! NILP (init) ? -1 : 0, length_in_chars);
177c0ea7 2037
c0c1ee9f
PE
2038 /* Clear any extraneous bits in the last byte. */
2039 p->data[length_in_chars - 1]
83713154 2040 &= (1 << ((XFASTINT (length) - 1) % BOOL_VECTOR_BITS_PER_CHAR + 1)) - 1;
c0c1ee9f 2041 }
2e471eb5
GM
2042
2043 return val;
2044}
2045
2046
2047/* Make a string from NBYTES bytes at CONTENTS, and compute the number
2048 of characters from the contents. This string may be unibyte or
2049 multibyte, depending on the contents. */
2050
2051Lisp_Object
d311d28c 2052make_string (const char *contents, ptrdiff_t nbytes)
2e471eb5
GM
2053{
2054 register Lisp_Object val;
d311d28c 2055 ptrdiff_t nchars, multibyte_nbytes;
9eac9d59 2056
90256841
PE
2057 parse_str_as_multibyte ((const unsigned char *) contents, nbytes,
2058 &nchars, &multibyte_nbytes);
9eac9d59
KH
2059 if (nbytes == nchars || nbytes != multibyte_nbytes)
2060 /* CONTENTS contains no multibyte sequences or contains an invalid
2061 multibyte sequence. We must make unibyte string. */
495a6df3
KH
2062 val = make_unibyte_string (contents, nbytes);
2063 else
2064 val = make_multibyte_string (contents, nchars, nbytes);
2e471eb5
GM
2065 return val;
2066}
2067
2068
2069/* Make an unibyte string from LENGTH bytes at CONTENTS. */
2070
2071Lisp_Object
d311d28c 2072make_unibyte_string (const char *contents, ptrdiff_t length)
2e471eb5
GM
2073{
2074 register Lisp_Object val;
2075 val = make_uninit_string (length);
72af86bd 2076 memcpy (SDATA (val), contents, length);
2e471eb5
GM
2077 return val;
2078}
2079
2080
2081/* Make a multibyte string from NCHARS characters occupying NBYTES
2082 bytes at CONTENTS. */
2083
2084Lisp_Object
14162469 2085make_multibyte_string (const char *contents,
d311d28c 2086 ptrdiff_t nchars, ptrdiff_t nbytes)
2e471eb5
GM
2087{
2088 register Lisp_Object val;
2089 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2090 memcpy (SDATA (val), contents, nbytes);
2e471eb5
GM
2091 return val;
2092}
2093
2094
2095/* Make a string from NCHARS characters occupying NBYTES bytes at
2096 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
2097
2098Lisp_Object
14162469 2099make_string_from_bytes (const char *contents,
d311d28c 2100 ptrdiff_t nchars, ptrdiff_t nbytes)
2e471eb5
GM
2101{
2102 register Lisp_Object val;
2103 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2104 memcpy (SDATA (val), contents, nbytes);
d5db4077
KR
2105 if (SBYTES (val) == SCHARS (val))
2106 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2107 return val;
2108}
2109
2110
2111/* Make a string from NCHARS characters occupying NBYTES bytes at
2112 CONTENTS. The argument MULTIBYTE controls whether to label the
229b28c4
KH
2113 string as multibyte. If NCHARS is negative, it counts the number of
2114 characters by itself. */
2e471eb5
GM
2115
2116Lisp_Object
14162469 2117make_specified_string (const char *contents,
fce31d69 2118 ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
2e471eb5 2119{
fce31d69 2120 Lisp_Object val;
229b28c4
KH
2121
2122 if (nchars < 0)
2123 {
2124 if (multibyte)
90256841
PE
2125 nchars = multibyte_chars_in_text ((const unsigned char *) contents,
2126 nbytes);
229b28c4
KH
2127 else
2128 nchars = nbytes;
2129 }
2e471eb5 2130 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2131 memcpy (SDATA (val), contents, nbytes);
2e471eb5 2132 if (!multibyte)
d5db4077 2133 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2134 return val;
2135}
2136
2137
2e471eb5
GM
2138/* Return an unibyte Lisp_String set up to hold LENGTH characters
2139 occupying LENGTH bytes. */
2140
2141Lisp_Object
413d18e7 2142make_uninit_string (EMACS_INT length)
2e471eb5
GM
2143{
2144 Lisp_Object val;
4d774b0f
JB
2145
2146 if (!length)
2147 return empty_unibyte_string;
2e471eb5 2148 val = make_uninit_multibyte_string (length, length);
d5db4077 2149 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2150 return val;
2151}
2152
2153
2154/* Return a multibyte Lisp_String set up to hold NCHARS characters
2155 which occupy NBYTES bytes. */
2156
2157Lisp_Object
413d18e7 2158make_uninit_multibyte_string (EMACS_INT nchars, EMACS_INT nbytes)
2e471eb5
GM
2159{
2160 Lisp_Object string;
2161 struct Lisp_String *s;
2162
2163 if (nchars < 0)
1088b922 2164 emacs_abort ();
4d774b0f
JB
2165 if (!nbytes)
2166 return empty_multibyte_string;
2e471eb5
GM
2167
2168 s = allocate_string ();
77c7bcb1 2169 s->intervals = NULL;
2e471eb5
GM
2170 allocate_string_data (s, nchars, nbytes);
2171 XSETSTRING (string, s);
2172 string_chars_consed += nbytes;
2173 return string;
2174}
2175
a8290ec3
DA
2176/* Print arguments to BUF according to a FORMAT, then return
2177 a Lisp_String initialized with the data from BUF. */
2178
2179Lisp_Object
2180make_formatted_string (char *buf, const char *format, ...)
2181{
2182 va_list ap;
26bccfae 2183 int length;
a8290ec3
DA
2184
2185 va_start (ap, format);
2186 length = vsprintf (buf, format, ap);
2187 va_end (ap);
2188 return make_string (buf, length);
2189}
2e471eb5
GM
2190
2191\f
2192/***********************************************************************
2193 Float Allocation
2194 ***********************************************************************/
2195
2e471eb5
GM
2196/* We store float cells inside of float_blocks, allocating a new
2197 float_block with malloc whenever necessary. Float cells reclaimed
2198 by GC are put on a free list to be reallocated before allocating
ab6780cd 2199 any new float cells from the latest float_block. */
2e471eb5 2200
6b61353c
KH
2201#define FLOAT_BLOCK_SIZE \
2202 (((BLOCK_BYTES - sizeof (struct float_block *) \
2203 /* The compiler might add padding at the end. */ \
2204 - (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \
ab6780cd
SM
2205 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
2206
2207#define GETMARKBIT(block,n) \
5e617bc2
JB
2208 (((block)->gcmarkbits[(n) / (sizeof (int) * CHAR_BIT)] \
2209 >> ((n) % (sizeof (int) * CHAR_BIT))) \
ab6780cd
SM
2210 & 1)
2211
2212#define SETMARKBIT(block,n) \
5e617bc2
JB
2213 (block)->gcmarkbits[(n) / (sizeof (int) * CHAR_BIT)] \
2214 |= 1 << ((n) % (sizeof (int) * CHAR_BIT))
ab6780cd
SM
2215
2216#define UNSETMARKBIT(block,n) \
5e617bc2
JB
2217 (block)->gcmarkbits[(n) / (sizeof (int) * CHAR_BIT)] \
2218 &= ~(1 << ((n) % (sizeof (int) * CHAR_BIT)))
ab6780cd
SM
2219
2220#define FLOAT_BLOCK(fptr) \
d01a7826 2221 ((struct float_block *) (((uintptr_t) (fptr)) & ~(BLOCK_ALIGN - 1)))
ab6780cd
SM
2222
2223#define FLOAT_INDEX(fptr) \
d01a7826 2224 ((((uintptr_t) (fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float))
2e471eb5
GM
2225
2226struct float_block
2227{
ab6780cd 2228 /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job. */
2e471eb5 2229 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
5e617bc2 2230 int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof (int) * CHAR_BIT)];
ab6780cd 2231 struct float_block *next;
2e471eb5
GM
2232};
2233
ab6780cd
SM
2234#define FLOAT_MARKED_P(fptr) \
2235 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2236
2237#define FLOAT_MARK(fptr) \
2238 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2239
2240#define FLOAT_UNMARK(fptr) \
2241 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2242
34400008
GM
2243/* Current float_block. */
2244
244ed907 2245static struct float_block *float_block;
34400008
GM
2246
2247/* Index of first unused Lisp_Float in the current float_block. */
2248
fff62aa9 2249static int float_block_index = FLOAT_BLOCK_SIZE;
2e471eb5 2250
34400008
GM
2251/* Free-list of Lisp_Floats. */
2252
244ed907 2253static struct Lisp_Float *float_free_list;
2e471eb5 2254
34400008
GM
2255/* Return a new float object with value FLOAT_VALUE. */
2256
2e471eb5 2257Lisp_Object
971de7fb 2258make_float (double float_value)
2e471eb5
GM
2259{
2260 register Lisp_Object val;
2261
dafc79fa 2262 MALLOC_BLOCK_INPUT;
cfb2f32e 2263
2e471eb5
GM
2264 if (float_free_list)
2265 {
2266 /* We use the data field for chaining the free list
2267 so that we won't use the same field that has the mark bit. */
2268 XSETFLOAT (val, float_free_list);
28a099a4 2269 float_free_list = float_free_list->u.chain;
2e471eb5
GM
2270 }
2271 else
2272 {
2273 if (float_block_index == FLOAT_BLOCK_SIZE)
2274 {
38182d90
PE
2275 struct float_block *new
2276 = lisp_align_malloc (sizeof *new, MEM_TYPE_FLOAT);
2e471eb5 2277 new->next = float_block;
72af86bd 2278 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2279 float_block = new;
2280 float_block_index = 0;
3900d5de 2281 total_free_floats += FLOAT_BLOCK_SIZE;
2e471eb5 2282 }
6b61353c
KH
2283 XSETFLOAT (val, &float_block->floats[float_block_index]);
2284 float_block_index++;
2e471eb5 2285 }
177c0ea7 2286
dafc79fa 2287 MALLOC_UNBLOCK_INPUT;
e2984df0 2288
f601cdf3 2289 XFLOAT_INIT (val, float_value);
6b61353c 2290 eassert (!FLOAT_MARKED_P (XFLOAT (val)));
2e471eb5
GM
2291 consing_since_gc += sizeof (struct Lisp_Float);
2292 floats_consed++;
3900d5de 2293 total_free_floats--;
2e471eb5
GM
2294 return val;
2295}
2296
2e471eb5
GM
2297
2298\f
2299/***********************************************************************
2300 Cons Allocation
2301 ***********************************************************************/
2302
2303/* We store cons cells inside of cons_blocks, allocating a new
2304 cons_block with malloc whenever necessary. Cons cells reclaimed by
2305 GC are put on a free list to be reallocated before allocating
08b7c2cb 2306 any new cons cells from the latest cons_block. */
2e471eb5 2307
a2821611
AS
2308#define CONS_BLOCK_SIZE \
2309 (((BLOCK_BYTES - sizeof (struct cons_block *) \
2310 /* The compiler might add padding at the end. */ \
2311 - (sizeof (struct Lisp_Cons) - sizeof (int))) * CHAR_BIT) \
08b7c2cb
SM
2312 / (sizeof (struct Lisp_Cons) * CHAR_BIT + 1))
2313
2314#define CONS_BLOCK(fptr) \
d01a7826 2315 ((struct cons_block *) ((uintptr_t) (fptr) & ~(BLOCK_ALIGN - 1)))
08b7c2cb
SM
2316
2317#define CONS_INDEX(fptr) \
d01a7826 2318 (((uintptr_t) (fptr) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Cons))
2e471eb5
GM
2319
2320struct cons_block
2321{
08b7c2cb 2322 /* Place `conses' at the beginning, to ease up CONS_INDEX's job. */
2e471eb5 2323 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
5e617bc2 2324 int gcmarkbits[1 + CONS_BLOCK_SIZE / (sizeof (int) * CHAR_BIT)];
08b7c2cb 2325 struct cons_block *next;
2e471eb5
GM
2326};
2327
08b7c2cb
SM
2328#define CONS_MARKED_P(fptr) \
2329 GETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2330
2331#define CONS_MARK(fptr) \
2332 SETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2333
2334#define CONS_UNMARK(fptr) \
2335 UNSETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2336
34400008
GM
2337/* Current cons_block. */
2338
244ed907 2339static struct cons_block *cons_block;
34400008
GM
2340
2341/* Index of first unused Lisp_Cons in the current block. */
2342
fff62aa9 2343static int cons_block_index = CONS_BLOCK_SIZE;
2e471eb5 2344
34400008
GM
2345/* Free-list of Lisp_Cons structures. */
2346
244ed907 2347static struct Lisp_Cons *cons_free_list;
2e471eb5 2348
34400008 2349/* Explicitly free a cons cell by putting it on the free-list. */
2e471eb5
GM
2350
2351void
971de7fb 2352free_cons (struct Lisp_Cons *ptr)
2e471eb5 2353{
28a099a4 2354 ptr->u.chain = cons_free_list;
34400008 2355#if GC_MARK_STACK
c644523b 2356 ptr->car = Vdead;
34400008 2357#endif
2e471eb5 2358 cons_free_list = ptr;
0dd6d66d 2359 consing_since_gc -= sizeof *ptr;
3900d5de 2360 total_free_conses++;
2e471eb5
GM
2361}
2362
a7ca3326 2363DEFUN ("cons", Fcons, Scons, 2, 2, 0,
a6266d23 2364 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */)
5842a27b 2365 (Lisp_Object car, Lisp_Object cdr)
2e471eb5
GM
2366{
2367 register Lisp_Object val;
2368
dafc79fa 2369 MALLOC_BLOCK_INPUT;
cfb2f32e 2370
2e471eb5
GM
2371 if (cons_free_list)
2372 {
2373 /* We use the cdr for chaining the free list
2374 so that we won't use the same field that has the mark bit. */
2375 XSETCONS (val, cons_free_list);
28a099a4 2376 cons_free_list = cons_free_list->u.chain;
2e471eb5
GM
2377 }
2378 else
2379 {
2380 if (cons_block_index == CONS_BLOCK_SIZE)
2381 {
38182d90
PE
2382 struct cons_block *new
2383 = lisp_align_malloc (sizeof *new, MEM_TYPE_CONS);
72af86bd 2384 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2385 new->next = cons_block;
2386 cons_block = new;
2387 cons_block_index = 0;
3900d5de 2388 total_free_conses += CONS_BLOCK_SIZE;
2e471eb5 2389 }
6b61353c
KH
2390 XSETCONS (val, &cons_block->conses[cons_block_index]);
2391 cons_block_index++;
2e471eb5 2392 }
177c0ea7 2393
dafc79fa 2394 MALLOC_UNBLOCK_INPUT;
e2984df0 2395
f3fbd155
KR
2396 XSETCAR (val, car);
2397 XSETCDR (val, cdr);
6b61353c 2398 eassert (!CONS_MARKED_P (XCONS (val)));
2e471eb5 2399 consing_since_gc += sizeof (struct Lisp_Cons);
3900d5de 2400 total_free_conses--;
2e471eb5
GM
2401 cons_cells_consed++;
2402 return val;
2403}
2404
e5aab7e7 2405#ifdef GC_CHECK_CONS_LIST
e3e56238
RS
2406/* Get an error now if there's any junk in the cons free list. */
2407void
971de7fb 2408check_cons_list (void)
e3e56238
RS
2409{
2410 struct Lisp_Cons *tail = cons_free_list;
2411
e3e56238 2412 while (tail)
28a099a4 2413 tail = tail->u.chain;
e3e56238 2414}
e5aab7e7 2415#endif
34400008 2416
9b306d37
KS
2417/* Make a list of 1, 2, 3, 4 or 5 specified objects. */
2418
2419Lisp_Object
971de7fb 2420list1 (Lisp_Object arg1)
9b306d37
KS
2421{
2422 return Fcons (arg1, Qnil);
2423}
2e471eb5
GM
2424
2425Lisp_Object
971de7fb 2426list2 (Lisp_Object arg1, Lisp_Object arg2)
2e471eb5
GM
2427{
2428 return Fcons (arg1, Fcons (arg2, Qnil));
2429}
2430
34400008 2431
2e471eb5 2432Lisp_Object
971de7fb 2433list3 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
2e471eb5
GM
2434{
2435 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Qnil)));
2436}
2437
34400008 2438
2e471eb5 2439Lisp_Object
971de7fb 2440list4 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4)
2e471eb5
GM
2441{
2442 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4, Qnil))));
2443}
2444
34400008 2445
2e471eb5 2446Lisp_Object
971de7fb 2447list5 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5)
2e471eb5
GM
2448{
2449 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4,
2450 Fcons (arg5, Qnil)))));
2451}
2452
694b6c97
DA
2453/* Make a list of COUNT Lisp_Objects, where ARG is the
2454 first one. Allocate conses from pure space if TYPE
3438fe21 2455 is CONSTYPE_PURE, or allocate as usual if type is CONSTYPE_HEAP. */
694b6c97
DA
2456
2457Lisp_Object
2458listn (enum constype type, ptrdiff_t count, Lisp_Object arg, ...)
2459{
2460 va_list ap;
2461 ptrdiff_t i;
2462 Lisp_Object val, *objp;
2463
2464 /* Change to SAFE_ALLOCA if you hit this eassert. */
663e2b3f 2465 eassert (count <= MAX_ALLOCA / word_size);
694b6c97 2466
663e2b3f 2467 objp = alloca (count * word_size);
694b6c97
DA
2468 objp[0] = arg;
2469 va_start (ap, arg);
2470 for (i = 1; i < count; i++)
2471 objp[i] = va_arg (ap, Lisp_Object);
2472 va_end (ap);
2473
bcfbc9de 2474 for (val = Qnil, i = count - 1; i >= 0; i--)
694b6c97 2475 {
3438fe21 2476 if (type == CONSTYPE_PURE)
694b6c97 2477 val = pure_cons (objp[i], val);
3438fe21 2478 else if (type == CONSTYPE_HEAP)
694b6c97
DA
2479 val = Fcons (objp[i], val);
2480 else
1088b922 2481 emacs_abort ();
694b6c97
DA
2482 }
2483 return val;
2484}
34400008 2485
a7ca3326 2486DEFUN ("list", Flist, Slist, 0, MANY, 0,
eae936e2 2487 doc: /* Return a newly created list with specified arguments as elements.
ae8e8122
MB
2488Any number of arguments, even zero arguments, are allowed.
2489usage: (list &rest OBJECTS) */)
f66c7cf8 2490 (ptrdiff_t nargs, Lisp_Object *args)
2e471eb5
GM
2491{
2492 register Lisp_Object val;
2493 val = Qnil;
2494
2495 while (nargs > 0)
2496 {
2497 nargs--;
2498 val = Fcons (args[nargs], val);
2499 }
2500 return val;
2501}
2502
34400008 2503
a7ca3326 2504DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
a6266d23 2505 doc: /* Return a newly created list of length LENGTH, with each element being INIT. */)
5842a27b 2506 (register Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2507{
2508 register Lisp_Object val;
14162469 2509 register EMACS_INT size;
2e471eb5 2510
b7826503 2511 CHECK_NATNUM (length);
2e471eb5
GM
2512 size = XFASTINT (length);
2513
2514 val = Qnil;
ce070307
GM
2515 while (size > 0)
2516 {
2517 val = Fcons (init, val);
2518 --size;
2519
2520 if (size > 0)
2521 {
2522 val = Fcons (init, val);
2523 --size;
177c0ea7 2524
ce070307
GM
2525 if (size > 0)
2526 {
2527 val = Fcons (init, val);
2528 --size;
177c0ea7 2529
ce070307
GM
2530 if (size > 0)
2531 {
2532 val = Fcons (init, val);
2533 --size;
177c0ea7 2534
ce070307
GM
2535 if (size > 0)
2536 {
2537 val = Fcons (init, val);
2538 --size;
2539 }
2540 }
2541 }
2542 }
2543
2544 QUIT;
2545 }
177c0ea7 2546
7146af97
JB
2547 return val;
2548}
2e471eb5
GM
2549
2550
7146af97 2551\f
2e471eb5
GM
2552/***********************************************************************
2553 Vector Allocation
2554 ***********************************************************************/
7146af97 2555
f3372c87
DA
2556/* This value is balanced well enough to avoid too much internal overhead
2557 for the most common cases; it's not required to be a power of two, but
2558 it's expected to be a mult-of-ROUNDUP_SIZE (see below). */
34400008 2559
f3372c87 2560#define VECTOR_BLOCK_SIZE 4096
7146af97 2561
d06714cb 2562/* Align allocation request sizes to be a multiple of ROUNDUP_SIZE. */
dd0b0efb
PE
2563enum
2564 {
2b90362b 2565 roundup_size = COMMON_MULTIPLE (word_size, USE_LSB_TAG ? GCALIGNMENT : 1)
dd0b0efb 2566 };
34400008 2567
bfe3e0a2
PE
2568/* ROUNDUP_SIZE must be a power of 2. */
2569verify ((roundup_size & (roundup_size - 1)) == 0);
2570
ca95b3eb
DA
2571/* Verify assumptions described above. */
2572verify ((VECTOR_BLOCK_SIZE % roundup_size) == 0);
ee28be33 2573verify (VECTOR_BLOCK_SIZE <= (1 << PSEUDOVECTOR_SIZE_BITS));
ca95b3eb 2574
bfe3e0a2 2575/* Round up X to nearest mult-of-ROUNDUP_SIZE. */
f3372c87
DA
2576
2577#define vroundup(x) (((x) + (roundup_size - 1)) & ~(roundup_size - 1))
2578
2579/* Rounding helps to maintain alignment constraints if USE_LSB_TAG. */
2580
2581#define VECTOR_BLOCK_BYTES (VECTOR_BLOCK_SIZE - vroundup (sizeof (void *)))
2582
2583/* Size of the minimal vector allocated from block. */
2584
fbe9e0b9 2585#define VBLOCK_BYTES_MIN vroundup (header_size + sizeof (Lisp_Object))
f3372c87
DA
2586
2587/* Size of the largest vector allocated from block. */
2588
2589#define VBLOCK_BYTES_MAX \
d06714cb 2590 vroundup ((VECTOR_BLOCK_BYTES / 2) - word_size)
f3372c87
DA
2591
2592/* We maintain one free list for each possible block-allocated
2593 vector size, and this is the number of free lists we have. */
2594
2595#define VECTOR_MAX_FREE_LIST_INDEX \
2596 ((VECTOR_BLOCK_BYTES - VBLOCK_BYTES_MIN) / roundup_size + 1)
2597
f3372c87
DA
2598/* Common shortcut to advance vector pointer over a block data. */
2599
2600#define ADVANCE(v, nbytes) ((struct Lisp_Vector *) ((char *) (v) + (nbytes)))
2601
2602/* Common shortcut to calculate NBYTES-vector index in VECTOR_FREE_LISTS. */
2603
2604#define VINDEX(nbytes) (((nbytes) - VBLOCK_BYTES_MIN) / roundup_size)
2605
76ae24d7
PE
2606/* Get and set the next field in block-allocated vectorlike objects on
2607 the free list. Doing it this way respects C's aliasing rules.
2608 We could instead make 'contents' a union, but that would mean
2609 changes everywhere that the code uses 'contents'. */
2610static struct Lisp_Vector *
2611next_in_free_list (struct Lisp_Vector *v)
7d377c48 2612{
76ae24d7
PE
2613 intptr_t i = XLI (v->contents[0]);
2614 return (struct Lisp_Vector *) i;
2615}
2616static void
2617set_next_in_free_list (struct Lisp_Vector *v, struct Lisp_Vector *next)
2618{
2619 v->contents[0] = XIL ((intptr_t) next);
2620}
914adc42 2621
f3372c87
DA
2622/* Common shortcut to setup vector on a free list. */
2623
914adc42
DA
2624#define SETUP_ON_FREE_LIST(v, nbytes, tmp) \
2625 do { \
2626 (tmp) = ((nbytes - header_size) / word_size); \
2627 XSETPVECTYPESIZE (v, PVEC_FREE, 0, (tmp)); \
2628 eassert ((nbytes) % roundup_size == 0); \
2629 (tmp) = VINDEX (nbytes); \
2630 eassert ((tmp) < VECTOR_MAX_FREE_LIST_INDEX); \
76ae24d7 2631 set_next_in_free_list (v, vector_free_lists[tmp]); \
914adc42
DA
2632 vector_free_lists[tmp] = (v); \
2633 total_free_vector_slots += (nbytes) / word_size; \
f3372c87
DA
2634 } while (0)
2635
914adc42
DA
2636/* This internal type is used to maintain the list of large vectors
2637 which are allocated at their own, e.g. outside of vector blocks. */
2638
2639struct large_vector
2640{
2641 union {
2642 struct large_vector *vector;
2643#if USE_LSB_TAG
2644 /* We need to maintain ROUNDUP_SIZE alignment for the vector member. */
2645 unsigned char c[vroundup (sizeof (struct large_vector *))];
2646#endif
2647 } next;
2648 struct Lisp_Vector v;
2649};
2650
2651/* This internal type is used to maintain an underlying storage
2652 for small vectors. */
2653
f3372c87
DA
2654struct vector_block
2655{
2656 char data[VECTOR_BLOCK_BYTES];
2657 struct vector_block *next;
2658};
2659
2660/* Chain of vector blocks. */
2661
2662static struct vector_block *vector_blocks;
2663
2664/* Vector free lists, where NTH item points to a chain of free
2665 vectors of the same NBYTES size, so NTH == VINDEX (NBYTES). */
2666
2667static struct Lisp_Vector *vector_free_lists[VECTOR_MAX_FREE_LIST_INDEX];
2668
2669/* Singly-linked list of large vectors. */
2670
914adc42 2671static struct large_vector *large_vectors;
f3372c87
DA
2672
2673/* The only vector with 0 slots, allocated from pure space. */
2674
9730daca 2675Lisp_Object zero_vector;
f3372c87 2676
3ab6e069
DA
2677/* Number of live vectors. */
2678
2679static EMACS_INT total_vectors;
2680
5b835e1d 2681/* Total size of live and free vectors, in Lisp_Object units. */
3ab6e069 2682
5b835e1d 2683static EMACS_INT total_vector_slots, total_free_vector_slots;
3ab6e069 2684
f3372c87
DA
2685/* Get a new vector block. */
2686
2687static struct vector_block *
2688allocate_vector_block (void)
2689{
38182d90 2690 struct vector_block *block = xmalloc (sizeof *block);
f3372c87
DA
2691
2692#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
2693 mem_insert (block->data, block->data + VECTOR_BLOCK_BYTES,
2694 MEM_TYPE_VECTOR_BLOCK);
2695#endif
2696
2697 block->next = vector_blocks;
2698 vector_blocks = block;
2699 return block;
2700}
2701
2702/* Called once to initialize vector allocation. */
2703
2704static void
2705init_vectors (void)
2706{
9730daca 2707 zero_vector = make_pure_vector (0);
f3372c87
DA
2708}
2709
2710/* Allocate vector from a vector block. */
2711
2712static struct Lisp_Vector *
2713allocate_vector_from_block (size_t nbytes)
2714{
914adc42 2715 struct Lisp_Vector *vector;
f3372c87
DA
2716 struct vector_block *block;
2717 size_t index, restbytes;
2718
2719 eassert (VBLOCK_BYTES_MIN <= nbytes && nbytes <= VBLOCK_BYTES_MAX);
2720 eassert (nbytes % roundup_size == 0);
2721
2722 /* First, try to allocate from a free list
2723 containing vectors of the requested size. */
2724 index = VINDEX (nbytes);
2725 if (vector_free_lists[index])
2726 {
2727 vector = vector_free_lists[index];
76ae24d7 2728 vector_free_lists[index] = next_in_free_list (vector);
5b835e1d 2729 total_free_vector_slots -= nbytes / word_size;
f3372c87
DA
2730 return vector;
2731 }
2732
2733 /* Next, check free lists containing larger vectors. Since
2734 we will split the result, we should have remaining space
2735 large enough to use for one-slot vector at least. */
2736 for (index = VINDEX (nbytes + VBLOCK_BYTES_MIN);
2737 index < VECTOR_MAX_FREE_LIST_INDEX; index++)
2738 if (vector_free_lists[index])
2739 {
2740 /* This vector is larger than requested. */
2741 vector = vector_free_lists[index];
76ae24d7 2742 vector_free_lists[index] = next_in_free_list (vector);
5b835e1d 2743 total_free_vector_slots -= nbytes / word_size;
f3372c87
DA
2744
2745 /* Excess bytes are used for the smaller vector,
2746 which should be set on an appropriate free list. */
2747 restbytes = index * roundup_size + VBLOCK_BYTES_MIN - nbytes;
2748 eassert (restbytes % roundup_size == 0);
914adc42 2749 SETUP_ON_FREE_LIST (ADVANCE (vector, nbytes), restbytes, index);
f3372c87
DA
2750 return vector;
2751 }
2752
2753 /* Finally, need a new vector block. */
2754 block = allocate_vector_block ();
2755
2756 /* New vector will be at the beginning of this block. */
2757 vector = (struct Lisp_Vector *) block->data;
f3372c87
DA
2758
2759 /* If the rest of space from this block is large enough
2760 for one-slot vector at least, set up it on a free list. */
2761 restbytes = VECTOR_BLOCK_BYTES - nbytes;
2762 if (restbytes >= VBLOCK_BYTES_MIN)
2763 {
2764 eassert (restbytes % roundup_size == 0);
914adc42 2765 SETUP_ON_FREE_LIST (ADVANCE (vector, nbytes), restbytes, index);
f3372c87
DA
2766 }
2767 return vector;
914adc42 2768}
f3372c87 2769
f3372c87
DA
2770/* Nonzero if VECTOR pointer is valid pointer inside BLOCK. */
2771
2772#define VECTOR_IN_BLOCK(vector, block) \
2773 ((char *) (vector) <= (block)->data \
2774 + VECTOR_BLOCK_BYTES - VBLOCK_BYTES_MIN)
2775
914adc42 2776/* Return the memory footprint of V in bytes. */
ee28be33 2777
914adc42
DA
2778static ptrdiff_t
2779vector_nbytes (struct Lisp_Vector *v)
2780{
2781 ptrdiff_t size = v->header.size & ~ARRAY_MARK_FLAG;
2782
2783 if (size & PSEUDOVECTOR_FLAG)
2784 {
2785 if (PSEUDOVECTOR_TYPEP (&v->header, PVEC_BOOL_VECTOR))
2786 size = (bool_header_size
2787 + (((struct Lisp_Bool_Vector *) v)->size
2788 + BOOL_VECTOR_BITS_PER_CHAR - 1)
2789 / BOOL_VECTOR_BITS_PER_CHAR);
2790 else
2791 size = (header_size
2792 + ((size & PSEUDOVECTOR_SIZE_MASK)
2793 + ((size & PSEUDOVECTOR_REST_MASK)
2794 >> PSEUDOVECTOR_SIZE_BITS)) * word_size);
2795 }
2796 else
2797 size = header_size + size * word_size;
2798 return vroundup (size);
2799}
ee28be33 2800
f3372c87
DA
2801/* Reclaim space used by unmarked vectors. */
2802
2803static void
2804sweep_vectors (void)
2805{
1570ae92 2806 struct vector_block *block, **bprev = &vector_blocks;
914adc42
DA
2807 struct large_vector *lv, **lvprev = &large_vectors;
2808 struct Lisp_Vector *vector, *next;
f3372c87 2809
5b835e1d 2810 total_vectors = total_vector_slots = total_free_vector_slots = 0;
f3372c87
DA
2811 memset (vector_free_lists, 0, sizeof (vector_free_lists));
2812
2813 /* Looking through vector blocks. */
2814
2815 for (block = vector_blocks; block; block = *bprev)
2816 {
fce31d69 2817 bool free_this_block = 0;
914adc42 2818 ptrdiff_t nbytes;
f3372c87
DA
2819
2820 for (vector = (struct Lisp_Vector *) block->data;
2821 VECTOR_IN_BLOCK (vector, block); vector = next)
2822 {
2823 if (VECTOR_MARKED_P (vector))
2824 {
2825 VECTOR_UNMARK (vector);
3ab6e069 2826 total_vectors++;
914adc42
DA
2827 nbytes = vector_nbytes (vector);
2828 total_vector_slots += nbytes / word_size;
2829 next = ADVANCE (vector, nbytes);
f3372c87
DA
2830 }
2831 else
2832 {
914adc42 2833 ptrdiff_t total_bytes;
f3372c87 2834
914adc42
DA
2835 nbytes = vector_nbytes (vector);
2836 total_bytes = nbytes;
ee28be33 2837 next = ADVANCE (vector, nbytes);
f3372c87
DA
2838
2839 /* While NEXT is not marked, try to coalesce with VECTOR,
2840 thus making VECTOR of the largest possible size. */
2841
2842 while (VECTOR_IN_BLOCK (next, block))
2843 {
2844 if (VECTOR_MARKED_P (next))
2845 break;
914adc42 2846 nbytes = vector_nbytes (next);
ee28be33 2847 total_bytes += nbytes;
f3372c87
DA
2848 next = ADVANCE (next, nbytes);
2849 }
bfe3e0a2 2850
ee28be33 2851 eassert (total_bytes % roundup_size == 0);
f3372c87
DA
2852
2853 if (vector == (struct Lisp_Vector *) block->data
2854 && !VECTOR_IN_BLOCK (next, block))
2855 /* This block should be freed because all of it's
2856 space was coalesced into the only free vector. */
2857 free_this_block = 1;
2858 else
ee28be33
SM
2859 {
2860 int tmp;
2861 SETUP_ON_FREE_LIST (vector, total_bytes, tmp);
2862 }
f3372c87
DA
2863 }
2864 }
2865
2866 if (free_this_block)
2867 {
2868 *bprev = block->next;
2869#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
2870 mem_delete (mem_find (block->data));
2871#endif
2872 xfree (block);
2873 }
2874 else
2875 bprev = &block->next;
2876 }
2877
2878 /* Sweep large vectors. */
2879
914adc42 2880 for (lv = large_vectors; lv; lv = *lvprev)
f3372c87 2881 {
914adc42 2882 vector = &lv->v;
f3372c87
DA
2883 if (VECTOR_MARKED_P (vector))
2884 {
2885 VECTOR_UNMARK (vector);
3ab6e069 2886 total_vectors++;
169925ec
DA
2887 if (vector->header.size & PSEUDOVECTOR_FLAG)
2888 {
d06714cb
PE
2889 struct Lisp_Bool_Vector *b = (struct Lisp_Bool_Vector *) vector;
2890
2891 /* All non-bool pseudovectors are small enough to be allocated
2892 from vector blocks. This code should be redesigned if some
2893 pseudovector type grows beyond VBLOCK_BYTES_MAX. */
2894 eassert (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_BOOL_VECTOR));
2895
5b835e1d 2896 total_vector_slots
d06714cb
PE
2897 += (bool_header_size
2898 + ((b->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
5b835e1d 2899 / BOOL_VECTOR_BITS_PER_CHAR)) / word_size;
169925ec
DA
2900 }
2901 else
5b835e1d
DA
2902 total_vector_slots
2903 += header_size / word_size + vector->header.size;
914adc42 2904 lvprev = &lv->next.vector;
f3372c87
DA
2905 }
2906 else
2907 {
914adc42
DA
2908 *lvprev = lv->next.vector;
2909 lisp_free (lv);
f3372c87
DA
2910 }
2911 }
2912}
2913
34400008
GM
2914/* Value is a pointer to a newly allocated Lisp_Vector structure
2915 with room for LEN Lisp_Objects. */
2916
ece93c02 2917static struct Lisp_Vector *
d311d28c 2918allocate_vectorlike (ptrdiff_t len)
1825c68d
KH
2919{
2920 struct Lisp_Vector *p;
2921
dafc79fa
SM
2922 MALLOC_BLOCK_INPUT;
2923
f3372c87 2924 if (len == 0)
9730daca 2925 p = XVECTOR (zero_vector);
d12e8f5a 2926 else
8bbbc977 2927 {
d12e8f5a 2928 size_t nbytes = header_size + len * word_size;
f3372c87 2929
d12e8f5a
DA
2930#ifdef DOUG_LEA_MALLOC
2931 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
2932 because mapped region contents are not preserved in
2933 a dumped Emacs. */
2934 mallopt (M_MMAP_MAX, 0);
2935#endif
f3372c87 2936
d12e8f5a
DA
2937 if (nbytes <= VBLOCK_BYTES_MAX)
2938 p = allocate_vector_from_block (vroundup (nbytes));
2939 else
2940 {
914adc42 2941 struct large_vector *lv
fbe9e0b9
PE
2942 = lisp_malloc ((offsetof (struct large_vector, v.contents)
2943 + len * word_size),
914adc42
DA
2944 MEM_TYPE_VECTORLIKE);
2945 lv->next.vector = large_vectors;
2946 large_vectors = lv;
2947 p = &lv->v;
d12e8f5a 2948 }
177c0ea7 2949
d1658221 2950#ifdef DOUG_LEA_MALLOC
d12e8f5a
DA
2951 /* Back to a reasonable maximum of mmap'ed areas. */
2952 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
d1658221 2953#endif
177c0ea7 2954
d12e8f5a
DA
2955 consing_since_gc += nbytes;
2956 vector_cells_consed += len;
2957 }
1825c68d 2958
dafc79fa 2959 MALLOC_UNBLOCK_INPUT;
e2984df0 2960
1825c68d
KH
2961 return p;
2962}
2963
34400008 2964
dd0b0efb 2965/* Allocate a vector with LEN slots. */
ece93c02
GM
2966
2967struct Lisp_Vector *
dd0b0efb 2968allocate_vector (EMACS_INT len)
ece93c02 2969{
dd0b0efb
PE
2970 struct Lisp_Vector *v;
2971 ptrdiff_t nbytes_max = min (PTRDIFF_MAX, SIZE_MAX);
2972
2973 if (min ((nbytes_max - header_size) / word_size, MOST_POSITIVE_FIXNUM) < len)
2974 memory_full (SIZE_MAX);
2975 v = allocate_vectorlike (len);
2976 v->header.size = len;
ece93c02
GM
2977 return v;
2978}
2979
2980
2981/* Allocate other vector-like structures. */
2982
30f95089 2983struct Lisp_Vector *
914adc42 2984allocate_pseudovector (int memlen, int lisplen, enum pvec_type tag)
ece93c02 2985{
d2029e5b 2986 struct Lisp_Vector *v = allocate_vectorlike (memlen);
e46bb31a 2987 int i;
177c0ea7 2988
914adc42
DA
2989 /* Catch bogus values. */
2990 eassert (tag <= PVEC_FONT);
2991 eassert (memlen - lisplen <= (1 << PSEUDOVECTOR_REST_BITS) - 1);
2992 eassert (lisplen <= (1 << PSEUDOVECTOR_SIZE_BITS) - 1);
2993
d2029e5b 2994 /* Only the first lisplen slots will be traced normally by the GC. */
d2029e5b 2995 for (i = 0; i < lisplen; ++i)
ece93c02 2996 v->contents[i] = Qnil;
177c0ea7 2997
914adc42 2998 XSETPVECTYPESIZE (v, tag, lisplen, memlen - lisplen);
d2029e5b
SM
2999 return v;
3000}
d2029e5b 3001
36429c89
DA
3002struct buffer *
3003allocate_buffer (void)
3004{
38182d90 3005 struct buffer *b = lisp_malloc (sizeof *b, MEM_TYPE_BUFFER);
36429c89 3006
914adc42 3007 BUFFER_PVEC_INIT (b);
c752cfa9 3008 /* Put B on the chain of all buffers including killed ones. */
914adc42 3009 b->next = all_buffers;
c752cfa9
DA
3010 all_buffers = b;
3011 /* Note that the rest fields of B are not initialized. */
36429c89
DA
3012 return b;
3013}
3014
ece93c02 3015struct Lisp_Hash_Table *
878f97ff 3016allocate_hash_table (void)
ece93c02 3017{
878f97ff 3018 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table, count, PVEC_HASH_TABLE);
ece93c02
GM
3019}
3020
ece93c02 3021struct window *
971de7fb 3022allocate_window (void)
ece93c02 3023{
62efea5e 3024 struct window *w;
177c0ea7 3025
62efea5e
DA
3026 w = ALLOCATE_PSEUDOVECTOR (struct window, current_matrix, PVEC_WINDOW);
3027 /* Users assumes that non-Lisp data is zeroed. */
3028 memset (&w->current_matrix, 0,
3029 sizeof (*w) - offsetof (struct window, current_matrix));
3030 return w;
3031}
177c0ea7 3032
4a729fd8 3033struct terminal *
971de7fb 3034allocate_terminal (void)
4a729fd8 3035{
62efea5e 3036 struct terminal *t;
ece93c02 3037
62efea5e
DA
3038 t = ALLOCATE_PSEUDOVECTOR (struct terminal, next_terminal, PVEC_TERMINAL);
3039 /* Users assumes that non-Lisp data is zeroed. */
3040 memset (&t->next_terminal, 0,
3041 sizeof (*t) - offsetof (struct terminal, next_terminal));
d2029e5b 3042 return t;
4a729fd8 3043}
ece93c02
GM
3044
3045struct frame *
971de7fb 3046allocate_frame (void)
ece93c02 3047{
62efea5e
DA
3048 struct frame *f;
3049
3050 f = ALLOCATE_PSEUDOVECTOR (struct frame, face_cache, PVEC_FRAME);
3051 /* Users assumes that non-Lisp data is zeroed. */
72af86bd 3052 memset (&f->face_cache, 0,
62efea5e 3053 sizeof (*f) - offsetof (struct frame, face_cache));
d2029e5b 3054 return f;
ece93c02
GM
3055}
3056
ece93c02 3057struct Lisp_Process *
971de7fb 3058allocate_process (void)
ece93c02 3059{
62efea5e 3060 struct Lisp_Process *p;
ece93c02 3061
62efea5e
DA
3062 p = ALLOCATE_PSEUDOVECTOR (struct Lisp_Process, pid, PVEC_PROCESS);
3063 /* Users assumes that non-Lisp data is zeroed. */
3064 memset (&p->pid, 0,
3065 sizeof (*p) - offsetof (struct Lisp_Process, pid));
3066 return p;
3067}
ece93c02 3068
a7ca3326 3069DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
a6266d23 3070 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
7ee72033 3071See also the function `vector'. */)
5842a27b 3072 (register Lisp_Object length, Lisp_Object init)
7146af97 3073{
1825c68d 3074 Lisp_Object vector;
d311d28c
PE
3075 register ptrdiff_t sizei;
3076 register ptrdiff_t i;
7146af97
JB
3077 register struct Lisp_Vector *p;
3078
b7826503 3079 CHECK_NATNUM (length);
7146af97 3080
d311d28c
PE
3081 p = allocate_vector (XFASTINT (length));
3082 sizei = XFASTINT (length);
ae35e756
PE
3083 for (i = 0; i < sizei; i++)
3084 p->contents[i] = init;
7146af97 3085
1825c68d 3086 XSETVECTOR (vector, p);
7146af97
JB
3087 return vector;
3088}
3089
34400008 3090
a7ca3326 3091DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
eae936e2 3092 doc: /* Return a newly created vector with specified arguments as elements.
ae8e8122
MB
3093Any number of arguments, even zero arguments, are allowed.
3094usage: (vector &rest OBJECTS) */)
f66c7cf8 3095 (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3096{
f66c7cf8 3097 ptrdiff_t i;
25721f5b
DA
3098 register Lisp_Object val = make_uninit_vector (nargs);
3099 register struct Lisp_Vector *p = XVECTOR (val);
7146af97 3100
ae35e756
PE
3101 for (i = 0; i < nargs; i++)
3102 p->contents[i] = args[i];
7146af97
JB
3103 return val;
3104}
3105
3017f87f
SM
3106void
3107make_byte_code (struct Lisp_Vector *v)
3108{
3109 if (v->header.size > 1 && STRINGP (v->contents[1])
3110 && STRING_MULTIBYTE (v->contents[1]))
3111 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
3112 earlier because they produced a raw 8-bit string for byte-code
3113 and now such a byte-code string is loaded as multibyte while
3114 raw 8-bit characters converted to multibyte form. Thus, now we
3115 must convert them back to the original unibyte form. */
3116 v->contents[1] = Fstring_as_unibyte (v->contents[1]);
3117 XSETPVECTYPE (v, PVEC_COMPILED);
3118}
34400008 3119
a7ca3326 3120DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
a6266d23 3121 doc: /* Create a byte-code object with specified arguments as elements.
e2abe5a1
SM
3122The arguments should be the ARGLIST, bytecode-string BYTE-CODE, constant
3123vector CONSTANTS, maximum stack size DEPTH, (optional) DOCSTRING,
3124and (optional) INTERACTIVE-SPEC.
228299fa 3125The first four arguments are required; at most six have any
ae8e8122 3126significance.
e2abe5a1
SM
3127The ARGLIST can be either like the one of `lambda', in which case the arguments
3128will be dynamically bound before executing the byte code, or it can be an
3129integer of the form NNNNNNNRMMMMMMM where the 7bit MMMMMMM specifies the
3130minimum number of arguments, the 7-bit NNNNNNN specifies the maximum number
3131of arguments (ignoring &rest) and the R bit specifies whether there is a &rest
3132argument to catch the left-over arguments. If such an integer is used, the
3133arguments will not be dynamically bound but will be instead pushed on the
3134stack before executing the byte-code.
92cc28b2 3135usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
f66c7cf8 3136 (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3137{
f66c7cf8 3138 ptrdiff_t i;
25721f5b
DA
3139 register Lisp_Object val = make_uninit_vector (nargs);
3140 register struct Lisp_Vector *p = XVECTOR (val);
7146af97 3141
12fbe755 3142 /* We used to purecopy everything here, if purify-flag was set. This worked
3017f87f
SM
3143 OK for Emacs-23, but with Emacs-24's lexical binding code, it can be
3144 dangerous, since make-byte-code is used during execution to build
3145 closures, so any closure built during the preload phase would end up
3146 copied into pure space, including its free variables, which is sometimes
3147 just wasteful and other times plainly wrong (e.g. those free vars may want
3148 to be setcar'd). */
9eac9d59 3149
ae35e756 3150 for (i = 0; i < nargs; i++)
3017f87f
SM
3151 p->contents[i] = args[i];
3152 make_byte_code (p);
876c194c 3153 XSETCOMPILED (val, p);
7146af97
JB
3154 return val;
3155}
2e471eb5 3156
34400008 3157
7146af97 3158\f
2e471eb5
GM
3159/***********************************************************************
3160 Symbol Allocation
3161 ***********************************************************************/
7146af97 3162
d55c12ed
AS
3163/* Like struct Lisp_Symbol, but padded so that the size is a multiple
3164 of the required alignment if LSB tags are used. */
3165
3166union aligned_Lisp_Symbol
3167{
3168 struct Lisp_Symbol s;
bfe3e0a2 3169#if USE_LSB_TAG
2b90362b
DA
3170 unsigned char c[(sizeof (struct Lisp_Symbol) + GCALIGNMENT - 1)
3171 & -GCALIGNMENT];
d55c12ed
AS
3172#endif
3173};
3174
2e471eb5
GM
3175/* Each symbol_block is just under 1020 bytes long, since malloc
3176 really allocates in units of powers of two and uses 4 bytes for its
3017f87f 3177 own overhead. */
7146af97
JB
3178
3179#define SYMBOL_BLOCK_SIZE \
d55c12ed 3180 ((1020 - sizeof (struct symbol_block *)) / sizeof (union aligned_Lisp_Symbol))
7146af97
JB
3181
3182struct symbol_block
2e471eb5 3183{
6b61353c 3184 /* Place `symbols' first, to preserve alignment. */
d55c12ed 3185 union aligned_Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
6b61353c 3186 struct symbol_block *next;
2e471eb5 3187};
7146af97 3188
34400008
GM
3189/* Current symbol block and index of first unused Lisp_Symbol
3190 structure in it. */
3191
d3d47262 3192static struct symbol_block *symbol_block;
fff62aa9 3193static int symbol_block_index = SYMBOL_BLOCK_SIZE;
7146af97 3194
34400008
GM
3195/* List of free symbols. */
3196
d3d47262 3197static struct Lisp_Symbol *symbol_free_list;
7146af97 3198
84575e67
PE
3199static void
3200set_symbol_name (Lisp_Object sym, Lisp_Object name)
3201{
3202 XSYMBOL (sym)->name = name;
3203}
3204
a7ca3326 3205DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
a6266d23 3206 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
eadf1faa 3207Its value is void, and its function definition and property list are nil. */)
5842a27b 3208 (Lisp_Object name)
7146af97
JB
3209{
3210 register Lisp_Object val;
3211 register struct Lisp_Symbol *p;
3212
b7826503 3213 CHECK_STRING (name);
7146af97 3214
dafc79fa 3215 MALLOC_BLOCK_INPUT;
e2984df0 3216
7146af97
JB
3217 if (symbol_free_list)
3218 {
45d12a89 3219 XSETSYMBOL (val, symbol_free_list);
28a099a4 3220 symbol_free_list = symbol_free_list->next;
7146af97
JB
3221 }
3222 else
3223 {
3224 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
3225 {
38182d90
PE
3226 struct symbol_block *new
3227 = lisp_malloc (sizeof *new, MEM_TYPE_SYMBOL);
7146af97
JB
3228 new->next = symbol_block;
3229 symbol_block = new;
3230 symbol_block_index = 0;
3900d5de 3231 total_free_symbols += SYMBOL_BLOCK_SIZE;
7146af97 3232 }
d55c12ed 3233 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index].s);
6b61353c 3234 symbol_block_index++;
7146af97 3235 }
177c0ea7 3236
dafc79fa 3237 MALLOC_UNBLOCK_INPUT;
e2984df0 3238
7146af97 3239 p = XSYMBOL (val);
c644523b
DA
3240 set_symbol_name (val, name);
3241 set_symbol_plist (val, Qnil);
ce5b453a
SM
3242 p->redirect = SYMBOL_PLAINVAL;
3243 SET_SYMBOL_VAL (p, Qunbound);
eadf1faa 3244 set_symbol_function (val, Qnil);
c644523b 3245 set_symbol_next (val, NULL);
2336fe58 3246 p->gcmarkbit = 0;
9e713715
GM
3247 p->interned = SYMBOL_UNINTERNED;
3248 p->constant = 0;
b9598260 3249 p->declared_special = 0;
2e471eb5
GM
3250 consing_since_gc += sizeof (struct Lisp_Symbol);
3251 symbols_consed++;
3900d5de 3252 total_free_symbols--;
7146af97
JB
3253 return val;
3254}
3255
3f25e183 3256
2e471eb5
GM
3257\f
3258/***********************************************************************
34400008 3259 Marker (Misc) Allocation
2e471eb5 3260 ***********************************************************************/
3f25e183 3261
d55c12ed
AS
3262/* Like union Lisp_Misc, but padded so that its size is a multiple of
3263 the required alignment when LSB tags are used. */
3264
3265union aligned_Lisp_Misc
3266{
3267 union Lisp_Misc m;
bfe3e0a2 3268#if USE_LSB_TAG
2b90362b
DA
3269 unsigned char c[(sizeof (union Lisp_Misc) + GCALIGNMENT - 1)
3270 & -GCALIGNMENT];
d55c12ed
AS
3271#endif
3272};
3273
2e471eb5
GM
3274/* Allocation of markers and other objects that share that structure.
3275 Works like allocation of conses. */
c0696668 3276
2e471eb5 3277#define MARKER_BLOCK_SIZE \
d55c12ed 3278 ((1020 - sizeof (struct marker_block *)) / sizeof (union aligned_Lisp_Misc))
2e471eb5
GM
3279
3280struct marker_block
c0696668 3281{
6b61353c 3282 /* Place `markers' first, to preserve alignment. */
d55c12ed 3283 union aligned_Lisp_Misc markers[MARKER_BLOCK_SIZE];
6b61353c 3284 struct marker_block *next;
2e471eb5 3285};
c0696668 3286
d3d47262 3287static struct marker_block *marker_block;
fff62aa9 3288static int marker_block_index = MARKER_BLOCK_SIZE;
c0696668 3289
d3d47262 3290static union Lisp_Misc *marker_free_list;
c0696668 3291
d7a7fda3 3292/* Return a newly allocated Lisp_Misc object of specified TYPE. */
2e471eb5 3293
1b971ac1 3294static Lisp_Object
d7a7fda3 3295allocate_misc (enum Lisp_Misc_Type type)
7146af97 3296{
2e471eb5 3297 Lisp_Object val;
7146af97 3298
dafc79fa 3299 MALLOC_BLOCK_INPUT;
cfb2f32e 3300
2e471eb5 3301 if (marker_free_list)
7146af97 3302 {
2e471eb5
GM
3303 XSETMISC (val, marker_free_list);
3304 marker_free_list = marker_free_list->u_free.chain;
7146af97
JB
3305 }
3306 else
7146af97 3307 {
2e471eb5
GM
3308 if (marker_block_index == MARKER_BLOCK_SIZE)
3309 {
38182d90 3310 struct marker_block *new = lisp_malloc (sizeof *new, MEM_TYPE_MISC);
2e471eb5
GM
3311 new->next = marker_block;
3312 marker_block = new;
3313 marker_block_index = 0;
7b7990cc 3314 total_free_markers += MARKER_BLOCK_SIZE;
2e471eb5 3315 }
d55c12ed 3316 XSETMISC (val, &marker_block->markers[marker_block_index].m);
6b61353c 3317 marker_block_index++;
7146af97 3318 }
177c0ea7 3319
dafc79fa 3320 MALLOC_UNBLOCK_INPUT;
e2984df0 3321
7b7990cc 3322 --total_free_markers;
2e471eb5
GM
3323 consing_since_gc += sizeof (union Lisp_Misc);
3324 misc_objects_consed++;
84575e67 3325 XMISCANY (val)->type = type;
67ee9f6e 3326 XMISCANY (val)->gcmarkbit = 0;
2e471eb5
GM
3327 return val;
3328}
3329
73ebd38f 3330/* Free a Lisp_Misc object. */
7b7990cc 3331
73ebd38f 3332void
971de7fb 3333free_misc (Lisp_Object misc)
7b7990cc 3334{
84575e67 3335 XMISCANY (misc)->type = Lisp_Misc_Free;
7b7990cc
KS
3336 XMISC (misc)->u_free.chain = marker_free_list;
3337 marker_free_list = XMISC (misc);
0dd6d66d 3338 consing_since_gc -= sizeof (union Lisp_Misc);
7b7990cc
KS
3339 total_free_markers++;
3340}
3341
7b1123d8
PE
3342/* Verify properties of Lisp_Save_Value's representation
3343 that are assumed here and elsewhere. */
3344
3345verify (SAVE_UNUSED == 0);
52a9bcae
PE
3346verify (((SAVE_INTEGER | SAVE_POINTER | SAVE_FUNCPOINTER | SAVE_OBJECT)
3347 >> SAVE_SLOT_BITS)
3348 == 0);
7b1123d8 3349
1396ac86
PE
3350/* Return Lisp_Save_Value objects for the various combinations
3351 that callers need. */
1b971ac1
DA
3352
3353Lisp_Object
1396ac86 3354make_save_int_int_int (ptrdiff_t a, ptrdiff_t b, ptrdiff_t c)
1b971ac1 3355{
1b971ac1
DA
3356 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3357 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1396ac86
PE
3358 p->save_type = SAVE_TYPE_INT_INT_INT;
3359 p->data[0].integer = a;
3360 p->data[1].integer = b;
3361 p->data[2].integer = c;
3362 return val;
3363}
1b971ac1 3364
1396ac86
PE
3365Lisp_Object
3366make_save_obj_obj_obj_obj (Lisp_Object a, Lisp_Object b, Lisp_Object c,
3367 Lisp_Object d)
3368{
3369 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3370 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3371 p->save_type = SAVE_TYPE_OBJ_OBJ_OBJ_OBJ;
3372 p->data[0].object = a;
3373 p->data[1].object = b;
3374 p->data[2].object = c;
3375 p->data[3].object = d;
3376 return val;
3377}
1b971ac1 3378
198fa217 3379#if defined HAVE_NS || defined HAVE_NTGUI
1396ac86
PE
3380Lisp_Object
3381make_save_ptr (void *a)
3382{
3383 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3384 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3385 p->save_type = SAVE_POINTER;
3386 p->data[0].pointer = a;
3387 return val;
3388}
3389#endif
7b1123d8 3390
1396ac86
PE
3391Lisp_Object
3392make_save_ptr_int (void *a, ptrdiff_t b)
3393{
3394 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3395 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3396 p->save_type = SAVE_TYPE_PTR_INT;
3397 p->data[0].pointer = a;
3398 p->data[1].integer = b;
3399 return val;
3400}
1b971ac1 3401
f4e891b5
PE
3402#if defined HAVE_MENUS && ! (defined USE_X_TOOLKIT || defined USE_GTK)
3403Lisp_Object
3404make_save_ptr_ptr (void *a, void *b)
3405{
3406 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3407 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3408 p->save_type = SAVE_TYPE_PTR_PTR;
3409 p->data[0].pointer = a;
3410 p->data[1].pointer = b;
3411 return val;
3412}
3413#endif
3414
1396ac86
PE
3415Lisp_Object
3416make_save_funcptr_ptr_obj (void (*a) (void), void *b, Lisp_Object c)
3417{
3418 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3419 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3420 p->save_type = SAVE_TYPE_FUNCPTR_PTR_OBJ;
3421 p->data[0].funcpointer = a;
3422 p->data[1].pointer = b;
3423 p->data[2].object = c;
1b971ac1
DA
3424 return val;
3425}
3426
1396ac86
PE
3427/* Return a Lisp_Save_Value object that represents an array A
3428 of N Lisp objects. */
42172a6b
RS
3429
3430Lisp_Object
1396ac86 3431make_save_memory (Lisp_Object *a, ptrdiff_t n)
42172a6b 3432{
468afbac
DA
3433 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3434 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1396ac86
PE
3435 p->save_type = SAVE_TYPE_MEMORY;
3436 p->data[0].pointer = a;
3437 p->data[1].integer = n;
468afbac 3438 return val;
42172a6b
RS
3439}
3440
73ebd38f
DA
3441/* Free a Lisp_Save_Value object. Do not use this function
3442 if SAVE contains pointer other than returned by xmalloc. */
62c2e5ed 3443
27e498e6 3444void
62c2e5ed
DA
3445free_save_value (Lisp_Object save)
3446{
2b30549c 3447 xfree (XSAVE_POINTER (save, 0));
62c2e5ed
DA
3448 free_misc (save);
3449}
3450
d7a7fda3
DA
3451/* Return a Lisp_Misc_Overlay object with specified START, END and PLIST. */
3452
3453Lisp_Object
3454build_overlay (Lisp_Object start, Lisp_Object end, Lisp_Object plist)
3455{
3456 register Lisp_Object overlay;
3457
3458 overlay = allocate_misc (Lisp_Misc_Overlay);
3459 OVERLAY_START (overlay) = start;
3460 OVERLAY_END (overlay) = end;
c644523b 3461 set_overlay_plist (overlay, plist);
d7a7fda3
DA
3462 XOVERLAY (overlay)->next = NULL;
3463 return overlay;
3464}
3465
a7ca3326 3466DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
a6266d23 3467 doc: /* Return a newly allocated marker which does not point at any place. */)
5842a27b 3468 (void)
2e471eb5 3469{
eeaea515
DA
3470 register Lisp_Object val;
3471 register struct Lisp_Marker *p;
7146af97 3472
eeaea515
DA
3473 val = allocate_misc (Lisp_Misc_Marker);
3474 p = XMARKER (val);
3475 p->buffer = 0;
3476 p->bytepos = 0;
3477 p->charpos = 0;
3478 p->next = NULL;
3479 p->insertion_type = 0;
101ed2bb 3480 p->need_adjustment = 0;
eeaea515 3481 return val;
7146af97 3482}
2e471eb5 3483
657924ff
DA
3484/* Return a newly allocated marker which points into BUF
3485 at character position CHARPOS and byte position BYTEPOS. */
3486
3487Lisp_Object
3488build_marker (struct buffer *buf, ptrdiff_t charpos, ptrdiff_t bytepos)
3489{
eeaea515
DA
3490 Lisp_Object obj;
3491 struct Lisp_Marker *m;
657924ff
DA
3492
3493 /* No dead buffers here. */
e578f381 3494 eassert (BUFFER_LIVE_P (buf));
657924ff 3495
eeaea515
DA
3496 /* Every character is at least one byte. */
3497 eassert (charpos <= bytepos);
3498
3499 obj = allocate_misc (Lisp_Misc_Marker);
3500 m = XMARKER (obj);
3501 m->buffer = buf;
3502 m->charpos = charpos;
3503 m->bytepos = bytepos;
3504 m->insertion_type = 0;
101ed2bb 3505 m->need_adjustment = 0;
eeaea515
DA
3506 m->next = BUF_MARKERS (buf);
3507 BUF_MARKERS (buf) = m;
3508 return obj;
657924ff
DA
3509}
3510
2e471eb5
GM
3511/* Put MARKER back on the free list after using it temporarily. */
3512
3513void
971de7fb 3514free_marker (Lisp_Object marker)
2e471eb5 3515{
ef89c2ce 3516 unchain_marker (XMARKER (marker));
7b7990cc 3517 free_misc (marker);
2e471eb5
GM
3518}
3519
c0696668 3520\f
7146af97 3521/* Return a newly created vector or string with specified arguments as
736471d1
RS
3522 elements. If all the arguments are characters that can fit
3523 in a string of events, make a string; otherwise, make a vector.
3524
3525 Any number of arguments, even zero arguments, are allowed. */
7146af97
JB
3526
3527Lisp_Object
0c90b9ee 3528make_event_array (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3529{
0c90b9ee 3530 ptrdiff_t i;
7146af97
JB
3531
3532 for (i = 0; i < nargs; i++)
736471d1 3533 /* The things that fit in a string
c9ca4659
RS
3534 are characters that are in 0...127,
3535 after discarding the meta bit and all the bits above it. */
e687453f 3536 if (!INTEGERP (args[i])
c11285dc 3537 || (XINT (args[i]) & ~(-CHAR_META)) >= 0200)
7146af97
JB
3538 return Fvector (nargs, args);
3539
3540 /* Since the loop exited, we know that all the things in it are
3541 characters, so we can make a string. */
3542 {
c13ccad2 3543 Lisp_Object result;
177c0ea7 3544
50aee051 3545 result = Fmake_string (make_number (nargs), make_number (0));
7146af97 3546 for (i = 0; i < nargs; i++)
736471d1 3547 {
46e7e6b0 3548 SSET (result, i, XINT (args[i]));
736471d1
RS
3549 /* Move the meta bit to the right place for a string char. */
3550 if (XINT (args[i]) & CHAR_META)
46e7e6b0 3551 SSET (result, i, SREF (result, i) | 0x80);
736471d1 3552 }
177c0ea7 3553
7146af97
JB
3554 return result;
3555 }
3556}
2e471eb5
GM
3557
3558
7146af97 3559\f
24d8a105
RS
3560/************************************************************************
3561 Memory Full Handling
3562 ************************************************************************/
3563
3564
531b0165
PE
3565/* Called if malloc (NBYTES) returns zero. If NBYTES == SIZE_MAX,
3566 there may have been size_t overflow so that malloc was never
3567 called, or perhaps malloc was invoked successfully but the
3568 resulting pointer had problems fitting into a tagged EMACS_INT. In
3569 either case this counts as memory being full even though malloc did
3570 not fail. */
24d8a105
RS
3571
3572void
531b0165 3573memory_full (size_t nbytes)
24d8a105 3574{
531b0165 3575 /* Do not go into hysterics merely because a large request failed. */
fce31d69 3576 bool enough_free_memory = 0;
2b6148e4 3577 if (SPARE_MEMORY < nbytes)
531b0165 3578 {
66606eea
PE
3579 void *p;
3580
3581 MALLOC_BLOCK_INPUT;
3582 p = malloc (SPARE_MEMORY);
531b0165
PE
3583 if (p)
3584 {
4d09bcf6 3585 free (p);
531b0165
PE
3586 enough_free_memory = 1;
3587 }
66606eea 3588 MALLOC_UNBLOCK_INPUT;
531b0165 3589 }
24d8a105 3590
531b0165
PE
3591 if (! enough_free_memory)
3592 {
3593 int i;
24d8a105 3594
531b0165
PE
3595 Vmemory_full = Qt;
3596
3597 memory_full_cons_threshold = sizeof (struct cons_block);
3598
3599 /* The first time we get here, free the spare memory. */
3600 for (i = 0; i < sizeof (spare_memory) / sizeof (char *); i++)
3601 if (spare_memory[i])
3602 {
3603 if (i == 0)
3604 free (spare_memory[i]);
3605 else if (i >= 1 && i <= 4)
3606 lisp_align_free (spare_memory[i]);
3607 else
3608 lisp_free (spare_memory[i]);
3609 spare_memory[i] = 0;
3610 }
531b0165 3611 }
24d8a105
RS
3612
3613 /* This used to call error, but if we've run out of memory, we could
3614 get infinite recursion trying to build the string. */
9b306d37 3615 xsignal (Qnil, Vmemory_signal_data);
24d8a105
RS
3616}
3617
3618/* If we released our reserve (due to running out of memory),
3619 and we have a fair amount free once again,
3620 try to set aside another reserve in case we run out once more.
3621
3622 This is called when a relocatable block is freed in ralloc.c,
3623 and also directly from this file, in case we're not using ralloc.c. */
3624
3625void
971de7fb 3626refill_memory_reserve (void)
24d8a105
RS
3627{
3628#ifndef SYSTEM_MALLOC
3629 if (spare_memory[0] == 0)
38182d90 3630 spare_memory[0] = malloc (SPARE_MEMORY);
24d8a105 3631 if (spare_memory[1] == 0)
38182d90 3632 spare_memory[1] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3633 MEM_TYPE_SPARE);
24d8a105 3634 if (spare_memory[2] == 0)
38182d90 3635 spare_memory[2] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3636 MEM_TYPE_SPARE);
24d8a105 3637 if (spare_memory[3] == 0)
38182d90 3638 spare_memory[3] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3639 MEM_TYPE_SPARE);
24d8a105 3640 if (spare_memory[4] == 0)
38182d90 3641 spare_memory[4] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3642 MEM_TYPE_SPARE);
24d8a105 3643 if (spare_memory[5] == 0)
38182d90 3644 spare_memory[5] = lisp_malloc (sizeof (struct string_block),
35aaa1ea 3645 MEM_TYPE_SPARE);
24d8a105 3646 if (spare_memory[6] == 0)
38182d90 3647 spare_memory[6] = lisp_malloc (sizeof (struct string_block),
35aaa1ea 3648 MEM_TYPE_SPARE);
24d8a105
RS
3649 if (spare_memory[0] && spare_memory[1] && spare_memory[5])
3650 Vmemory_full = Qnil;
3651#endif
3652}
3653\f
34400008
GM
3654/************************************************************************
3655 C Stack Marking
3656 ************************************************************************/
3657
13c844fb
GM
3658#if GC_MARK_STACK || defined GC_MALLOC_CHECK
3659
71cf5fa0
GM
3660/* Conservative C stack marking requires a method to identify possibly
3661 live Lisp objects given a pointer value. We do this by keeping
3662 track of blocks of Lisp data that are allocated in a red-black tree
3663 (see also the comment of mem_node which is the type of nodes in
3664 that tree). Function lisp_malloc adds information for an allocated
3665 block to the red-black tree with calls to mem_insert, and function
3666 lisp_free removes it with mem_delete. Functions live_string_p etc
3667 call mem_find to lookup information about a given pointer in the
3668 tree, and use that to determine if the pointer points to a Lisp
3669 object or not. */
3670
34400008
GM
3671/* Initialize this part of alloc.c. */
3672
3673static void
971de7fb 3674mem_init (void)
34400008
GM
3675{
3676 mem_z.left = mem_z.right = MEM_NIL;
3677 mem_z.parent = NULL;
3678 mem_z.color = MEM_BLACK;
3679 mem_z.start = mem_z.end = NULL;
3680 mem_root = MEM_NIL;
3681}
3682
3683
3684/* Value is a pointer to the mem_node containing START. Value is
3685 MEM_NIL if there is no node in the tree containing START. */
3686
b0ab8123 3687static struct mem_node *
971de7fb 3688mem_find (void *start)
34400008
GM
3689{
3690 struct mem_node *p;
3691
ece93c02
GM
3692 if (start < min_heap_address || start > max_heap_address)
3693 return MEM_NIL;
3694
34400008
GM
3695 /* Make the search always successful to speed up the loop below. */
3696 mem_z.start = start;
3697 mem_z.end = (char *) start + 1;
3698
3699 p = mem_root;
3700 while (start < p->start || start >= p->end)
3701 p = start < p->start ? p->left : p->right;
3702 return p;
3703}
3704
3705
3706/* Insert a new node into the tree for a block of memory with start
3707 address START, end address END, and type TYPE. Value is a
3708 pointer to the node that was inserted. */
3709
3710static struct mem_node *
971de7fb 3711mem_insert (void *start, void *end, enum mem_type type)
34400008
GM
3712{
3713 struct mem_node *c, *parent, *x;
3714
add3c3ea 3715 if (min_heap_address == NULL || start < min_heap_address)
ece93c02 3716 min_heap_address = start;
add3c3ea 3717 if (max_heap_address == NULL || end > max_heap_address)
ece93c02
GM
3718 max_heap_address = end;
3719
34400008
GM
3720 /* See where in the tree a node for START belongs. In this
3721 particular application, it shouldn't happen that a node is already
3722 present. For debugging purposes, let's check that. */
3723 c = mem_root;
3724 parent = NULL;
3725
3726#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
177c0ea7 3727
34400008
GM
3728 while (c != MEM_NIL)
3729 {
3730 if (start >= c->start && start < c->end)
1088b922 3731 emacs_abort ();
34400008
GM
3732 parent = c;
3733 c = start < c->start ? c->left : c->right;
3734 }
177c0ea7 3735
34400008 3736#else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
177c0ea7 3737
34400008
GM
3738 while (c != MEM_NIL)
3739 {
3740 parent = c;
3741 c = start < c->start ? c->left : c->right;
3742 }
177c0ea7 3743
34400008
GM
3744#endif /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
3745
3746 /* Create a new node. */
877935b1 3747#ifdef GC_MALLOC_CHECK
0caaedb1 3748 x = malloc (sizeof *x);
877935b1 3749 if (x == NULL)
1088b922 3750 emacs_abort ();
877935b1 3751#else
23f86fce 3752 x = xmalloc (sizeof *x);
877935b1 3753#endif
34400008
GM
3754 x->start = start;
3755 x->end = end;
3756 x->type = type;
3757 x->parent = parent;
3758 x->left = x->right = MEM_NIL;
3759 x->color = MEM_RED;
3760
3761 /* Insert it as child of PARENT or install it as root. */
3762 if (parent)
3763 {
3764 if (start < parent->start)
3765 parent->left = x;
3766 else
3767 parent->right = x;
3768 }
177c0ea7 3769 else
34400008
GM
3770 mem_root = x;
3771
3772 /* Re-establish red-black tree properties. */
3773 mem_insert_fixup (x);
877935b1 3774
34400008
GM
3775 return x;
3776}
3777
3778
3779/* Re-establish the red-black properties of the tree, and thereby
3780 balance the tree, after node X has been inserted; X is always red. */
3781
3782static void
971de7fb 3783mem_insert_fixup (struct mem_node *x)
34400008
GM
3784{
3785 while (x != mem_root && x->parent->color == MEM_RED)
3786 {
3787 /* X is red and its parent is red. This is a violation of
3788 red-black tree property #3. */
177c0ea7 3789
34400008
GM
3790 if (x->parent == x->parent->parent->left)
3791 {
3792 /* We're on the left side of our grandparent, and Y is our
3793 "uncle". */
3794 struct mem_node *y = x->parent->parent->right;
177c0ea7 3795
34400008
GM
3796 if (y->color == MEM_RED)
3797 {
3798 /* Uncle and parent are red but should be black because
3799 X is red. Change the colors accordingly and proceed
3800 with the grandparent. */
3801 x->parent->color = MEM_BLACK;
3802 y->color = MEM_BLACK;
3803 x->parent->parent->color = MEM_RED;
3804 x = x->parent->parent;
3805 }
3806 else
3807 {
3808 /* Parent and uncle have different colors; parent is
3809 red, uncle is black. */
3810 if (x == x->parent->right)
3811 {
3812 x = x->parent;
3813 mem_rotate_left (x);
3814 }
3815
3816 x->parent->color = MEM_BLACK;
3817 x->parent->parent->color = MEM_RED;
3818 mem_rotate_right (x->parent->parent);
3819 }
3820 }
3821 else
3822 {
3823 /* This is the symmetrical case of above. */
3824 struct mem_node *y = x->parent->parent->left;
177c0ea7 3825
34400008
GM
3826 if (y->color == MEM_RED)
3827 {
3828 x->parent->color = MEM_BLACK;
3829 y->color = MEM_BLACK;
3830 x->parent->parent->color = MEM_RED;
3831 x = x->parent->parent;
3832 }
3833 else
3834 {
3835 if (x == x->parent->left)
3836 {
3837 x = x->parent;
3838 mem_rotate_right (x);
3839 }
177c0ea7 3840
34400008
GM
3841 x->parent->color = MEM_BLACK;
3842 x->parent->parent->color = MEM_RED;
3843 mem_rotate_left (x->parent->parent);
3844 }
3845 }
3846 }
3847
3848 /* The root may have been changed to red due to the algorithm. Set
3849 it to black so that property #5 is satisfied. */
3850 mem_root->color = MEM_BLACK;
3851}
3852
3853
177c0ea7
JB
3854/* (x) (y)
3855 / \ / \
34400008
GM
3856 a (y) ===> (x) c
3857 / \ / \
3858 b c a b */
3859
3860static void
971de7fb 3861mem_rotate_left (struct mem_node *x)
34400008
GM
3862{
3863 struct mem_node *y;
3864
3865 /* Turn y's left sub-tree into x's right sub-tree. */
3866 y = x->right;
3867 x->right = y->left;
3868 if (y->left != MEM_NIL)
3869 y->left->parent = x;
3870
3871 /* Y's parent was x's parent. */
3872 if (y != MEM_NIL)
3873 y->parent = x->parent;
3874
3875 /* Get the parent to point to y instead of x. */
3876 if (x->parent)
3877 {
3878 if (x == x->parent->left)
3879 x->parent->left = y;
3880 else
3881 x->parent->right = y;
3882 }
3883 else
3884 mem_root = y;
3885
3886 /* Put x on y's left. */
3887 y->left = x;
3888 if (x != MEM_NIL)
3889 x->parent = y;
3890}
3891
3892
177c0ea7
JB
3893/* (x) (Y)
3894 / \ / \
3895 (y) c ===> a (x)
3896 / \ / \
34400008
GM
3897 a b b c */
3898
3899static void
971de7fb 3900mem_rotate_right (struct mem_node *x)
34400008
GM
3901{
3902 struct mem_node *y = x->left;
3903
3904 x->left = y->right;
3905 if (y->right != MEM_NIL)
3906 y->right->parent = x;
177c0ea7 3907
34400008
GM
3908 if (y != MEM_NIL)
3909 y->parent = x->parent;
3910 if (x->parent)
3911 {
3912 if (x == x->parent->right)
3913 x->parent->right = y;
3914 else
3915 x->parent->left = y;
3916 }
3917 else
3918 mem_root = y;
177c0ea7 3919
34400008
GM
3920 y->right = x;
3921 if (x != MEM_NIL)
3922 x->parent = y;
3923}
3924
3925
3926/* Delete node Z from the tree. If Z is null or MEM_NIL, do nothing. */
3927
3928static void
971de7fb 3929mem_delete (struct mem_node *z)
34400008
GM
3930{
3931 struct mem_node *x, *y;
3932
3933 if (!z || z == MEM_NIL)
3934 return;
3935
3936 if (z->left == MEM_NIL || z->right == MEM_NIL)
3937 y = z;
3938 else
3939 {
3940 y = z->right;
3941 while (y->left != MEM_NIL)
3942 y = y->left;
3943 }
3944
3945 if (y->left != MEM_NIL)
3946 x = y->left;
3947 else
3948 x = y->right;
3949
3950 x->parent = y->parent;
3951 if (y->parent)
3952 {
3953 if (y == y->parent->left)
3954 y->parent->left = x;
3955 else
3956 y->parent->right = x;
3957 }
3958 else
3959 mem_root = x;
3960
3961 if (y != z)
3962 {
3963 z->start = y->start;
3964 z->end = y->end;
3965 z->type = y->type;
3966 }
177c0ea7 3967
34400008
GM
3968 if (y->color == MEM_BLACK)
3969 mem_delete_fixup (x);
877935b1
GM
3970
3971#ifdef GC_MALLOC_CHECK
0caaedb1 3972 free (y);
877935b1 3973#else
34400008 3974 xfree (y);
877935b1 3975#endif
34400008
GM
3976}
3977
3978
3979/* Re-establish the red-black properties of the tree, after a
3980 deletion. */
3981
3982static void
971de7fb 3983mem_delete_fixup (struct mem_node *x)
34400008
GM
3984{
3985 while (x != mem_root && x->color == MEM_BLACK)
3986 {
3987 if (x == x->parent->left)
3988 {
3989 struct mem_node *w = x->parent->right;
177c0ea7 3990
34400008
GM
3991 if (w->color == MEM_RED)
3992 {
3993 w->color = MEM_BLACK;
3994 x->parent->color = MEM_RED;
3995 mem_rotate_left (x->parent);
3996 w = x->parent->right;
3997 }
177c0ea7 3998
34400008
GM
3999 if (w->left->color == MEM_BLACK && w->right->color == MEM_BLACK)
4000 {
4001 w->color = MEM_RED;
4002 x = x->parent;
4003 }
4004 else
4005 {
4006 if (w->right->color == MEM_BLACK)
4007 {
4008 w->left->color = MEM_BLACK;
4009 w->color = MEM_RED;
4010 mem_rotate_right (w);
4011 w = x->parent->right;
4012 }
4013 w->color = x->parent->color;
4014 x->parent->color = MEM_BLACK;
4015 w->right->color = MEM_BLACK;
4016 mem_rotate_left (x->parent);
4017 x = mem_root;
4018 }
4019 }
4020 else
4021 {
4022 struct mem_node *w = x->parent->left;
177c0ea7 4023
34400008
GM
4024 if (w->color == MEM_RED)
4025 {
4026 w->color = MEM_BLACK;
4027 x->parent->color = MEM_RED;
4028 mem_rotate_right (x->parent);
4029 w = x->parent->left;
4030 }
177c0ea7 4031
34400008
GM
4032 if (w->right->color == MEM_BLACK && w->left->color == MEM_BLACK)
4033 {
4034 w->color = MEM_RED;
4035 x = x->parent;
4036 }
4037 else
4038 {
4039 if (w->left->color == MEM_BLACK)
4040 {
4041 w->right->color = MEM_BLACK;
4042 w->color = MEM_RED;
4043 mem_rotate_left (w);
4044 w = x->parent->left;
4045 }
177c0ea7 4046
34400008
GM
4047 w->color = x->parent->color;
4048 x->parent->color = MEM_BLACK;
4049 w->left->color = MEM_BLACK;
4050 mem_rotate_right (x->parent);
4051 x = mem_root;
4052 }
4053 }
4054 }
177c0ea7 4055
34400008
GM
4056 x->color = MEM_BLACK;
4057}
4058
4059
4060/* Value is non-zero if P is a pointer to a live Lisp string on
4061 the heap. M is a pointer to the mem_block for P. */
4062
b0ab8123 4063static bool
971de7fb 4064live_string_p (struct mem_node *m, void *p)
34400008
GM
4065{
4066 if (m->type == MEM_TYPE_STRING)
4067 {
7d652d97 4068 struct string_block *b = m->start;
14162469 4069 ptrdiff_t offset = (char *) p - (char *) &b->strings[0];
34400008
GM
4070
4071 /* P must point to the start of a Lisp_String structure, and it
4072 must not be on the free-list. */
176bc847
GM
4073 return (offset >= 0
4074 && offset % sizeof b->strings[0] == 0
6b61353c 4075 && offset < (STRING_BLOCK_SIZE * sizeof b->strings[0])
34400008
GM
4076 && ((struct Lisp_String *) p)->data != NULL);
4077 }
4078 else
4079 return 0;
4080}
4081
4082
4083/* Value is non-zero if P is a pointer to a live Lisp cons on
4084 the heap. M is a pointer to the mem_block for P. */
4085
b0ab8123 4086static bool
971de7fb 4087live_cons_p (struct mem_node *m, void *p)
34400008
GM
4088{
4089 if (m->type == MEM_TYPE_CONS)
4090 {
7d652d97 4091 struct cons_block *b = m->start;
14162469 4092 ptrdiff_t offset = (char *) p - (char *) &b->conses[0];
34400008
GM
4093
4094 /* P must point to the start of a Lisp_Cons, not be
4095 one of the unused cells in the current cons block,
4096 and not be on the free-list. */
176bc847
GM
4097 return (offset >= 0
4098 && offset % sizeof b->conses[0] == 0
6b61353c 4099 && offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
34400008
GM
4100 && (b != cons_block
4101 || offset / sizeof b->conses[0] < cons_block_index)
c644523b 4102 && !EQ (((struct Lisp_Cons *) p)->car, Vdead));
34400008
GM
4103 }
4104 else
4105 return 0;
4106}
4107
4108
4109/* Value is non-zero if P is a pointer to a live Lisp symbol on
4110 the heap. M is a pointer to the mem_block for P. */
4111
b0ab8123 4112static bool
971de7fb 4113live_symbol_p (struct mem_node *m, void *p)
34400008
GM
4114{
4115 if (m->type == MEM_TYPE_SYMBOL)
4116 {
7d652d97 4117 struct symbol_block *b = m->start;
14162469 4118 ptrdiff_t offset = (char *) p - (char *) &b->symbols[0];
177c0ea7 4119
34400008
GM
4120 /* P must point to the start of a Lisp_Symbol, not be
4121 one of the unused cells in the current symbol block,
4122 and not be on the free-list. */
176bc847
GM
4123 return (offset >= 0
4124 && offset % sizeof b->symbols[0] == 0
6b61353c 4125 && offset < (SYMBOL_BLOCK_SIZE * sizeof b->symbols[0])
34400008
GM
4126 && (b != symbol_block
4127 || offset / sizeof b->symbols[0] < symbol_block_index)
c644523b 4128 && !EQ (((struct Lisp_Symbol *)p)->function, Vdead));
34400008
GM
4129 }
4130 else
4131 return 0;
4132}
4133
4134
4135/* Value is non-zero if P is a pointer to a live Lisp float on
4136 the heap. M is a pointer to the mem_block for P. */
4137
b0ab8123 4138static bool
971de7fb 4139live_float_p (struct mem_node *m, void *p)
34400008
GM
4140{
4141 if (m->type == MEM_TYPE_FLOAT)
4142 {
7d652d97 4143 struct float_block *b = m->start;
14162469 4144 ptrdiff_t offset = (char *) p - (char *) &b->floats[0];
177c0ea7 4145
ab6780cd
SM
4146 /* P must point to the start of a Lisp_Float and not be
4147 one of the unused cells in the current float block. */
176bc847
GM
4148 return (offset >= 0
4149 && offset % sizeof b->floats[0] == 0
6b61353c 4150 && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
34400008 4151 && (b != float_block
ab6780cd 4152 || offset / sizeof b->floats[0] < float_block_index));
34400008
GM
4153 }
4154 else
4155 return 0;
4156}
4157
4158
4159/* Value is non-zero if P is a pointer to a live Lisp Misc on
4160 the heap. M is a pointer to the mem_block for P. */
4161
b0ab8123 4162static bool
971de7fb 4163live_misc_p (struct mem_node *m, void *p)
34400008
GM
4164{
4165 if (m->type == MEM_TYPE_MISC)
4166 {
7d652d97 4167 struct marker_block *b = m->start;
14162469 4168 ptrdiff_t offset = (char *) p - (char *) &b->markers[0];
177c0ea7 4169
34400008
GM
4170 /* P must point to the start of a Lisp_Misc, not be
4171 one of the unused cells in the current misc block,
4172 and not be on the free-list. */
176bc847
GM
4173 return (offset >= 0
4174 && offset % sizeof b->markers[0] == 0
6b61353c 4175 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0])
34400008
GM
4176 && (b != marker_block
4177 || offset / sizeof b->markers[0] < marker_block_index)
d314756e 4178 && ((union Lisp_Misc *) p)->u_any.type != Lisp_Misc_Free);
34400008
GM
4179 }
4180 else
4181 return 0;
4182}
4183
4184
4185/* Value is non-zero if P is a pointer to a live vector-like object.
4186 M is a pointer to the mem_block for P. */
4187
b0ab8123 4188static bool
971de7fb 4189live_vector_p (struct mem_node *m, void *p)
34400008 4190{
f3372c87
DA
4191 if (m->type == MEM_TYPE_VECTOR_BLOCK)
4192 {
4193 /* This memory node corresponds to a vector block. */
7d652d97 4194 struct vector_block *block = m->start;
f3372c87
DA
4195 struct Lisp_Vector *vector = (struct Lisp_Vector *) block->data;
4196
4197 /* P is in the block's allocation range. Scan the block
4198 up to P and see whether P points to the start of some
4199 vector which is not on a free list. FIXME: check whether
4200 some allocation patterns (probably a lot of short vectors)
4201 may cause a substantial overhead of this loop. */
4202 while (VECTOR_IN_BLOCK (vector, block)
4203 && vector <= (struct Lisp_Vector *) p)
4204 {
914adc42 4205 if (!PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FREE) && vector == p)
f3372c87
DA
4206 return 1;
4207 else
914adc42 4208 vector = ADVANCE (vector, vector_nbytes (vector));
f3372c87
DA
4209 }
4210 }
914adc42
DA
4211 else if (m->type == MEM_TYPE_VECTORLIKE
4212 && (char *) p == ((char *) m->start
4213 + offsetof (struct large_vector, v)))
f3372c87
DA
4214 /* This memory node corresponds to a large vector. */
4215 return 1;
4216 return 0;
34400008
GM
4217}
4218
4219
2336fe58 4220/* Value is non-zero if P is a pointer to a live buffer. M is a
34400008
GM
4221 pointer to the mem_block for P. */
4222
b0ab8123 4223static bool
971de7fb 4224live_buffer_p (struct mem_node *m, void *p)
34400008
GM
4225{
4226 /* P must point to the start of the block, and the buffer
4227 must not have been killed. */
4228 return (m->type == MEM_TYPE_BUFFER
4229 && p == m->start
e34f7f79 4230 && !NILP (((struct buffer *) p)->INTERNAL_FIELD (name)));
34400008
GM
4231}
4232
13c844fb
GM
4233#endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */
4234
4235#if GC_MARK_STACK
4236
34400008
GM
4237#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4238
0c5307b0
DA
4239/* Currently not used, but may be called from gdb. */
4240
4241void dump_zombies (void) EXTERNALLY_VISIBLE;
4242
34400008
GM
4243/* Array of objects that are kept alive because the C stack contains
4244 a pattern that looks like a reference to them . */
4245
4246#define MAX_ZOMBIES 10
4247static Lisp_Object zombies[MAX_ZOMBIES];
4248
4249/* Number of zombie objects. */
4250
211a0b2a 4251static EMACS_INT nzombies;
34400008
GM
4252
4253/* Number of garbage collections. */
4254
211a0b2a 4255static EMACS_INT ngcs;
34400008
GM
4256
4257/* Average percentage of zombies per collection. */
4258
4259static double avg_zombies;
4260
4261/* Max. number of live and zombie objects. */
4262
211a0b2a 4263static EMACS_INT max_live, max_zombies;
34400008
GM
4264
4265/* Average number of live objects per GC. */
4266
4267static double avg_live;
4268
a7ca3326 4269DEFUN ("gc-status", Fgc_status, Sgc_status, 0, 0, "",
7ee72033 4270 doc: /* Show information about live and zombie objects. */)
5842a27b 4271 (void)
34400008 4272{
83fc9c63 4273 Lisp_Object args[8], zombie_list = Qnil;
211a0b2a 4274 EMACS_INT i;
6e4b3fbe 4275 for (i = 0; i < min (MAX_ZOMBIES, nzombies); i++)
83fc9c63
DL
4276 zombie_list = Fcons (zombies[i], zombie_list);
4277 args[0] = build_string ("%d GCs, avg live/zombies = %.2f/%.2f (%f%%), max %d/%d\nzombies: %S");
34400008
GM
4278 args[1] = make_number (ngcs);
4279 args[2] = make_float (avg_live);
4280 args[3] = make_float (avg_zombies);
4281 args[4] = make_float (avg_zombies / avg_live / 100);
4282 args[5] = make_number (max_live);
4283 args[6] = make_number (max_zombies);
83fc9c63
DL
4284 args[7] = zombie_list;
4285 return Fmessage (8, args);
34400008
GM
4286}
4287
4288#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
4289
4290
182ff242
GM
4291/* Mark OBJ if we can prove it's a Lisp_Object. */
4292
b0ab8123 4293static void
971de7fb 4294mark_maybe_object (Lisp_Object obj)
182ff242 4295{
b609f591
YM
4296 void *po;
4297 struct mem_node *m;
4298
4299 if (INTEGERP (obj))
4300 return;
4301
4302 po = (void *) XPNTR (obj);
4303 m = mem_find (po);
177c0ea7 4304
182ff242
GM
4305 if (m != MEM_NIL)
4306 {
fce31d69 4307 bool mark_p = 0;
182ff242 4308
8e50cc2d 4309 switch (XTYPE (obj))
182ff242
GM
4310 {
4311 case Lisp_String:
4312 mark_p = (live_string_p (m, po)
4313 && !STRING_MARKED_P ((struct Lisp_String *) po));
4314 break;
4315
4316 case Lisp_Cons:
08b7c2cb 4317 mark_p = (live_cons_p (m, po) && !CONS_MARKED_P (XCONS (obj)));
182ff242
GM
4318 break;
4319
4320 case Lisp_Symbol:
2336fe58 4321 mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit);
182ff242
GM
4322 break;
4323
4324 case Lisp_Float:
ab6780cd 4325 mark_p = (live_float_p (m, po) && !FLOAT_MARKED_P (XFLOAT (obj)));
182ff242
GM
4326 break;
4327
4328 case Lisp_Vectorlike:
8e50cc2d 4329 /* Note: can't check BUFFERP before we know it's a
182ff242
GM
4330 buffer because checking that dereferences the pointer
4331 PO which might point anywhere. */
4332 if (live_vector_p (m, po))
8e50cc2d 4333 mark_p = !SUBRP (obj) && !VECTOR_MARKED_P (XVECTOR (obj));
182ff242 4334 else if (live_buffer_p (m, po))
8e50cc2d 4335 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj));
182ff242
GM
4336 break;
4337
4338 case Lisp_Misc:
67ee9f6e 4339 mark_p = (live_misc_p (m, po) && !XMISCANY (obj)->gcmarkbit);
182ff242 4340 break;
6bbd7a29 4341
2de9f71c 4342 default:
6bbd7a29 4343 break;
182ff242
GM
4344 }
4345
4346 if (mark_p)
4347 {
4348#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4349 if (nzombies < MAX_ZOMBIES)
83fc9c63 4350 zombies[nzombies] = obj;
182ff242
GM
4351 ++nzombies;
4352#endif
49723c04 4353 mark_object (obj);
182ff242
GM
4354 }
4355 }
4356}
ece93c02
GM
4357
4358
4359/* If P points to Lisp data, mark that as live if it isn't already
4360 marked. */
4361
b0ab8123 4362static void
971de7fb 4363mark_maybe_pointer (void *p)
ece93c02
GM
4364{
4365 struct mem_node *m;
4366
bfe3e0a2 4367 /* Quickly rule out some values which can't point to Lisp data.
2b90362b 4368 USE_LSB_TAG needs Lisp data to be aligned on multiples of GCALIGNMENT.
bfe3e0a2 4369 Otherwise, assume that Lisp data is aligned on even addresses. */
2b90362b 4370 if ((intptr_t) p % (USE_LSB_TAG ? GCALIGNMENT : 2))
ece93c02 4371 return;
177c0ea7 4372
ece93c02
GM
4373 m = mem_find (p);
4374 if (m != MEM_NIL)
4375 {
4376 Lisp_Object obj = Qnil;
177c0ea7 4377
ece93c02
GM
4378 switch (m->type)
4379 {
4380 case MEM_TYPE_NON_LISP:
5474c384 4381 case MEM_TYPE_SPARE:
2fe50224 4382 /* Nothing to do; not a pointer to Lisp memory. */
ece93c02 4383 break;
177c0ea7 4384
ece93c02 4385 case MEM_TYPE_BUFFER:
5e617bc2 4386 if (live_buffer_p (m, p) && !VECTOR_MARKED_P ((struct buffer *)p))
ece93c02
GM
4387 XSETVECTOR (obj, p);
4388 break;
177c0ea7 4389
ece93c02 4390 case MEM_TYPE_CONS:
08b7c2cb 4391 if (live_cons_p (m, p) && !CONS_MARKED_P ((struct Lisp_Cons *) p))
ece93c02
GM
4392 XSETCONS (obj, p);
4393 break;
177c0ea7 4394
ece93c02
GM
4395 case MEM_TYPE_STRING:
4396 if (live_string_p (m, p)
4397 && !STRING_MARKED_P ((struct Lisp_String *) p))
4398 XSETSTRING (obj, p);
4399 break;
4400
4401 case MEM_TYPE_MISC:
2336fe58
SM
4402 if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit)
4403 XSETMISC (obj, p);
ece93c02 4404 break;
177c0ea7 4405
ece93c02 4406 case MEM_TYPE_SYMBOL:
2336fe58 4407 if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit)
ece93c02
GM
4408 XSETSYMBOL (obj, p);
4409 break;
177c0ea7 4410
ece93c02 4411 case MEM_TYPE_FLOAT:
ab6780cd 4412 if (live_float_p (m, p) && !FLOAT_MARKED_P (p))
ece93c02
GM
4413 XSETFLOAT (obj, p);
4414 break;
177c0ea7 4415
9c545a55 4416 case MEM_TYPE_VECTORLIKE:
f3372c87 4417 case MEM_TYPE_VECTOR_BLOCK:
ece93c02
GM
4418 if (live_vector_p (m, p))
4419 {
4420 Lisp_Object tem;
4421 XSETVECTOR (tem, p);
8e50cc2d 4422 if (!SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem)))
ece93c02
GM
4423 obj = tem;
4424 }
4425 break;
4426
4427 default:
1088b922 4428 emacs_abort ();
ece93c02
GM
4429 }
4430
8e50cc2d 4431 if (!NILP (obj))
49723c04 4432 mark_object (obj);
ece93c02
GM
4433 }
4434}
4435
4436
e32a5799 4437/* Alignment of pointer values. Use alignof, as it sometimes returns
e3fb2efb
PE
4438 a smaller alignment than GCC's __alignof__ and mark_memory might
4439 miss objects if __alignof__ were used. */
e32a5799 4440#define GC_POINTER_ALIGNMENT alignof (void *)
3164aeac 4441
e3fb2efb
PE
4442/* Define POINTERS_MIGHT_HIDE_IN_OBJECTS to 1 if marking via C pointers does
4443 not suffice, which is the typical case. A host where a Lisp_Object is
4444 wider than a pointer might allocate a Lisp_Object in non-adjacent halves.
4445 If USE_LSB_TAG, the bottom half is not a valid pointer, but it should
4446 suffice to widen it to to a Lisp_Object and check it that way. */
bfe3e0a2
PE
4447#if USE_LSB_TAG || VAL_MAX < UINTPTR_MAX
4448# if !USE_LSB_TAG && VAL_MAX < UINTPTR_MAX >> GCTYPEBITS
e3fb2efb
PE
4449 /* If tag bits straddle pointer-word boundaries, neither mark_maybe_pointer
4450 nor mark_maybe_object can follow the pointers. This should not occur on
4451 any practical porting target. */
4452# error "MSB type bits straddle pointer-word boundaries"
4453# endif
4454 /* Marking via C pointers does not suffice, because Lisp_Objects contain
4455 pointer words that hold pointers ORed with type bits. */
4456# define POINTERS_MIGHT_HIDE_IN_OBJECTS 1
4457#else
4458 /* Marking via C pointers suffices, because Lisp_Objects contain pointer
4459 words that hold unmodified pointers. */
4460# define POINTERS_MIGHT_HIDE_IN_OBJECTS 0
4461#endif
4462
55a314a5
YM
4463/* Mark Lisp objects referenced from the address range START+OFFSET..END
4464 or END+OFFSET..START. */
34400008 4465
177c0ea7 4466static void
3164aeac 4467mark_memory (void *start, void *end)
b41253a3
JW
4468#if defined (__clang__) && defined (__has_feature)
4469#if __has_feature(address_sanitizer)
ed6b3510
JW
4470 /* Do not allow -faddress-sanitizer to check this function, since it
4471 crosses the function stack boundary, and thus would yield many
4472 false positives. */
4473 __attribute__((no_address_safety_analysis))
4474#endif
b41253a3 4475#endif
34400008 4476{
ece93c02 4477 void **pp;
3164aeac 4478 int i;
34400008
GM
4479
4480#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4481 nzombies = 0;
4482#endif
4483
4484 /* Make START the pointer to the start of the memory region,
4485 if it isn't already. */
4486 if (end < start)
4487 {
4488 void *tem = start;
4489 start = end;
4490 end = tem;
4491 }
ece93c02 4492
ece93c02
GM
4493 /* Mark Lisp data pointed to. This is necessary because, in some
4494 situations, the C compiler optimizes Lisp objects away, so that
4495 only a pointer to them remains. Example:
4496
4497 DEFUN ("testme", Ftestme, Stestme, 0, 0, 0, "")
7ee72033 4498 ()
ece93c02
GM
4499 {
4500 Lisp_Object obj = build_string ("test");
4501 struct Lisp_String *s = XSTRING (obj);
4502 Fgarbage_collect ();
4503 fprintf (stderr, "test `%s'\n", s->data);
4504 return Qnil;
4505 }
4506
4507 Here, `obj' isn't really used, and the compiler optimizes it
4508 away. The only reference to the life string is through the
4509 pointer `s'. */
177c0ea7 4510
3164aeac
PE
4511 for (pp = start; (void *) pp < end; pp++)
4512 for (i = 0; i < sizeof *pp; i += GC_POINTER_ALIGNMENT)
27f3c637 4513 {
e3fb2efb
PE
4514 void *p = *(void **) ((char *) pp + i);
4515 mark_maybe_pointer (p);
4516 if (POINTERS_MIGHT_HIDE_IN_OBJECTS)
646b5f55 4517 mark_maybe_object (XIL ((intptr_t) p));
27f3c637 4518 }
182ff242
GM
4519}
4520
182ff242
GM
4521#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
4522
fce31d69
PE
4523static bool setjmp_tested_p;
4524static int longjmps_done;
182ff242
GM
4525
4526#define SETJMP_WILL_LIKELY_WORK "\
4527\n\
4528Emacs garbage collector has been changed to use conservative stack\n\
4529marking. Emacs has determined that the method it uses to do the\n\
4530marking will likely work on your system, but this isn't sure.\n\
4531\n\
4532If you are a system-programmer, or can get the help of a local wizard\n\
4533who is, please take a look at the function mark_stack in alloc.c, and\n\
4534verify that the methods used are appropriate for your system.\n\
4535\n\
d191623b 4536Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4537"
4538
4539#define SETJMP_WILL_NOT_WORK "\
4540\n\
4541Emacs garbage collector has been changed to use conservative stack\n\
4542marking. Emacs has determined that the default method it uses to do the\n\
4543marking will not work on your system. We will need a system-dependent\n\
4544solution for your system.\n\
4545\n\
4546Please take a look at the function mark_stack in alloc.c, and\n\
4547try to find a way to make it work on your system.\n\
30f637f8
DL
4548\n\
4549Note that you may get false negatives, depending on the compiler.\n\
4550In particular, you need to use -O with GCC for this test.\n\
4551\n\
d191623b 4552Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4553"
4554
4555
4556/* Perform a quick check if it looks like setjmp saves registers in a
4557 jmp_buf. Print a message to stderr saying so. When this test
4558 succeeds, this is _not_ a proof that setjmp is sufficient for
4559 conservative stack marking. Only the sources or a disassembly
4560 can prove that. */
4561
4562static void
2018939f 4563test_setjmp (void)
182ff242
GM
4564{
4565 char buf[10];
4566 register int x;
0328b6de 4567 sys_jmp_buf jbuf;
182ff242
GM
4568
4569 /* Arrange for X to be put in a register. */
4570 sprintf (buf, "1");
4571 x = strlen (buf);
4572 x = 2 * x - 1;
4573
0328b6de 4574 sys_setjmp (jbuf);
182ff242 4575 if (longjmps_done == 1)
34400008 4576 {
182ff242 4577 /* Came here after the longjmp at the end of the function.
34400008 4578
182ff242
GM
4579 If x == 1, the longjmp has restored the register to its
4580 value before the setjmp, and we can hope that setjmp
4581 saves all such registers in the jmp_buf, although that
4582 isn't sure.
34400008 4583
182ff242
GM
4584 For other values of X, either something really strange is
4585 taking place, or the setjmp just didn't save the register. */
4586
4587 if (x == 1)
4588 fprintf (stderr, SETJMP_WILL_LIKELY_WORK);
4589 else
4590 {
4591 fprintf (stderr, SETJMP_WILL_NOT_WORK);
4592 exit (1);
34400008
GM
4593 }
4594 }
182ff242
GM
4595
4596 ++longjmps_done;
4597 x = 2;
4598 if (longjmps_done == 1)
0328b6de 4599 sys_longjmp (jbuf, 1);
34400008
GM
4600}
4601
182ff242
GM
4602#endif /* not GC_SAVE_REGISTERS_ON_STACK && not GC_SETJMP_WORKS */
4603
34400008
GM
4604
4605#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4606
4607/* Abort if anything GCPRO'd doesn't survive the GC. */
4608
4609static void
2018939f 4610check_gcpros (void)
34400008
GM
4611{
4612 struct gcpro *p;
f66c7cf8 4613 ptrdiff_t i;
34400008
GM
4614
4615 for (p = gcprolist; p; p = p->next)
4616 for (i = 0; i < p->nvars; ++i)
4617 if (!survives_gc_p (p->var[i]))
92cc28b2
SM
4618 /* FIXME: It's not necessarily a bug. It might just be that the
4619 GCPRO is unnecessary or should release the object sooner. */
1088b922 4620 emacs_abort ();
34400008
GM
4621}
4622
4623#elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4624
0c5307b0 4625void
2018939f 4626dump_zombies (void)
34400008
GM
4627{
4628 int i;
4629
6e4b3fbe 4630 fprintf (stderr, "\nZombies kept alive = %"pI"d:\n", nzombies);
34400008
GM
4631 for (i = 0; i < min (MAX_ZOMBIES, nzombies); ++i)
4632 {
4633 fprintf (stderr, " %d = ", i);
4634 debug_print (zombies[i]);
4635 }
4636}
4637
4638#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
4639
4640
182ff242
GM
4641/* Mark live Lisp objects on the C stack.
4642
4643 There are several system-dependent problems to consider when
4644 porting this to new architectures:
4645
4646 Processor Registers
4647
4648 We have to mark Lisp objects in CPU registers that can hold local
4649 variables or are used to pass parameters.
4650
4651 If GC_SAVE_REGISTERS_ON_STACK is defined, it should expand to
4652 something that either saves relevant registers on the stack, or
4653 calls mark_maybe_object passing it each register's contents.
4654
4655 If GC_SAVE_REGISTERS_ON_STACK is not defined, the current
4656 implementation assumes that calling setjmp saves registers we need
4657 to see in a jmp_buf which itself lies on the stack. This doesn't
4658 have to be true! It must be verified for each system, possibly
4659 by taking a look at the source code of setjmp.
4660
2018939f
AS
4661 If __builtin_unwind_init is available (defined by GCC >= 2.8) we
4662 can use it as a machine independent method to store all registers
4663 to the stack. In this case the macros described in the previous
4664 two paragraphs are not used.
4665
182ff242
GM
4666 Stack Layout
4667
4668 Architectures differ in the way their processor stack is organized.
4669 For example, the stack might look like this
4670
4671 +----------------+
4672 | Lisp_Object | size = 4
4673 +----------------+
4674 | something else | size = 2
4675 +----------------+
4676 | Lisp_Object | size = 4
4677 +----------------+
4678 | ... |
4679
4680 In such a case, not every Lisp_Object will be aligned equally. To
4681 find all Lisp_Object on the stack it won't be sufficient to walk
4682 the stack in steps of 4 bytes. Instead, two passes will be
4683 necessary, one starting at the start of the stack, and a second
4684 pass starting at the start of the stack + 2. Likewise, if the
4685 minimal alignment of Lisp_Objects on the stack is 1, four passes
4686 would be necessary, each one starting with one byte more offset
c9af454e 4687 from the stack start. */
34400008
GM
4688
4689static void
971de7fb 4690mark_stack (void)
34400008 4691{
34400008
GM
4692 void *end;
4693
2018939f
AS
4694#ifdef HAVE___BUILTIN_UNWIND_INIT
4695 /* Force callee-saved registers and register windows onto the stack.
4696 This is the preferred method if available, obviating the need for
4697 machine dependent methods. */
4698 __builtin_unwind_init ();
4699 end = &end;
4700#else /* not HAVE___BUILTIN_UNWIND_INIT */
dff45157
PE
4701#ifndef GC_SAVE_REGISTERS_ON_STACK
4702 /* jmp_buf may not be aligned enough on darwin-ppc64 */
4703 union aligned_jmpbuf {
4704 Lisp_Object o;
0328b6de 4705 sys_jmp_buf j;
dff45157 4706 } j;
fce31d69 4707 volatile bool stack_grows_down_p = (char *) &j > (char *) stack_base;
dff45157 4708#endif
34400008
GM
4709 /* This trick flushes the register windows so that all the state of
4710 the process is contained in the stack. */
ab6780cd 4711 /* Fixme: Code in the Boehm GC suggests flushing (with `flushrs') is
422eec7e
DL
4712 needed on ia64 too. See mach_dep.c, where it also says inline
4713 assembler doesn't work with relevant proprietary compilers. */
4a00783e 4714#ifdef __sparc__
4d18a7a2
DN
4715#if defined (__sparc64__) && defined (__FreeBSD__)
4716 /* FreeBSD does not have a ta 3 handler. */
4c1616be
CY
4717 asm ("flushw");
4718#else
34400008 4719 asm ("ta 3");
4c1616be 4720#endif
34400008 4721#endif
177c0ea7 4722
34400008
GM
4723 /* Save registers that we need to see on the stack. We need to see
4724 registers used to hold register variables and registers used to
4725 pass parameters. */
4726#ifdef GC_SAVE_REGISTERS_ON_STACK
4727 GC_SAVE_REGISTERS_ON_STACK (end);
182ff242 4728#else /* not GC_SAVE_REGISTERS_ON_STACK */
177c0ea7 4729
182ff242
GM
4730#ifndef GC_SETJMP_WORKS /* If it hasn't been checked yet that
4731 setjmp will definitely work, test it
4732 and print a message with the result
4733 of the test. */
4734 if (!setjmp_tested_p)
4735 {
4736 setjmp_tested_p = 1;
4737 test_setjmp ();
4738 }
4739#endif /* GC_SETJMP_WORKS */
177c0ea7 4740
0328b6de 4741 sys_setjmp (j.j);
34400008 4742 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
182ff242 4743#endif /* not GC_SAVE_REGISTERS_ON_STACK */
2018939f 4744#endif /* not HAVE___BUILTIN_UNWIND_INIT */
34400008
GM
4745
4746 /* This assumes that the stack is a contiguous region in memory. If
182ff242
GM
4747 that's not the case, something has to be done here to iterate
4748 over the stack segments. */
3164aeac
PE
4749 mark_memory (stack_base, end);
4750
4dec23ff
AS
4751 /* Allow for marking a secondary stack, like the register stack on the
4752 ia64. */
4753#ifdef GC_MARK_SECONDARY_STACK
4754 GC_MARK_SECONDARY_STACK ();
4755#endif
34400008
GM
4756
4757#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4758 check_gcpros ();
4759#endif
4760}
4761
0c5307b0
DA
4762#else /* GC_MARK_STACK == 0 */
4763
4764#define mark_maybe_object(obj) emacs_abort ()
4765
34400008
GM
4766#endif /* GC_MARK_STACK != 0 */
4767
4768
7ffb6955 4769/* Determine whether it is safe to access memory at address P. */
d3d47262 4770static int
971de7fb 4771valid_pointer_p (void *p)
7ffb6955 4772{
f892cf9c
EZ
4773#ifdef WINDOWSNT
4774 return w32_valid_pointer_p (p, 16);
4775#else
41bed37d 4776 int fd[2];
7ffb6955
KS
4777
4778 /* Obviously, we cannot just access it (we would SEGV trying), so we
4779 trick the o/s to tell us whether p is a valid pointer.
4780 Unfortunately, we cannot use NULL_DEVICE here, as emacs_write may
4781 not validate p in that case. */
4782
c7ddc792 4783 if (emacs_pipe (fd) == 0)
7ffb6955 4784 {
fce31d69 4785 bool valid = emacs_write (fd[1], (char *) p, 16) == 16;
41bed37d
PE
4786 emacs_close (fd[1]);
4787 emacs_close (fd[0]);
7ffb6955
KS
4788 return valid;
4789 }
4790
4791 return -1;
f892cf9c 4792#endif
7ffb6955 4793}
3cd55735 4794
6cda572a
DA
4795/* Return 2 if OBJ is a killed or special buffer object, 1 if OBJ is a
4796 valid lisp object, 0 if OBJ is NOT a valid lisp object, or -1 if we
4797 cannot validate OBJ. This function can be quite slow, so its primary
4798 use is the manual debugging. The only exception is print_object, where
4799 we use it to check whether the memory referenced by the pointer of
4800 Lisp_Save_Value object contains valid objects. */
3cd55735
KS
4801
4802int
971de7fb 4803valid_lisp_object_p (Lisp_Object obj)
3cd55735 4804{
de7124a7 4805 void *p;
7ffb6955 4806#if GC_MARK_STACK
3cd55735 4807 struct mem_node *m;
de7124a7 4808#endif
3cd55735
KS
4809
4810 if (INTEGERP (obj))
4811 return 1;
4812
4813 p = (void *) XPNTR (obj);
3cd55735
KS
4814 if (PURE_POINTER_P (p))
4815 return 1;
4816
c1ca42ca
DA
4817 if (p == &buffer_defaults || p == &buffer_local_symbols)
4818 return 2;
4819
de7124a7 4820#if !GC_MARK_STACK
7ffb6955 4821 return valid_pointer_p (p);
de7124a7
KS
4822#else
4823
3cd55735
KS
4824 m = mem_find (p);
4825
4826 if (m == MEM_NIL)
7ffb6955
KS
4827 {
4828 int valid = valid_pointer_p (p);
4829 if (valid <= 0)
4830 return valid;
4831
4832 if (SUBRP (obj))
4833 return 1;
4834
4835 return 0;
4836 }
3cd55735
KS
4837
4838 switch (m->type)
4839 {
4840 case MEM_TYPE_NON_LISP:
5474c384 4841 case MEM_TYPE_SPARE:
3cd55735
KS
4842 return 0;
4843
4844 case MEM_TYPE_BUFFER:
c1ca42ca 4845 return live_buffer_p (m, p) ? 1 : 2;
3cd55735
KS
4846
4847 case MEM_TYPE_CONS:
4848 return live_cons_p (m, p);
4849
4850 case MEM_TYPE_STRING:
4851 return live_string_p (m, p);
4852
4853 case MEM_TYPE_MISC:
4854 return live_misc_p (m, p);
4855
4856 case MEM_TYPE_SYMBOL:
4857 return live_symbol_p (m, p);
4858
4859 case MEM_TYPE_FLOAT:
4860 return live_float_p (m, p);
4861
9c545a55 4862 case MEM_TYPE_VECTORLIKE:
f3372c87 4863 case MEM_TYPE_VECTOR_BLOCK:
3cd55735
KS
4864 return live_vector_p (m, p);
4865
4866 default:
4867 break;
4868 }
4869
4870 return 0;
4871#endif
4872}
4873
4874
4875
34400008 4876\f
2e471eb5
GM
4877/***********************************************************************
4878 Pure Storage Management
4879 ***********************************************************************/
4880
1f0b3fd2
GM
4881/* Allocate room for SIZE bytes from pure Lisp storage and return a
4882 pointer to it. TYPE is the Lisp type for which the memory is
e5bc14d4 4883 allocated. TYPE < 0 means it's not used for a Lisp object. */
1f0b3fd2 4884
261cb4bb 4885static void *
971de7fb 4886pure_alloc (size_t size, int type)
1f0b3fd2 4887{
261cb4bb 4888 void *result;
bfe3e0a2 4889#if USE_LSB_TAG
2b90362b 4890 size_t alignment = GCALIGNMENT;
6b61353c 4891#else
e32a5799 4892 size_t alignment = alignof (EMACS_INT);
1f0b3fd2
GM
4893
4894 /* Give Lisp_Floats an extra alignment. */
4895 if (type == Lisp_Float)
e32a5799 4896 alignment = alignof (struct Lisp_Float);
6b61353c 4897#endif
1f0b3fd2 4898
44117420 4899 again:
e5bc14d4
YM
4900 if (type >= 0)
4901 {
4902 /* Allocate space for a Lisp object from the beginning of the free
4903 space with taking account of alignment. */
4904 result = ALIGN (purebeg + pure_bytes_used_lisp, alignment);
4905 pure_bytes_used_lisp = ((char *)result - (char *)purebeg) + size;
4906 }
4907 else
4908 {
4909 /* Allocate space for a non-Lisp object from the end of the free
4910 space. */
4911 pure_bytes_used_non_lisp += size;
4912 result = purebeg + pure_size - pure_bytes_used_non_lisp;
4913 }
4914 pure_bytes_used = pure_bytes_used_lisp + pure_bytes_used_non_lisp;
44117420
KS
4915
4916 if (pure_bytes_used <= pure_size)
4917 return result;
4918
4919 /* Don't allocate a large amount here,
4920 because it might get mmap'd and then its address
4921 might not be usable. */
23f86fce 4922 purebeg = xmalloc (10000);
44117420
KS
4923 pure_size = 10000;
4924 pure_bytes_used_before_overflow += pure_bytes_used - size;
4925 pure_bytes_used = 0;
e5bc14d4 4926 pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;
44117420 4927 goto again;
1f0b3fd2
GM
4928}
4929
4930
852f8cdc 4931/* Print a warning if PURESIZE is too small. */
9e713715
GM
4932
4933void
971de7fb 4934check_pure_size (void)
9e713715
GM
4935{
4936 if (pure_bytes_used_before_overflow)
c2982e87
PE
4937 message (("emacs:0:Pure Lisp storage overflow (approx. %"pI"d"
4938 " bytes needed)"),
4939 pure_bytes_used + pure_bytes_used_before_overflow);
9e713715
GM
4940}
4941
4942
79fd0489
YM
4943/* Find the byte sequence {DATA[0], ..., DATA[NBYTES-1], '\0'} from
4944 the non-Lisp data pool of the pure storage, and return its start
4945 address. Return NULL if not found. */
4946
4947static char *
d311d28c 4948find_string_data_in_pure (const char *data, ptrdiff_t nbytes)
79fd0489 4949{
14162469 4950 int i;
d311d28c 4951 ptrdiff_t skip, bm_skip[256], last_char_skip, infinity, start, start_max;
2aff7c53 4952 const unsigned char *p;
79fd0489
YM
4953 char *non_lisp_beg;
4954
d311d28c 4955 if (pure_bytes_used_non_lisp <= nbytes)
79fd0489
YM
4956 return NULL;
4957
4958 /* Set up the Boyer-Moore table. */
4959 skip = nbytes + 1;
4960 for (i = 0; i < 256; i++)
4961 bm_skip[i] = skip;
4962
2aff7c53 4963 p = (const unsigned char *) data;
79fd0489
YM
4964 while (--skip > 0)
4965 bm_skip[*p++] = skip;
4966
4967 last_char_skip = bm_skip['\0'];
4968
4969 non_lisp_beg = purebeg + pure_size - pure_bytes_used_non_lisp;
4970 start_max = pure_bytes_used_non_lisp - (nbytes + 1);
4971
4972 /* See the comments in the function `boyer_moore' (search.c) for the
4973 use of `infinity'. */
4974 infinity = pure_bytes_used_non_lisp + 1;
4975 bm_skip['\0'] = infinity;
4976
2aff7c53 4977 p = (const unsigned char *) non_lisp_beg + nbytes;
79fd0489
YM
4978 start = 0;
4979 do
4980 {
4981 /* Check the last character (== '\0'). */
4982 do
4983 {
4984 start += bm_skip[*(p + start)];
4985 }
4986 while (start <= start_max);
4987
4988 if (start < infinity)
4989 /* Couldn't find the last character. */
4990 return NULL;
4991
4992 /* No less than `infinity' means we could find the last
4993 character at `p[start - infinity]'. */
4994 start -= infinity;
4995
4996 /* Check the remaining characters. */
4997 if (memcmp (data, non_lisp_beg + start, nbytes) == 0)
4998 /* Found. */
4999 return non_lisp_beg + start;
5000
5001 start += last_char_skip;
5002 }
5003 while (start <= start_max);
5004
5005 return NULL;
5006}
5007
5008
2e471eb5
GM
5009/* Return a string allocated in pure space. DATA is a buffer holding
5010 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
fce31d69 5011 means make the result string multibyte.
1a4f1e2c 5012
2e471eb5
GM
5013 Must get an error if pure storage is full, since if it cannot hold
5014 a large string it may be able to hold conses that point to that
5015 string; then the string is not protected from gc. */
7146af97
JB
5016
5017Lisp_Object
14162469 5018make_pure_string (const char *data,
fce31d69 5019 ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
7146af97 5020{
2e471eb5 5021 Lisp_Object string;
98c6f1e3 5022 struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
90256841 5023 s->data = (unsigned char *) find_string_data_in_pure (data, nbytes);
79fd0489
YM
5024 if (s->data == NULL)
5025 {
98c6f1e3 5026 s->data = pure_alloc (nbytes + 1, -1);
72af86bd 5027 memcpy (s->data, data, nbytes);
79fd0489
YM
5028 s->data[nbytes] = '\0';
5029 }
2e471eb5
GM
5030 s->size = nchars;
5031 s->size_byte = multibyte ? nbytes : -1;
77c7bcb1 5032 s->intervals = NULL;
2e471eb5
GM
5033 XSETSTRING (string, s);
5034 return string;
7146af97
JB
5035}
5036
2a0213a6
DA
5037/* Return a string allocated in pure space. Do not
5038 allocate the string data, just point to DATA. */
a56eaaef
DN
5039
5040Lisp_Object
2a0213a6 5041make_pure_c_string (const char *data, ptrdiff_t nchars)
a56eaaef
DN
5042{
5043 Lisp_Object string;
98c6f1e3 5044 struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
a56eaaef
DN
5045 s->size = nchars;
5046 s->size_byte = -1;
323637a2 5047 s->data = (unsigned char *) data;
77c7bcb1 5048 s->intervals = NULL;
a56eaaef
DN
5049 XSETSTRING (string, s);
5050 return string;
5051}
2e471eb5 5052
34400008
GM
5053/* Return a cons allocated from pure space. Give it pure copies
5054 of CAR as car and CDR as cdr. */
5055
7146af97 5056Lisp_Object
971de7fb 5057pure_cons (Lisp_Object car, Lisp_Object cdr)
7146af97 5058{
98c6f1e3
PE
5059 Lisp_Object new;
5060 struct Lisp_Cons *p = pure_alloc (sizeof *p, Lisp_Cons);
1f0b3fd2 5061 XSETCONS (new, p);
f3fbd155
KR
5062 XSETCAR (new, Fpurecopy (car));
5063 XSETCDR (new, Fpurecopy (cdr));
7146af97
JB
5064 return new;
5065}
5066
7146af97 5067
34400008
GM
5068/* Value is a float object with value NUM allocated from pure space. */
5069
d3d47262 5070static Lisp_Object
971de7fb 5071make_pure_float (double num)
7146af97 5072{
98c6f1e3
PE
5073 Lisp_Object new;
5074 struct Lisp_Float *p = pure_alloc (sizeof *p, Lisp_Float);
1f0b3fd2 5075 XSETFLOAT (new, p);
f601cdf3 5076 XFLOAT_INIT (new, num);
7146af97
JB
5077 return new;
5078}
5079
34400008
GM
5080
5081/* Return a vector with room for LEN Lisp_Objects allocated from
5082 pure space. */
5083
72cb32cf 5084static Lisp_Object
d311d28c 5085make_pure_vector (ptrdiff_t len)
7146af97 5086{
1f0b3fd2 5087 Lisp_Object new;
d06714cb 5088 size_t size = header_size + len * word_size;
98c6f1e3 5089 struct Lisp_Vector *p = pure_alloc (size, Lisp_Vectorlike);
1f0b3fd2 5090 XSETVECTOR (new, p);
eab3844f 5091 XVECTOR (new)->header.size = len;
7146af97
JB
5092 return new;
5093}
5094
34400008 5095
a7ca3326 5096DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
909e3b33 5097 doc: /* Make a copy of object OBJ in pure storage.
228299fa 5098Recursively copies contents of vectors and cons cells.
7ee72033 5099Does not copy symbols. Copies strings without text properties. */)
5842a27b 5100 (register Lisp_Object obj)
7146af97 5101{
265a9e55 5102 if (NILP (Vpurify_flag))
7146af97
JB
5103 return obj;
5104
1f0b3fd2 5105 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
5106 return obj;
5107
e9515805
SM
5108 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
5109 {
5110 Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil);
5111 if (!NILP (tmp))
5112 return tmp;
5113 }
5114
d6dd74bb 5115 if (CONSP (obj))
e9515805 5116 obj = pure_cons (XCAR (obj), XCDR (obj));
d6dd74bb 5117 else if (FLOATP (obj))
e9515805 5118 obj = make_pure_float (XFLOAT_DATA (obj));
d6dd74bb 5119 else if (STRINGP (obj))
42a5b22f 5120 obj = make_pure_string (SSDATA (obj), SCHARS (obj),
e9515805
SM
5121 SBYTES (obj),
5122 STRING_MULTIBYTE (obj));
876c194c 5123 else if (COMPILEDP (obj) || VECTORP (obj))
d6dd74bb
KH
5124 {
5125 register struct Lisp_Vector *vec;
d311d28c
PE
5126 register ptrdiff_t i;
5127 ptrdiff_t size;
d6dd74bb 5128
77b37c05 5129 size = ASIZE (obj);
7d535c68
KH
5130 if (size & PSEUDOVECTOR_FLAG)
5131 size &= PSEUDOVECTOR_SIZE_MASK;
6b61353c 5132 vec = XVECTOR (make_pure_vector (size));
d6dd74bb 5133 for (i = 0; i < size; i++)
28be1ada 5134 vec->contents[i] = Fpurecopy (AREF (obj, i));
876c194c 5135 if (COMPILEDP (obj))
985773c9 5136 {
876c194c
SM
5137 XSETPVECTYPE (vec, PVEC_COMPILED);
5138 XSETCOMPILED (obj, vec);
985773c9 5139 }
d6dd74bb
KH
5140 else
5141 XSETVECTOR (obj, vec);
7146af97 5142 }
d6dd74bb
KH
5143 else if (MARKERP (obj))
5144 error ("Attempt to copy a marker to pure storage");
e9515805
SM
5145 else
5146 /* Not purified, don't hash-cons. */
5147 return obj;
5148
5149 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
5150 Fputhash (obj, obj, Vpurify_flag);
6bbd7a29
GM
5151
5152 return obj;
7146af97 5153}
2e471eb5 5154
34400008 5155
7146af97 5156\f
34400008
GM
5157/***********************************************************************
5158 Protection from GC
5159 ***********************************************************************/
5160
2e471eb5
GM
5161/* Put an entry in staticvec, pointing at the variable with address
5162 VARADDRESS. */
7146af97
JB
5163
5164void
971de7fb 5165staticpro (Lisp_Object *varaddress)
7146af97 5166{
7146af97 5167 if (staticidx >= NSTATICS)
afb8aa24 5168 fatal ("NSTATICS too small; try increasing and recompiling Emacs.");
4195afc3 5169 staticvec[staticidx++] = varaddress;
7146af97
JB
5170}
5171
7146af97 5172\f
34400008
GM
5173/***********************************************************************
5174 Protection from GC
5175 ***********************************************************************/
1a4f1e2c 5176
e8197642
RS
5177/* Temporarily prevent garbage collection. */
5178
d311d28c 5179ptrdiff_t
971de7fb 5180inhibit_garbage_collection (void)
e8197642 5181{
d311d28c 5182 ptrdiff_t count = SPECPDL_INDEX ();
54defd0d 5183
6349ae4d 5184 specbind (Qgc_cons_threshold, make_number (MOST_POSITIVE_FIXNUM));
e8197642
RS
5185 return count;
5186}
5187
3ab6e069
DA
5188/* Used to avoid possible overflows when
5189 converting from C to Lisp integers. */
5190
b0ab8123 5191static Lisp_Object
3ab6e069
DA
5192bounded_number (EMACS_INT number)
5193{
5194 return make_number (min (MOST_POSITIVE_FIXNUM, number));
5195}
34400008 5196
12b3895d
TM
5197/* Calculate total bytes of live objects. */
5198
5199static size_t
5200total_bytes_of_live_objects (void)
5201{
5202 size_t tot = 0;
5203 tot += total_conses * sizeof (struct Lisp_Cons);
5204 tot += total_symbols * sizeof (struct Lisp_Symbol);
5205 tot += total_markers * sizeof (union Lisp_Misc);
5206 tot += total_string_bytes;
5207 tot += total_vector_slots * word_size;
5208 tot += total_floats * sizeof (struct Lisp_Float);
5209 tot += total_intervals * sizeof (struct interval);
5210 tot += total_strings * sizeof (struct Lisp_String);
5211 return tot;
5212}
5213
a7ca3326 5214DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
7ee72033 5215 doc: /* Reclaim storage for Lisp objects no longer needed.
e1e37596
RS
5216Garbage collection happens automatically if you cons more than
5217`gc-cons-threshold' bytes of Lisp data since previous garbage collection.
5db81e33
SM
5218`garbage-collect' normally returns a list with info on amount of space in use,
5219where each entry has the form (NAME SIZE USED FREE), where:
5220- NAME is a symbol describing the kind of objects this entry represents,
5221- SIZE is the number of bytes used by each one,
5222- USED is the number of those objects that were found live in the heap,
5223- FREE is the number of those objects that are not live but that Emacs
5224 keeps around for future allocations (maybe because it does not know how
5225 to return them to the OS).
e1e37596 5226However, if there was overflow in pure space, `garbage-collect'
999dd333
GM
5227returns nil, because real GC can't be done.
5228See Info node `(elisp)Garbage Collection'. */)
5842a27b 5229 (void)
7146af97 5230{
fce31d69 5231 struct buffer *nextb;
7146af97 5232 char stack_top_variable;
f66c7cf8 5233 ptrdiff_t i;
fce31d69 5234 bool message_p;
d311d28c 5235 ptrdiff_t count = SPECPDL_INDEX ();
43aac990 5236 struct timespec start;
fecbd8ff 5237 Lisp_Object retval = Qnil;
12b3895d 5238 size_t tot_before = 0;
2c5bd608 5239
3de0effb 5240 if (abort_on_gc)
1088b922 5241 emacs_abort ();
3de0effb 5242
9e713715
GM
5243 /* Can't GC if pure storage overflowed because we can't determine
5244 if something is a pure object or not. */
5245 if (pure_bytes_used_before_overflow)
5246 return Qnil;
5247
3d80c99f 5248 /* Record this function, so it appears on the profiler's backtraces. */
2f592f95 5249 record_in_backtrace (Qautomatic_gc, &Qnil, 0);
3d80c99f 5250
7e63e0c3 5251 check_cons_list ();
bbc012e0 5252
3c7e66a8
RS
5253 /* Don't keep undo information around forever.
5254 Do this early on, so it is no problem if the user quits. */
52b852c7 5255 FOR_EACH_BUFFER (nextb)
9cd47b72 5256 compact_buffer (nextb);
3c7e66a8 5257
6521894d 5258 if (profiler_memory_running)
12b3895d
TM
5259 tot_before = total_bytes_of_live_objects ();
5260
43aac990 5261 start = current_timespec ();
3c7e66a8 5262
58595309
KH
5263 /* In case user calls debug_print during GC,
5264 don't let that cause a recursive GC. */
5265 consing_since_gc = 0;
5266
6efc7df7
GM
5267 /* Save what's currently displayed in the echo area. */
5268 message_p = push_message ();
27e498e6 5269 record_unwind_protect_void (pop_message_unwind);
41c28a37 5270
7146af97
JB
5271 /* Save a copy of the contents of the stack, for debugging. */
5272#if MAX_SAVE_STACK > 0
265a9e55 5273 if (NILP (Vpurify_flag))
7146af97 5274 {
dd3f25f7 5275 char *stack;
903fe15d 5276 ptrdiff_t stack_size;
dd3f25f7 5277 if (&stack_top_variable < stack_bottom)
7146af97 5278 {
dd3f25f7
PE
5279 stack = &stack_top_variable;
5280 stack_size = stack_bottom - &stack_top_variable;
5281 }
5282 else
5283 {
5284 stack = stack_bottom;
5285 stack_size = &stack_top_variable - stack_bottom;
5286 }
5287 if (stack_size <= MAX_SAVE_STACK)
7146af97 5288 {
dd3f25f7 5289 if (stack_copy_size < stack_size)
7146af97 5290 {
38182d90 5291 stack_copy = xrealloc (stack_copy, stack_size);
dd3f25f7 5292 stack_copy_size = stack_size;
7146af97 5293 }
dd3f25f7 5294 memcpy (stack_copy, stack, stack_size);
7146af97
JB
5295 }
5296 }
5297#endif /* MAX_SAVE_STACK > 0 */
5298
299585ee 5299 if (garbage_collection_messages)
691c4285 5300 message1_nolog ("Garbage collecting...");
7146af97 5301
4d7e6e51 5302 block_input ();
6e0fca1d 5303
eec7b73d
RS
5304 shrink_regexp_cache ();
5305
7146af97
JB
5306 gc_in_progress = 1;
5307
005ca5c7 5308 /* Mark all the special slots that serve as the roots of accessibility. */
7146af97 5309
c752cfa9
DA
5310 mark_buffer (&buffer_defaults);
5311 mark_buffer (&buffer_local_symbols);
5312
7146af97 5313 for (i = 0; i < staticidx; i++)
49723c04 5314 mark_object (*staticvec[i]);
34400008 5315
2f592f95 5316 mark_specpdl ();
6ed8eeff 5317 mark_terminals ();
126f9c02
SM
5318 mark_kboards ();
5319
5320#ifdef USE_GTK
a411ac43 5321 xg_mark_data ();
126f9c02
SM
5322#endif
5323
34400008
GM
5324#if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
5325 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
5326 mark_stack ();
5327#else
acf5f7d3
SM
5328 {
5329 register struct gcpro *tail;
5330 for (tail = gcprolist; tail; tail = tail->next)
5331 for (i = 0; i < tail->nvars; i++)
005ca5c7 5332 mark_object (tail->var[i]);
acf5f7d3 5333 }
3e21b6a7 5334 mark_byte_stack ();
b286858c
SM
5335 {
5336 struct catchtag *catch;
5337 struct handler *handler;
177c0ea7 5338
7146af97
JB
5339 for (catch = catchlist; catch; catch = catch->next)
5340 {
49723c04
SM
5341 mark_object (catch->tag);
5342 mark_object (catch->val);
177c0ea7 5343 }
7146af97
JB
5344 for (handler = handlerlist; handler; handler = handler->next)
5345 {
49723c04
SM
5346 mark_object (handler->handler);
5347 mark_object (handler->var);
177c0ea7 5348 }
b286858c 5349 }
b286858c 5350#endif
7146af97 5351
454d7973
KS
5352#ifdef HAVE_WINDOW_SYSTEM
5353 mark_fringe_data ();
5354#endif
5355
74c35a48
SM
5356#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
5357 mark_stack ();
5358#endif
5359
c37adf23
SM
5360 /* Everything is now marked, except for the things that require special
5361 finalization, i.e. the undo_list.
5362 Look thru every buffer's undo list
4c315bda
RS
5363 for elements that update markers that were not marked,
5364 and delete them. */
52b852c7 5365 FOR_EACH_BUFFER (nextb)
d17337e5
DA
5366 {
5367 /* If a buffer's undo list is Qt, that means that undo is
5368 turned off in that buffer. Calling truncate_undo_list on
5369 Qt tends to return NULL, which effectively turns undo back on.
5370 So don't call truncate_undo_list if undo_list is Qt. */
e34f7f79 5371 if (! EQ (nextb->INTERNAL_FIELD (undo_list), Qt))
d17337e5
DA
5372 {
5373 Lisp_Object tail, prev;
e34f7f79 5374 tail = nextb->INTERNAL_FIELD (undo_list);
d17337e5
DA
5375 prev = Qnil;
5376 while (CONSP (tail))
5377 {
5378 if (CONSP (XCAR (tail))
5379 && MARKERP (XCAR (XCAR (tail)))
5380 && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
5381 {
5382 if (NILP (prev))
e34f7f79 5383 nextb->INTERNAL_FIELD (undo_list) = tail = XCDR (tail);
d17337e5
DA
5384 else
5385 {
5386 tail = XCDR (tail);
5387 XSETCDR (prev, tail);
5388 }
5389 }
5390 else
5391 {
5392 prev = tail;
5393 tail = XCDR (tail);
5394 }
5395 }
5396 }
5397 /* Now that we have stripped the elements that need not be in the
5398 undo_list any more, we can finally mark the list. */
e34f7f79 5399 mark_object (nextb->INTERNAL_FIELD (undo_list));
d17337e5 5400 }
4c315bda 5401
7146af97
JB
5402 gc_sweep ();
5403
5404 /* Clear the mark bits that we set in certain root slots. */
5405
033a5fa3 5406 unmark_byte_stack ();
3ef06d12
SM
5407 VECTOR_UNMARK (&buffer_defaults);
5408 VECTOR_UNMARK (&buffer_local_symbols);
7146af97 5409
34400008
GM
5410#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
5411 dump_zombies ();
5412#endif
5413
7e63e0c3 5414 check_cons_list ();
bbc012e0 5415
7146af97
JB
5416 gc_in_progress = 0;
5417
5c747675
DA
5418 unblock_input ();
5419
7146af97 5420 consing_since_gc = 0;
0dd6d66d
DA
5421 if (gc_cons_threshold < GC_DEFAULT_THRESHOLD / 10)
5422 gc_cons_threshold = GC_DEFAULT_THRESHOLD / 10;
7146af97 5423
c0c5c8ae 5424 gc_relative_threshold = 0;
96f077ad
SM
5425 if (FLOATP (Vgc_cons_percentage))
5426 { /* Set gc_cons_combined_threshold. */
12b3895d 5427 double tot = total_bytes_of_live_objects ();
ae35e756 5428
c0c5c8ae 5429 tot *= XFLOAT_DATA (Vgc_cons_percentage);
7216e43b 5430 if (0 < tot)
c0c5c8ae
PE
5431 {
5432 if (tot < TYPE_MAXIMUM (EMACS_INT))
5433 gc_relative_threshold = tot;
5434 else
5435 gc_relative_threshold = TYPE_MAXIMUM (EMACS_INT);
5436 }
96f077ad
SM
5437 }
5438
299585ee
RS
5439 if (garbage_collection_messages)
5440 {
6efc7df7
GM
5441 if (message_p || minibuf_level > 0)
5442 restore_message ();
299585ee
RS
5443 else
5444 message1_nolog ("Garbage collecting...done");
5445 }
7146af97 5446
98edb5ff 5447 unbind_to (count, Qnil);
fecbd8ff
SM
5448 {
5449 Lisp_Object total[11];
5450 int total_size = 10;
2e471eb5 5451
fecbd8ff
SM
5452 total[0] = list4 (Qconses, make_number (sizeof (struct Lisp_Cons)),
5453 bounded_number (total_conses),
5454 bounded_number (total_free_conses));
3ab6e069 5455
fecbd8ff
SM
5456 total[1] = list4 (Qsymbols, make_number (sizeof (struct Lisp_Symbol)),
5457 bounded_number (total_symbols),
5458 bounded_number (total_free_symbols));
3ab6e069 5459
fecbd8ff
SM
5460 total[2] = list4 (Qmiscs, make_number (sizeof (union Lisp_Misc)),
5461 bounded_number (total_markers),
5462 bounded_number (total_free_markers));
3ab6e069 5463
fecbd8ff
SM
5464 total[3] = list4 (Qstrings, make_number (sizeof (struct Lisp_String)),
5465 bounded_number (total_strings),
5466 bounded_number (total_free_strings));
3ab6e069 5467
fecbd8ff
SM
5468 total[4] = list3 (Qstring_bytes, make_number (1),
5469 bounded_number (total_string_bytes));
3ab6e069 5470
fbe9e0b9
PE
5471 total[5] = list3 (Qvectors,
5472 make_number (header_size + sizeof (Lisp_Object)),
fecbd8ff 5473 bounded_number (total_vectors));
5b835e1d 5474
fecbd8ff
SM
5475 total[6] = list4 (Qvector_slots, make_number (word_size),
5476 bounded_number (total_vector_slots),
5477 bounded_number (total_free_vector_slots));
5b835e1d 5478
fecbd8ff
SM
5479 total[7] = list4 (Qfloats, make_number (sizeof (struct Lisp_Float)),
5480 bounded_number (total_floats),
5481 bounded_number (total_free_floats));
3ab6e069 5482
fecbd8ff
SM
5483 total[8] = list4 (Qintervals, make_number (sizeof (struct interval)),
5484 bounded_number (total_intervals),
5485 bounded_number (total_free_intervals));
3ab6e069 5486
fecbd8ff
SM
5487 total[9] = list3 (Qbuffers, make_number (sizeof (struct buffer)),
5488 bounded_number (total_buffers));
2e471eb5 5489
f8643a6b 5490#ifdef DOUG_LEA_MALLOC
fecbd8ff
SM
5491 total_size++;
5492 total[10] = list4 (Qheap, make_number (1024),
5493 bounded_number ((mallinfo ().uordblks + 1023) >> 10),
5494 bounded_number ((mallinfo ().fordblks + 1023) >> 10));
f8643a6b 5495#endif
fecbd8ff
SM
5496 retval = Flist (total_size, total);
5497 }
f8643a6b 5498
34400008 5499#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
7146af97 5500 {
34400008 5501 /* Compute average percentage of zombies. */
fecbd8ff
SM
5502 double nlive
5503 = (total_conses + total_symbols + total_markers + total_strings
5504 + total_vectors + total_floats + total_intervals + total_buffers);
34400008
GM
5505
5506 avg_live = (avg_live * ngcs + nlive) / (ngcs + 1);
5507 max_live = max (nlive, max_live);
5508 avg_zombies = (avg_zombies * ngcs + nzombies) / (ngcs + 1);
5509 max_zombies = max (nzombies, max_zombies);
5510 ++ngcs;
dbcf001c 5511 }
34400008 5512#endif
7146af97 5513
9e713715
GM
5514 if (!NILP (Vpost_gc_hook))
5515 {
d311d28c 5516 ptrdiff_t gc_count = inhibit_garbage_collection ();
9e713715 5517 safe_run_hooks (Qpost_gc_hook);
ae35e756 5518 unbind_to (gc_count, Qnil);
9e713715 5519 }
2c5bd608
DL
5520
5521 /* Accumulate statistics. */
2c5bd608 5522 if (FLOATP (Vgc_elapsed))
387d4d92 5523 {
43aac990 5524 struct timespec since_start = timespec_sub (current_timespec (), start);
387d4d92 5525 Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed)
43aac990 5526 + timespectod (since_start));
387d4d92 5527 }
d35af63c 5528
2c5bd608
DL
5529 gcs_done++;
5530
12b3895d 5531 /* Collect profiling data. */
6521894d 5532 if (profiler_memory_running)
12b3895d
TM
5533 {
5534 size_t swept = 0;
6521894d
SM
5535 size_t tot_after = total_bytes_of_live_objects ();
5536 if (tot_before > tot_after)
5537 swept = tot_before - tot_after;
3d80c99f 5538 malloc_probe (swept);
12b3895d
TM
5539 }
5540
fecbd8ff 5541 return retval;
7146af97 5542}
34400008 5543
41c28a37 5544
3770920e
GM
5545/* Mark Lisp objects in glyph matrix MATRIX. Currently the
5546 only interesting objects referenced from glyphs are strings. */
41c28a37
GM
5547
5548static void
971de7fb 5549mark_glyph_matrix (struct glyph_matrix *matrix)
41c28a37
GM
5550{
5551 struct glyph_row *row = matrix->rows;
5552 struct glyph_row *end = row + matrix->nrows;
5553
2e471eb5
GM
5554 for (; row < end; ++row)
5555 if (row->enabled_p)
5556 {
5557 int area;
5558 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
5559 {
5560 struct glyph *glyph = row->glyphs[area];
5561 struct glyph *end_glyph = glyph + row->used[area];
177c0ea7 5562
2e471eb5 5563 for (; glyph < end_glyph; ++glyph)
8e50cc2d 5564 if (STRINGP (glyph->object)
2e471eb5 5565 && !STRING_MARKED_P (XSTRING (glyph->object)))
49723c04 5566 mark_object (glyph->object);
2e471eb5
GM
5567 }
5568 }
41c28a37
GM
5569}
5570
34400008 5571
41c28a37
GM
5572/* Mark Lisp faces in the face cache C. */
5573
5574static void
971de7fb 5575mark_face_cache (struct face_cache *c)
41c28a37
GM
5576{
5577 if (c)
5578 {
5579 int i, j;
5580 for (i = 0; i < c->used; ++i)
5581 {
5582 struct face *face = FACE_FROM_ID (c->f, i);
5583
5584 if (face)
5585 {
5586 for (j = 0; j < LFACE_VECTOR_SIZE; ++j)
49723c04 5587 mark_object (face->lface[j]);
41c28a37
GM
5588 }
5589 }
5590 }
5591}
5592
5593
7146af97 5594\f
1a4f1e2c 5595/* Mark reference to a Lisp_Object.
2e471eb5
GM
5596 If the object referred to has not been seen yet, recursively mark
5597 all the references contained in it. */
7146af97 5598
785cd37f 5599#define LAST_MARKED_SIZE 500
d3d47262 5600static Lisp_Object last_marked[LAST_MARKED_SIZE];
244ed907 5601static int last_marked_index;
785cd37f 5602
1342fc6f
RS
5603/* For debugging--call abort when we cdr down this many
5604 links of a list, in mark_object. In debugging,
5605 the call to abort will hit a breakpoint.
5606 Normally this is zero and the check never goes off. */
903fe15d 5607ptrdiff_t mark_object_loop_halt EXTERNALLY_VISIBLE;
1342fc6f 5608
8f11f7ec 5609static void
971de7fb 5610mark_vectorlike (struct Lisp_Vector *ptr)
d2029e5b 5611{
d311d28c
PE
5612 ptrdiff_t size = ptr->header.size;
5613 ptrdiff_t i;
d2029e5b 5614
8f11f7ec 5615 eassert (!VECTOR_MARKED_P (ptr));
7555c33f 5616 VECTOR_MARK (ptr); /* Else mark it. */
d2029e5b
SM
5617 if (size & PSEUDOVECTOR_FLAG)
5618 size &= PSEUDOVECTOR_SIZE_MASK;
d3d47262 5619
d2029e5b
SM
5620 /* Note that this size is not the memory-footprint size, but only
5621 the number of Lisp_Object fields that we should trace.
5622 The distinction is used e.g. by Lisp_Process which places extra
7555c33f
SM
5623 non-Lisp_Object fields at the end of the structure... */
5624 for (i = 0; i < size; i++) /* ...and then mark its elements. */
d2029e5b 5625 mark_object (ptr->contents[i]);
d2029e5b
SM
5626}
5627
58026347
KH
5628/* Like mark_vectorlike but optimized for char-tables (and
5629 sub-char-tables) assuming that the contents are mostly integers or
5630 symbols. */
5631
5632static void
971de7fb 5633mark_char_table (struct Lisp_Vector *ptr)
58026347 5634{
b6439961
PE
5635 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
5636 int i;
58026347 5637
8f11f7ec 5638 eassert (!VECTOR_MARKED_P (ptr));
58026347
KH
5639 VECTOR_MARK (ptr);
5640 for (i = 0; i < size; i++)
5641 {
5642 Lisp_Object val = ptr->contents[i];
5643
ef1b0ba7 5644 if (INTEGERP (val) || (SYMBOLP (val) && XSYMBOL (val)->gcmarkbit))
58026347
KH
5645 continue;
5646 if (SUB_CHAR_TABLE_P (val))
5647 {
5648 if (! VECTOR_MARKED_P (XVECTOR (val)))
5649 mark_char_table (XVECTOR (val));
5650 }
5651 else
5652 mark_object (val);
5653 }
5654}
5655
36429c89
DA
5656/* Mark the chain of overlays starting at PTR. */
5657
5658static void
5659mark_overlay (struct Lisp_Overlay *ptr)
5660{
5661 for (; ptr && !ptr->gcmarkbit; ptr = ptr->next)
5662 {
5663 ptr->gcmarkbit = 1;
c644523b
DA
5664 mark_object (ptr->start);
5665 mark_object (ptr->end);
5666 mark_object (ptr->plist);
36429c89
DA
5667 }
5668}
5669
5670/* Mark Lisp_Objects and special pointers in BUFFER. */
cf5c0175
DA
5671
5672static void
5673mark_buffer (struct buffer *buffer)
5674{
b4fa72f2
DA
5675 /* This is handled much like other pseudovectors... */
5676 mark_vectorlike ((struct Lisp_Vector *) buffer);
cf5c0175 5677
b4fa72f2 5678 /* ...but there are some buffer-specific things. */
cf5c0175 5679
b4fa72f2 5680 MARK_INTERVAL_TREE (buffer_intervals (buffer));
cf5c0175 5681
b4fa72f2
DA
5682 /* For now, we just don't mark the undo_list. It's done later in
5683 a special way just before the sweep phase, and after stripping
5684 some of its elements that are not needed any more. */
cf5c0175 5685
b4fa72f2
DA
5686 mark_overlay (buffer->overlays_before);
5687 mark_overlay (buffer->overlays_after);
cf5c0175 5688
b4fa72f2
DA
5689 /* If this is an indirect buffer, mark its base buffer. */
5690 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
5691 mark_buffer (buffer->base_buffer);
cf5c0175
DA
5692}
5693
d59a1afb 5694/* Remove killed buffers or items whose car is a killed buffer from
e99f70c8 5695 LIST, and mark other items. Return changed LIST, which is marked. */
d73e321c 5696
5779a1dc 5697static Lisp_Object
d59a1afb 5698mark_discard_killed_buffers (Lisp_Object list)
d73e321c 5699{
d59a1afb 5700 Lisp_Object tail, *prev = &list;
d73e321c 5701
d59a1afb
DA
5702 for (tail = list; CONSP (tail) && !CONS_MARKED_P (XCONS (tail));
5703 tail = XCDR (tail))
d73e321c 5704 {
5779a1dc 5705 Lisp_Object tem = XCAR (tail);
d73e321c
DA
5706 if (CONSP (tem))
5707 tem = XCAR (tem);
5708 if (BUFFERP (tem) && !BUFFER_LIVE_P (XBUFFER (tem)))
5779a1dc 5709 *prev = XCDR (tail);
d73e321c 5710 else
d59a1afb
DA
5711 {
5712 CONS_MARK (XCONS (tail));
5713 mark_object (XCAR (tail));
84575e67 5714 prev = xcdr_addr (tail);
d59a1afb 5715 }
d73e321c 5716 }
e99f70c8 5717 mark_object (tail);
d73e321c
DA
5718 return list;
5719}
5720
cf5c0175
DA
5721/* Determine type of generic Lisp_Object and mark it accordingly. */
5722
41c28a37 5723void
971de7fb 5724mark_object (Lisp_Object arg)
7146af97 5725{
49723c04 5726 register Lisp_Object obj = arg;
4f5c1376
GM
5727#ifdef GC_CHECK_MARKED_OBJECTS
5728 void *po;
5729 struct mem_node *m;
5730#endif
903fe15d 5731 ptrdiff_t cdr_count = 0;
7146af97 5732
9149e743 5733 loop:
7146af97 5734
1f0b3fd2 5735 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
5736 return;
5737
49723c04 5738 last_marked[last_marked_index++] = obj;
785cd37f
RS
5739 if (last_marked_index == LAST_MARKED_SIZE)
5740 last_marked_index = 0;
5741
4f5c1376
GM
5742 /* Perform some sanity checks on the objects marked here. Abort if
5743 we encounter an object we know is bogus. This increases GC time
5744 by ~80%, and requires compilation with GC_MARK_STACK != 0. */
5745#ifdef GC_CHECK_MARKED_OBJECTS
5746
5747 po = (void *) XPNTR (obj);
5748
5749 /* Check that the object pointed to by PO is known to be a Lisp
5750 structure allocated from the heap. */
5751#define CHECK_ALLOCATED() \
5752 do { \
5753 m = mem_find (po); \
5754 if (m == MEM_NIL) \
1088b922 5755 emacs_abort (); \
4f5c1376
GM
5756 } while (0)
5757
5758 /* Check that the object pointed to by PO is live, using predicate
5759 function LIVEP. */
5760#define CHECK_LIVE(LIVEP) \
5761 do { \
5762 if (!LIVEP (m, po)) \
1088b922 5763 emacs_abort (); \
4f5c1376
GM
5764 } while (0)
5765
5766 /* Check both of the above conditions. */
5767#define CHECK_ALLOCATED_AND_LIVE(LIVEP) \
5768 do { \
5769 CHECK_ALLOCATED (); \
5770 CHECK_LIVE (LIVEP); \
5771 } while (0) \
177c0ea7 5772
4f5c1376 5773#else /* not GC_CHECK_MARKED_OBJECTS */
177c0ea7 5774
4f5c1376
GM
5775#define CHECK_LIVE(LIVEP) (void) 0
5776#define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
177c0ea7 5777
4f5c1376
GM
5778#endif /* not GC_CHECK_MARKED_OBJECTS */
5779
7393bcbb 5780 switch (XTYPE (obj))
7146af97
JB
5781 {
5782 case Lisp_String:
5783 {
5784 register struct Lisp_String *ptr = XSTRING (obj);
8f11f7ec
SM
5785 if (STRING_MARKED_P (ptr))
5786 break;
4f5c1376 5787 CHECK_ALLOCATED_AND_LIVE (live_string_p);
2e471eb5 5788 MARK_STRING (ptr);
7555c33f 5789 MARK_INTERVAL_TREE (ptr->intervals);
361b097f 5790#ifdef GC_CHECK_STRING_BYTES
676a7251 5791 /* Check that the string size recorded in the string is the
7555c33f 5792 same as the one recorded in the sdata structure. */
e499d0ee 5793 string_bytes (ptr);
361b097f 5794#endif /* GC_CHECK_STRING_BYTES */
7146af97
JB
5795 }
5796 break;
5797
76437631 5798 case Lisp_Vectorlike:
cf5c0175
DA
5799 {
5800 register struct Lisp_Vector *ptr = XVECTOR (obj);
5801 register ptrdiff_t pvectype;
5802
5803 if (VECTOR_MARKED_P (ptr))
5804 break;
5805
4f5c1376 5806#ifdef GC_CHECK_MARKED_OBJECTS
cf5c0175 5807 m = mem_find (po);
c752cfa9 5808 if (m == MEM_NIL && !SUBRP (obj))
1088b922 5809 emacs_abort ();
4f5c1376 5810#endif /* GC_CHECK_MARKED_OBJECTS */
177c0ea7 5811
cf5c0175 5812 if (ptr->header.size & PSEUDOVECTOR_FLAG)
ee28be33 5813 pvectype = ((ptr->header.size & PVEC_TYPE_MASK)
914adc42 5814 >> PSEUDOVECTOR_AREA_BITS);
cf5c0175 5815 else
6aea7528 5816 pvectype = PVEC_NORMAL_VECTOR;
cf5c0175 5817
cf5c0175
DA
5818 if (pvectype != PVEC_SUBR && pvectype != PVEC_BUFFER)
5819 CHECK_LIVE (live_vector_p);
169ee243 5820
ee28be33 5821 switch (pvectype)
cf5c0175 5822 {
ee28be33 5823 case PVEC_BUFFER:
cf5c0175 5824#ifdef GC_CHECK_MARKED_OBJECTS
c752cfa9
DA
5825 {
5826 struct buffer *b;
5827 FOR_EACH_BUFFER (b)
5828 if (b == po)
5829 break;
5830 if (b == NULL)
5831 emacs_abort ();
5832 }
cf5c0175
DA
5833#endif /* GC_CHECK_MARKED_OBJECTS */
5834 mark_buffer ((struct buffer *) ptr);
ee28be33
SM
5835 break;
5836
5837 case PVEC_COMPILED:
5838 { /* We could treat this just like a vector, but it is better
5839 to save the COMPILED_CONSTANTS element for last and avoid
5840 recursion there. */
5841 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
5842 int i;
5843
5844 VECTOR_MARK (ptr);
5845 for (i = 0; i < size; i++)
5846 if (i != COMPILED_CONSTANTS)
5847 mark_object (ptr->contents[i]);
5848 if (size > COMPILED_CONSTANTS)
5849 {
5850 obj = ptr->contents[COMPILED_CONSTANTS];
5851 goto loop;
5852 }
5853 }
5854 break;
cf5c0175 5855
ee28be33 5856 case PVEC_FRAME:
d59a1afb
DA
5857 mark_vectorlike (ptr);
5858 mark_face_cache (((struct frame *) ptr)->face_cache);
ee28be33 5859 break;
cf5c0175 5860
ee28be33
SM
5861 case PVEC_WINDOW:
5862 {
5863 struct window *w = (struct window *) ptr;
5779a1dc 5864
0699fc18 5865 mark_vectorlike (ptr);
e99f70c8 5866
e74aeda8 5867 /* Mark glyph matrices, if any. Marking window
0699fc18
DA
5868 matrices is sufficient because frame matrices
5869 use the same glyph memory. */
e74aeda8 5870 if (w->current_matrix)
ee28be33 5871 {
0699fc18
DA
5872 mark_glyph_matrix (w->current_matrix);
5873 mark_glyph_matrix (w->desired_matrix);
ee28be33 5874 }
e99f70c8
SM
5875
5876 /* Filter out killed buffers from both buffer lists
5877 in attempt to help GC to reclaim killed buffers faster.
5878 We can do it elsewhere for live windows, but this is the
5879 best place to do it for dead windows. */
5880 wset_prev_buffers
5881 (w, mark_discard_killed_buffers (w->prev_buffers));
5882 wset_next_buffers
5883 (w, mark_discard_killed_buffers (w->next_buffers));
ee28be33
SM
5884 }
5885 break;
cf5c0175 5886
ee28be33
SM
5887 case PVEC_HASH_TABLE:
5888 {
5889 struct Lisp_Hash_Table *h = (struct Lisp_Hash_Table *) ptr;
cf5c0175 5890
ee28be33 5891 mark_vectorlike (ptr);
b7432bb2
SM
5892 mark_object (h->test.name);
5893 mark_object (h->test.user_hash_function);
5894 mark_object (h->test.user_cmp_function);
ee28be33
SM
5895 /* If hash table is not weak, mark all keys and values.
5896 For weak tables, mark only the vector. */
5897 if (NILP (h->weak))
5898 mark_object (h->key_and_value);
5899 else
5900 VECTOR_MARK (XVECTOR (h->key_and_value));
5901 }
5902 break;
cf5c0175 5903
ee28be33
SM
5904 case PVEC_CHAR_TABLE:
5905 mark_char_table (ptr);
5906 break;
cf5c0175 5907
ee28be33
SM
5908 case PVEC_BOOL_VECTOR:
5909 /* No Lisp_Objects to mark in a bool vector. */
5910 VECTOR_MARK (ptr);
5911 break;
cf5c0175 5912
ee28be33
SM
5913 case PVEC_SUBR:
5914 break;
cf5c0175 5915
ee28be33 5916 case PVEC_FREE:
1088b922 5917 emacs_abort ();
cf5c0175 5918
ee28be33
SM
5919 default:
5920 mark_vectorlike (ptr);
5921 }
cf5c0175 5922 }
169ee243 5923 break;
7146af97 5924
7146af97
JB
5925 case Lisp_Symbol:
5926 {
c70bbf06 5927 register struct Lisp_Symbol *ptr = XSYMBOL (obj);
7146af97
JB
5928 struct Lisp_Symbol *ptrx;
5929
8f11f7ec
SM
5930 if (ptr->gcmarkbit)
5931 break;
4f5c1376 5932 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
2336fe58 5933 ptr->gcmarkbit = 1;
c644523b
DA
5934 mark_object (ptr->function);
5935 mark_object (ptr->plist);
ce5b453a
SM
5936 switch (ptr->redirect)
5937 {
5938 case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
5939 case SYMBOL_VARALIAS:
5940 {
5941 Lisp_Object tem;
5942 XSETSYMBOL (tem, SYMBOL_ALIAS (ptr));
5943 mark_object (tem);
5944 break;
5945 }
5946 case SYMBOL_LOCALIZED:
5947 {
5948 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
d73e321c
DA
5949 Lisp_Object where = blv->where;
5950 /* If the value is set up for a killed buffer or deleted
5951 frame, restore it's global binding. If the value is
5952 forwarded to a C variable, either it's not a Lisp_Object
5953 var, or it's staticpro'd already. */
5954 if ((BUFFERP (where) && !BUFFER_LIVE_P (XBUFFER (where)))
5955 || (FRAMEP (where) && !FRAME_LIVE_P (XFRAME (where))))
5956 swap_in_global_binding (ptr);
ce5b453a
SM
5957 mark_object (blv->where);
5958 mark_object (blv->valcell);
5959 mark_object (blv->defcell);
5960 break;
5961 }
5962 case SYMBOL_FORWARDED:
5963 /* If the value is forwarded to a buffer or keyboard field,
5964 these are marked when we see the corresponding object.
5965 And if it's forwarded to a C variable, either it's not
5966 a Lisp_Object var, or it's staticpro'd already. */
5967 break;
1088b922 5968 default: emacs_abort ();
ce5b453a 5969 }
c644523b
DA
5970 if (!PURE_POINTER_P (XSTRING (ptr->name)))
5971 MARK_STRING (XSTRING (ptr->name));
0c94c8d6 5972 MARK_INTERVAL_TREE (string_intervals (ptr->name));
177c0ea7 5973
7146af97
JB
5974 ptr = ptr->next;
5975 if (ptr)
5976 {
7555c33f 5977 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun. */
7146af97 5978 XSETSYMBOL (obj, ptrx);
49723c04 5979 goto loop;
7146af97
JB
5980 }
5981 }
5982 break;
5983
a0a38eb7 5984 case Lisp_Misc:
4f5c1376 5985 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
b766f870 5986
7555c33f
SM
5987 if (XMISCANY (obj)->gcmarkbit)
5988 break;
5989
5990 switch (XMISCTYPE (obj))
a0a38eb7 5991 {
7555c33f
SM
5992 case Lisp_Misc_Marker:
5993 /* DO NOT mark thru the marker's chain.
5994 The buffer's markers chain does not preserve markers from gc;
5995 instead, markers are removed from the chain when freed by gc. */
36429c89 5996 XMISCANY (obj)->gcmarkbit = 1;
7555c33f 5997 break;
465edf35 5998
7555c33f
SM
5999 case Lisp_Misc_Save_Value:
6000 XMISCANY (obj)->gcmarkbit = 1;
7555c33f 6001 {
7b1123d8
PE
6002 struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj);
6003 /* If `save_type' is zero, `data[0].pointer' is the address
73ebd38f
DA
6004 of a memory area containing `data[1].integer' potential
6005 Lisp_Objects. */
7b1123d8 6006 if (GC_MARK_STACK && ptr->save_type == SAVE_TYPE_MEMORY)
7555c33f 6007 {
c50cf2ea 6008 Lisp_Object *p = ptr->data[0].pointer;
7555c33f 6009 ptrdiff_t nelt;
73ebd38f 6010 for (nelt = ptr->data[1].integer; nelt > 0; nelt--, p++)
7555c33f
SM
6011 mark_maybe_object (*p);
6012 }
73ebd38f 6013 else
73ebd38f
DA
6014 {
6015 /* Find Lisp_Objects in `data[N]' slots and mark them. */
7b1123d8
PE
6016 int i;
6017 for (i = 0; i < SAVE_VALUE_SLOTS; i++)
6018 if (save_type (ptr, i) == SAVE_OBJECT)
6019 mark_object (ptr->data[i].object);
73ebd38f 6020 }
7555c33f 6021 }
7555c33f
SM
6022 break;
6023
6024 case Lisp_Misc_Overlay:
6025 mark_overlay (XOVERLAY (obj));
6026 break;
6027
6028 default:
1088b922 6029 emacs_abort ();
a0a38eb7 6030 }
7146af97
JB
6031 break;
6032
6033 case Lisp_Cons:
7146af97
JB
6034 {
6035 register struct Lisp_Cons *ptr = XCONS (obj);
8f11f7ec
SM
6036 if (CONS_MARKED_P (ptr))
6037 break;
4f5c1376 6038 CHECK_ALLOCATED_AND_LIVE (live_cons_p);
08b7c2cb 6039 CONS_MARK (ptr);
c54ca951 6040 /* If the cdr is nil, avoid recursion for the car. */
c644523b 6041 if (EQ (ptr->u.cdr, Qnil))
c54ca951 6042 {
c644523b 6043 obj = ptr->car;
1342fc6f 6044 cdr_count = 0;
c54ca951
RS
6045 goto loop;
6046 }
c644523b
DA
6047 mark_object (ptr->car);
6048 obj = ptr->u.cdr;
1342fc6f
RS
6049 cdr_count++;
6050 if (cdr_count == mark_object_loop_halt)
1088b922 6051 emacs_abort ();
7146af97
JB
6052 goto loop;
6053 }
6054
7146af97 6055 case Lisp_Float:
4f5c1376 6056 CHECK_ALLOCATED_AND_LIVE (live_float_p);
ab6780cd 6057 FLOAT_MARK (XFLOAT (obj));
7146af97 6058 break;
7146af97 6059
2de9f71c 6060 case_Lisp_Int:
7146af97
JB
6061 break;
6062
6063 default:
1088b922 6064 emacs_abort ();
7146af97 6065 }
4f5c1376
GM
6066
6067#undef CHECK_LIVE
6068#undef CHECK_ALLOCATED
6069#undef CHECK_ALLOCATED_AND_LIVE
7146af97 6070}
4a729fd8 6071/* Mark the Lisp pointers in the terminal objects.
0ba2624f 6072 Called by Fgarbage_collect. */
4a729fd8 6073
4a729fd8
SM
6074static void
6075mark_terminals (void)
6076{
6077 struct terminal *t;
6078 for (t = terminal_list; t; t = t->next_terminal)
6079 {
6080 eassert (t->name != NULL);
354884c4 6081#ifdef HAVE_WINDOW_SYSTEM
96ad0af7
YM
6082 /* If a terminal object is reachable from a stacpro'ed object,
6083 it might have been marked already. Make sure the image cache
6084 gets marked. */
6085 mark_image_cache (t->image_cache);
354884c4 6086#endif /* HAVE_WINDOW_SYSTEM */
96ad0af7
YM
6087 if (!VECTOR_MARKED_P (t))
6088 mark_vectorlike ((struct Lisp_Vector *)t);
4a729fd8
SM
6089 }
6090}
6091
6092
084b1a0c 6093
41c28a37
GM
6094/* Value is non-zero if OBJ will survive the current GC because it's
6095 either marked or does not need to be marked to survive. */
6096
fce31d69 6097bool
971de7fb 6098survives_gc_p (Lisp_Object obj)
41c28a37 6099{
fce31d69 6100 bool survives_p;
177c0ea7 6101
8e50cc2d 6102 switch (XTYPE (obj))
41c28a37 6103 {
2de9f71c 6104 case_Lisp_Int:
41c28a37
GM
6105 survives_p = 1;
6106 break;
6107
6108 case Lisp_Symbol:
2336fe58 6109 survives_p = XSYMBOL (obj)->gcmarkbit;
41c28a37
GM
6110 break;
6111
6112 case Lisp_Misc:
67ee9f6e 6113 survives_p = XMISCANY (obj)->gcmarkbit;
41c28a37
GM
6114 break;
6115
6116 case Lisp_String:
08b7c2cb 6117 survives_p = STRING_MARKED_P (XSTRING (obj));
41c28a37
GM
6118 break;
6119
6120 case Lisp_Vectorlike:
8e50cc2d 6121 survives_p = SUBRP (obj) || VECTOR_MARKED_P (XVECTOR (obj));
41c28a37
GM
6122 break;
6123
6124 case Lisp_Cons:
08b7c2cb 6125 survives_p = CONS_MARKED_P (XCONS (obj));
41c28a37
GM
6126 break;
6127
41c28a37 6128 case Lisp_Float:
ab6780cd 6129 survives_p = FLOAT_MARKED_P (XFLOAT (obj));
41c28a37 6130 break;
41c28a37
GM
6131
6132 default:
1088b922 6133 emacs_abort ();
41c28a37
GM
6134 }
6135
34400008 6136 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj));
41c28a37
GM
6137}
6138
6139
7146af97 6140\f
1a4f1e2c 6141/* Sweep: find all structures not marked, and free them. */
7146af97
JB
6142
6143static void
971de7fb 6144gc_sweep (void)
7146af97 6145{
41c28a37
GM
6146 /* Remove or mark entries in weak hash tables.
6147 This must be done before any object is unmarked. */
6148 sweep_weak_hash_tables ();
6149
2e471eb5 6150 sweep_strings ();
e499d0ee 6151 check_string_bytes (!noninteractive);
7146af97
JB
6152
6153 /* Put all unmarked conses on free list */
6154 {
6155 register struct cons_block *cblk;
6ca94ac9 6156 struct cons_block **cprev = &cons_block;
7146af97 6157 register int lim = cons_block_index;
c0c5c8ae 6158 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
6159
6160 cons_free_list = 0;
177c0ea7 6161
6ca94ac9 6162 for (cblk = cons_block; cblk; cblk = *cprev)
7146af97 6163 {
3ae2e3a3 6164 register int i = 0;
6ca94ac9 6165 int this_free = 0;
3ae2e3a3
RS
6166 int ilim = (lim + BITS_PER_INT - 1) / BITS_PER_INT;
6167
6168 /* Scan the mark bits an int at a time. */
47ea7f44 6169 for (i = 0; i < ilim; i++)
3ae2e3a3
RS
6170 {
6171 if (cblk->gcmarkbits[i] == -1)
6172 {
6173 /* Fast path - all cons cells for this int are marked. */
6174 cblk->gcmarkbits[i] = 0;
6175 num_used += BITS_PER_INT;
6176 }
6177 else
6178 {
6179 /* Some cons cells for this int are not marked.
6180 Find which ones, and free them. */
6181 int start, pos, stop;
6182
6183 start = i * BITS_PER_INT;
6184 stop = lim - start;
6185 if (stop > BITS_PER_INT)
6186 stop = BITS_PER_INT;
6187 stop += start;
6188
6189 for (pos = start; pos < stop; pos++)
6190 {
6191 if (!CONS_MARKED_P (&cblk->conses[pos]))
6192 {
6193 this_free++;
6194 cblk->conses[pos].u.chain = cons_free_list;
6195 cons_free_list = &cblk->conses[pos];
34400008 6196#if GC_MARK_STACK
c644523b 6197 cons_free_list->car = Vdead;
34400008 6198#endif
3ae2e3a3
RS
6199 }
6200 else
6201 {
6202 num_used++;
6203 CONS_UNMARK (&cblk->conses[pos]);
6204 }
6205 }
6206 }
6207 }
6208
7146af97 6209 lim = CONS_BLOCK_SIZE;
6ca94ac9
KH
6210 /* If this block contains only free conses and we have already
6211 seen more than two blocks worth of free conses then deallocate
6212 this block. */
6feef451 6213 if (this_free == CONS_BLOCK_SIZE && num_free > CONS_BLOCK_SIZE)
6ca94ac9 6214 {
6ca94ac9
KH
6215 *cprev = cblk->next;
6216 /* Unhook from the free list. */
28a099a4 6217 cons_free_list = cblk->conses[0].u.chain;
08b7c2cb 6218 lisp_align_free (cblk);
6ca94ac9
KH
6219 }
6220 else
6feef451
AS
6221 {
6222 num_free += this_free;
6223 cprev = &cblk->next;
6224 }
7146af97
JB
6225 }
6226 total_conses = num_used;
6227 total_free_conses = num_free;
6228 }
6229
7146af97
JB
6230 /* Put all unmarked floats on free list */
6231 {
6232 register struct float_block *fblk;
6ca94ac9 6233 struct float_block **fprev = &float_block;
7146af97 6234 register int lim = float_block_index;
c0c5c8ae 6235 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
6236
6237 float_free_list = 0;
177c0ea7 6238
6ca94ac9 6239 for (fblk = float_block; fblk; fblk = *fprev)
7146af97
JB
6240 {
6241 register int i;
6ca94ac9 6242 int this_free = 0;
7146af97 6243 for (i = 0; i < lim; i++)
ab6780cd 6244 if (!FLOAT_MARKED_P (&fblk->floats[i]))
7146af97 6245 {
6ca94ac9 6246 this_free++;
28a099a4 6247 fblk->floats[i].u.chain = float_free_list;
7146af97
JB
6248 float_free_list = &fblk->floats[i];
6249 }
6250 else
6251 {
6252 num_used++;
ab6780cd 6253 FLOAT_UNMARK (&fblk->floats[i]);
7146af97
JB
6254 }
6255 lim = FLOAT_BLOCK_SIZE;
6ca94ac9
KH
6256 /* If this block contains only free floats and we have already
6257 seen more than two blocks worth of free floats then deallocate
6258 this block. */
6feef451 6259 if (this_free == FLOAT_BLOCK_SIZE && num_free > FLOAT_BLOCK_SIZE)
6ca94ac9 6260 {
6ca94ac9
KH
6261 *fprev = fblk->next;
6262 /* Unhook from the free list. */
28a099a4 6263 float_free_list = fblk->floats[0].u.chain;
ab6780cd 6264 lisp_align_free (fblk);
6ca94ac9
KH
6265 }
6266 else
6feef451
AS
6267 {
6268 num_free += this_free;
6269 fprev = &fblk->next;
6270 }
7146af97
JB
6271 }
6272 total_floats = num_used;
6273 total_free_floats = num_free;
6274 }
7146af97 6275
d5e35230
JA
6276 /* Put all unmarked intervals on free list */
6277 {
6278 register struct interval_block *iblk;
6ca94ac9 6279 struct interval_block **iprev = &interval_block;
d5e35230 6280 register int lim = interval_block_index;
c0c5c8ae 6281 EMACS_INT num_free = 0, num_used = 0;
d5e35230
JA
6282
6283 interval_free_list = 0;
6284
6ca94ac9 6285 for (iblk = interval_block; iblk; iblk = *iprev)
d5e35230
JA
6286 {
6287 register int i;
6ca94ac9 6288 int this_free = 0;
d5e35230
JA
6289
6290 for (i = 0; i < lim; i++)
6291 {
2336fe58 6292 if (!iblk->intervals[i].gcmarkbit)
d5e35230 6293 {
0c94c8d6 6294 set_interval_parent (&iblk->intervals[i], interval_free_list);
d5e35230 6295 interval_free_list = &iblk->intervals[i];
6ca94ac9 6296 this_free++;
d5e35230
JA
6297 }
6298 else
6299 {
6300 num_used++;
2336fe58 6301 iblk->intervals[i].gcmarkbit = 0;
d5e35230
JA
6302 }
6303 }
6304 lim = INTERVAL_BLOCK_SIZE;
6ca94ac9
KH
6305 /* If this block contains only free intervals and we have already
6306 seen more than two blocks worth of free intervals then
6307 deallocate this block. */
6feef451 6308 if (this_free == INTERVAL_BLOCK_SIZE && num_free > INTERVAL_BLOCK_SIZE)
6ca94ac9 6309 {
6ca94ac9
KH
6310 *iprev = iblk->next;
6311 /* Unhook from the free list. */
439d5cb4 6312 interval_free_list = INTERVAL_PARENT (&iblk->intervals[0]);
c8099634 6313 lisp_free (iblk);
6ca94ac9
KH
6314 }
6315 else
6feef451
AS
6316 {
6317 num_free += this_free;
6318 iprev = &iblk->next;
6319 }
d5e35230
JA
6320 }
6321 total_intervals = num_used;
6322 total_free_intervals = num_free;
6323 }
d5e35230 6324
7146af97
JB
6325 /* Put all unmarked symbols on free list */
6326 {
6327 register struct symbol_block *sblk;
6ca94ac9 6328 struct symbol_block **sprev = &symbol_block;
7146af97 6329 register int lim = symbol_block_index;
c0c5c8ae 6330 EMACS_INT num_free = 0, num_used = 0;
7146af97 6331
d285b373 6332 symbol_free_list = NULL;
177c0ea7 6333
6ca94ac9 6334 for (sblk = symbol_block; sblk; sblk = *sprev)
7146af97 6335 {
6ca94ac9 6336 int this_free = 0;
d55c12ed
AS
6337 union aligned_Lisp_Symbol *sym = sblk->symbols;
6338 union aligned_Lisp_Symbol *end = sym + lim;
d285b373
GM
6339
6340 for (; sym < end; ++sym)
6341 {
20035321
SM
6342 /* Check if the symbol was created during loadup. In such a case
6343 it might be pointed to by pure bytecode which we don't trace,
6344 so we conservatively assume that it is live. */
fce31d69 6345 bool pure_p = PURE_POINTER_P (XSTRING (sym->s.name));
177c0ea7 6346
d55c12ed 6347 if (!sym->s.gcmarkbit && !pure_p)
d285b373 6348 {
d55c12ed
AS
6349 if (sym->s.redirect == SYMBOL_LOCALIZED)
6350 xfree (SYMBOL_BLV (&sym->s));
6351 sym->s.next = symbol_free_list;
6352 symbol_free_list = &sym->s;
34400008 6353#if GC_MARK_STACK
c644523b 6354 symbol_free_list->function = Vdead;
34400008 6355#endif
d285b373
GM
6356 ++this_free;
6357 }
6358 else
6359 {
6360 ++num_used;
6361 if (!pure_p)
c644523b 6362 UNMARK_STRING (XSTRING (sym->s.name));
d55c12ed 6363 sym->s.gcmarkbit = 0;
d285b373
GM
6364 }
6365 }
177c0ea7 6366
7146af97 6367 lim = SYMBOL_BLOCK_SIZE;
6ca94ac9
KH
6368 /* If this block contains only free symbols and we have already
6369 seen more than two blocks worth of free symbols then deallocate
6370 this block. */
6feef451 6371 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)
6ca94ac9 6372 {
6ca94ac9
KH
6373 *sprev = sblk->next;
6374 /* Unhook from the free list. */
d55c12ed 6375 symbol_free_list = sblk->symbols[0].s.next;
c8099634 6376 lisp_free (sblk);
6ca94ac9
KH
6377 }
6378 else
6feef451
AS
6379 {
6380 num_free += this_free;
6381 sprev = &sblk->next;
6382 }
7146af97
JB
6383 }
6384 total_symbols = num_used;
6385 total_free_symbols = num_free;
6386 }
6387
a9faeabe
RS
6388 /* Put all unmarked misc's on free list.
6389 For a marker, first unchain it from the buffer it points into. */
7146af97
JB
6390 {
6391 register struct marker_block *mblk;
6ca94ac9 6392 struct marker_block **mprev = &marker_block;
7146af97 6393 register int lim = marker_block_index;
c0c5c8ae 6394 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
6395
6396 marker_free_list = 0;
177c0ea7 6397
6ca94ac9 6398 for (mblk = marker_block; mblk; mblk = *mprev)
7146af97
JB
6399 {
6400 register int i;
6ca94ac9 6401 int this_free = 0;
fa05e253 6402
7146af97 6403 for (i = 0; i < lim; i++)
465edf35 6404 {
d55c12ed 6405 if (!mblk->markers[i].m.u_any.gcmarkbit)
465edf35 6406 {
d55c12ed
AS
6407 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker)
6408 unchain_marker (&mblk->markers[i].m.u_marker);
fa05e253
RS
6409 /* Set the type of the freed object to Lisp_Misc_Free.
6410 We could leave the type alone, since nobody checks it,
465edf35 6411 but this might catch bugs faster. */
d55c12ed
AS
6412 mblk->markers[i].m.u_marker.type = Lisp_Misc_Free;
6413 mblk->markers[i].m.u_free.chain = marker_free_list;
6414 marker_free_list = &mblk->markers[i].m;
6ca94ac9 6415 this_free++;
465edf35
KH
6416 }
6417 else
6418 {
6419 num_used++;
d55c12ed 6420 mblk->markers[i].m.u_any.gcmarkbit = 0;
465edf35
KH
6421 }
6422 }
7146af97 6423 lim = MARKER_BLOCK_SIZE;
6ca94ac9
KH
6424 /* If this block contains only free markers and we have already
6425 seen more than two blocks worth of free markers then deallocate
6426 this block. */
6feef451 6427 if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE)
6ca94ac9 6428 {
6ca94ac9
KH
6429 *mprev = mblk->next;
6430 /* Unhook from the free list. */
d55c12ed 6431 marker_free_list = mblk->markers[0].m.u_free.chain;
c8099634 6432 lisp_free (mblk);
6ca94ac9
KH
6433 }
6434 else
6feef451
AS
6435 {
6436 num_free += this_free;
6437 mprev = &mblk->next;
6438 }
7146af97
JB
6439 }
6440
6441 total_markers = num_used;
6442 total_free_markers = num_free;
6443 }
6444
6445 /* Free all unmarked buffers */
6446 {
3e98c68e 6447 register struct buffer *buffer, **bprev = &all_buffers;
7146af97 6448
3ab6e069 6449 total_buffers = 0;
3e98c68e 6450 for (buffer = all_buffers; buffer; buffer = *bprev)
3ef06d12 6451 if (!VECTOR_MARKED_P (buffer))
7146af97 6452 {
914adc42 6453 *bprev = buffer->next;
34400008 6454 lisp_free (buffer);
7146af97
JB
6455 }
6456 else
6457 {
3ef06d12 6458 VECTOR_UNMARK (buffer);
8707c1e5
DA
6459 /* Do not use buffer_(set|get)_intervals here. */
6460 buffer->text->intervals = balance_intervals (buffer->text->intervals);
3ab6e069 6461 total_buffers++;
914adc42 6462 bprev = &buffer->next;
7146af97
JB
6463 }
6464 }
6465
f3372c87 6466 sweep_vectors ();
e499d0ee 6467 check_string_bytes (!noninteractive);
7146af97 6468}
7146af97 6469
7146af97 6470
7146af97 6471
7146af97 6472\f
20d24714
JB
6473/* Debugging aids. */
6474
31ce1c91 6475DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
a6266d23 6476 doc: /* Return the address of the last byte Emacs has allocated, divided by 1024.
228299fa 6477This may be helpful in debugging Emacs's memory usage.
7ee72033 6478We divide the value by 1024 to make sure it fits in a Lisp integer. */)
5842a27b 6479 (void)
20d24714
JB
6480{
6481 Lisp_Object end;
6482
d01a7826 6483 XSETINT (end, (intptr_t) (char *) sbrk (0) / 1024);
20d24714
JB
6484
6485 return end;
6486}
6487
310ea200 6488DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
a6266d23 6489 doc: /* Return a list of counters that measure how much consing there has been.
228299fa
GM
6490Each of these counters increments for a certain kind of object.
6491The counters wrap around from the largest positive integer to zero.
6492Garbage collection does not decrease them.
6493The elements of the value are as follows:
6494 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS STRINGS)
6495All are in units of 1 = one object consed
6496except for VECTOR-CELLS and STRING-CHARS, which count the total length of
6497objects consed.
6498MISCS include overlays, markers, and some internal types.
6499Frames, windows, buffers, and subprocesses count as vectors
7ee72033 6500 (but the contents of a buffer's text do not count here). */)
5842a27b 6501 (void)
310ea200 6502{
3438fe21 6503 return listn (CONSTYPE_HEAP, 8,
694b6c97
DA
6504 bounded_number (cons_cells_consed),
6505 bounded_number (floats_consed),
6506 bounded_number (vector_cells_consed),
6507 bounded_number (symbols_consed),
6508 bounded_number (string_chars_consed),
6509 bounded_number (misc_objects_consed),
6510 bounded_number (intervals_consed),
6511 bounded_number (strings_consed));
310ea200 6512}
e0b8c689 6513
8b058d44
EZ
6514/* Find at most FIND_MAX symbols which have OBJ as their value or
6515 function. This is used in gdbinit's `xwhichsymbols' command. */
6516
6517Lisp_Object
196e41e4 6518which_symbols (Lisp_Object obj, EMACS_INT find_max)
8b058d44
EZ
6519{
6520 struct symbol_block *sblk;
8d0eb4c2 6521 ptrdiff_t gc_count = inhibit_garbage_collection ();
8b058d44
EZ
6522 Lisp_Object found = Qnil;
6523
ca78dc43 6524 if (! DEADP (obj))
8b058d44
EZ
6525 {
6526 for (sblk = symbol_block; sblk; sblk = sblk->next)
6527 {
9426aba4 6528 union aligned_Lisp_Symbol *aligned_sym = sblk->symbols;
8b058d44
EZ
6529 int bn;
6530
9426aba4 6531 for (bn = 0; bn < SYMBOL_BLOCK_SIZE; bn++, aligned_sym++)
8b058d44 6532 {
9426aba4 6533 struct Lisp_Symbol *sym = &aligned_sym->s;
8b058d44
EZ
6534 Lisp_Object val;
6535 Lisp_Object tem;
6536
6537 if (sblk == symbol_block && bn >= symbol_block_index)
6538 break;
6539
6540 XSETSYMBOL (tem, sym);
6541 val = find_symbol_value (tem);
6542 if (EQ (val, obj)
c644523b
DA
6543 || EQ (sym->function, obj)
6544 || (!NILP (sym->function)
6545 && COMPILEDP (sym->function)
6546 && EQ (AREF (sym->function, COMPILED_BYTECODE), obj))
8b058d44
EZ
6547 || (!NILP (val)
6548 && COMPILEDP (val)
6549 && EQ (AREF (val, COMPILED_BYTECODE), obj)))
6550 {
6551 found = Fcons (tem, found);
6552 if (--find_max == 0)
6553 goto out;
6554 }
6555 }
6556 }
6557 }
6558
6559 out:
6560 unbind_to (gc_count, Qnil);
6561 return found;
6562}
6563
244ed907 6564#ifdef ENABLE_CHECKING
f4a681b0 6565
fce31d69 6566bool suppress_checking;
d3d47262 6567
e0b8c689 6568void
971de7fb 6569die (const char *msg, const char *file, int line)
e0b8c689 6570{
5013fc08 6571 fprintf (stderr, "\r\n%s:%d: Emacs fatal error: assertion failed: %s\r\n",
e0b8c689 6572 file, line, msg);
4d7e6e51 6573 terminate_due_to_signal (SIGABRT, INT_MAX);
e0b8c689 6574}
244ed907 6575#endif
20d24714 6576\f
b09cca6a 6577/* Initialization. */
7146af97 6578
dfcf069d 6579void
971de7fb 6580init_alloc_once (void)
7146af97
JB
6581{
6582 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
9e713715
GM
6583 purebeg = PUREBEG;
6584 pure_size = PURESIZE;
ab6780cd 6585
877935b1 6586#if GC_MARK_STACK || defined GC_MALLOC_CHECK
34400008
GM
6587 mem_init ();
6588 Vdead = make_pure_string ("DEAD", 4, 4, 0);
6589#endif
9e713715 6590
d1658221 6591#ifdef DOUG_LEA_MALLOC
b09cca6a
SM
6592 mallopt (M_TRIM_THRESHOLD, 128 * 1024); /* Trim threshold. */
6593 mallopt (M_MMAP_THRESHOLD, 64 * 1024); /* Mmap threshold. */
6594 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); /* Max. number of mmap'ed areas. */
d1658221 6595#endif
7146af97 6596 init_strings ();
f3372c87 6597 init_vectors ();
d5e35230 6598
24d8a105 6599 refill_memory_reserve ();
0dd6d66d 6600 gc_cons_threshold = GC_DEFAULT_THRESHOLD;
7146af97
JB
6601}
6602
dfcf069d 6603void
971de7fb 6604init_alloc (void)
7146af97
JB
6605{
6606 gcprolist = 0;
630686c8 6607 byte_stack_list = 0;
182ff242
GM
6608#if GC_MARK_STACK
6609#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
6610 setjmp_tested_p = longjmps_done = 0;
6611#endif
6612#endif
2c5bd608
DL
6613 Vgc_elapsed = make_float (0.0);
6614 gcs_done = 0;
7146af97
JB
6615}
6616
6617void
971de7fb 6618syms_of_alloc (void)
7146af97 6619{
29208e82 6620 DEFVAR_INT ("gc-cons-threshold", gc_cons_threshold,
fb7ada5f 6621 doc: /* Number of bytes of consing between garbage collections.
228299fa
GM
6622Garbage collection can happen automatically once this many bytes have been
6623allocated since the last garbage collection. All data types count.
7146af97 6624
228299fa 6625Garbage collection happens automatically only when `eval' is called.
7146af97 6626
228299fa 6627By binding this temporarily to a large number, you can effectively
96f077ad
SM
6628prevent garbage collection during a part of the program.
6629See also `gc-cons-percentage'. */);
6630
29208e82 6631 DEFVAR_LISP ("gc-cons-percentage", Vgc_cons_percentage,
fb7ada5f 6632 doc: /* Portion of the heap used for allocation.
96f077ad
SM
6633Garbage collection can happen automatically once this portion of the heap
6634has been allocated since the last garbage collection.
6635If this portion is smaller than `gc-cons-threshold', this is ignored. */);
6636 Vgc_cons_percentage = make_float (0.1);
0819585c 6637
29208e82 6638 DEFVAR_INT ("pure-bytes-used", pure_bytes_used,
333f9019 6639 doc: /* Number of bytes of shareable Lisp data allocated so far. */);
0819585c 6640
29208e82 6641 DEFVAR_INT ("cons-cells-consed", cons_cells_consed,
a6266d23 6642 doc: /* Number of cons cells that have been consed so far. */);
0819585c 6643
29208e82 6644 DEFVAR_INT ("floats-consed", floats_consed,
a6266d23 6645 doc: /* Number of floats that have been consed so far. */);
0819585c 6646
29208e82 6647 DEFVAR_INT ("vector-cells-consed", vector_cells_consed,
a6266d23 6648 doc: /* Number of vector cells that have been consed so far. */);
0819585c 6649
29208e82 6650 DEFVAR_INT ("symbols-consed", symbols_consed,
a6266d23 6651 doc: /* Number of symbols that have been consed so far. */);
0819585c 6652
29208e82 6653 DEFVAR_INT ("string-chars-consed", string_chars_consed,
a6266d23 6654 doc: /* Number of string characters that have been consed so far. */);
0819585c 6655
29208e82 6656 DEFVAR_INT ("misc-objects-consed", misc_objects_consed,
01a6dcc8
GM
6657 doc: /* Number of miscellaneous objects that have been consed so far.
6658These include markers and overlays, plus certain objects not visible
6659to users. */);
2e471eb5 6660
29208e82 6661 DEFVAR_INT ("intervals-consed", intervals_consed,
a6266d23 6662 doc: /* Number of intervals that have been consed so far. */);
7146af97 6663
29208e82 6664 DEFVAR_INT ("strings-consed", strings_consed,
a6266d23 6665 doc: /* Number of strings that have been consed so far. */);
228299fa 6666
29208e82 6667 DEFVAR_LISP ("purify-flag", Vpurify_flag,
a6266d23 6668 doc: /* Non-nil means loading Lisp code in order to dump an executable.
e9515805
SM
6669This means that certain objects should be allocated in shared (pure) space.
6670It can also be set to a hash-table, in which case this table is used to
6671do hash-consing of the objects allocated to pure space. */);
228299fa 6672
29208e82 6673 DEFVAR_BOOL ("garbage-collection-messages", garbage_collection_messages,
a6266d23 6674 doc: /* Non-nil means display messages at start and end of garbage collection. */);
299585ee
RS
6675 garbage_collection_messages = 0;
6676
29208e82 6677 DEFVAR_LISP ("post-gc-hook", Vpost_gc_hook,
a6266d23 6678 doc: /* Hook run after garbage collection has finished. */);
9e713715 6679 Vpost_gc_hook = Qnil;
cd3520a4 6680 DEFSYM (Qpost_gc_hook, "post-gc-hook");
9e713715 6681
29208e82 6682 DEFVAR_LISP ("memory-signal-data", Vmemory_signal_data,
74a54b04 6683 doc: /* Precomputed `signal' argument for memory-full error. */);
bcb61d60
KH
6684 /* We build this in advance because if we wait until we need it, we might
6685 not be able to allocate the memory to hold it. */
74a54b04 6686 Vmemory_signal_data
3438fe21 6687 = listn (CONSTYPE_PURE, 2, Qerror,
694b6c97 6688 build_pure_c_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs"));
74a54b04 6689
29208e82 6690 DEFVAR_LISP ("memory-full", Vmemory_full,
24d8a105 6691 doc: /* Non-nil means Emacs cannot get much more Lisp memory. */);
74a54b04 6692 Vmemory_full = Qnil;
bcb61d60 6693
fecbd8ff
SM
6694 DEFSYM (Qconses, "conses");
6695 DEFSYM (Qsymbols, "symbols");
6696 DEFSYM (Qmiscs, "miscs");
6697 DEFSYM (Qstrings, "strings");
6698 DEFSYM (Qvectors, "vectors");
6699 DEFSYM (Qfloats, "floats");
6700 DEFSYM (Qintervals, "intervals");
6701 DEFSYM (Qbuffers, "buffers");
5b835e1d
DA
6702 DEFSYM (Qstring_bytes, "string-bytes");
6703 DEFSYM (Qvector_slots, "vector-slots");
f8643a6b 6704 DEFSYM (Qheap, "heap");
3d80c99f 6705 DEFSYM (Qautomatic_gc, "Automatic GC");
5b835e1d 6706
cd3520a4
JB
6707 DEFSYM (Qgc_cons_threshold, "gc-cons-threshold");
6708 DEFSYM (Qchar_table_extra_slots, "char-table-extra-slots");
a59de17b 6709
29208e82 6710 DEFVAR_LISP ("gc-elapsed", Vgc_elapsed,
2c5bd608 6711 doc: /* Accumulated time elapsed in garbage collections.
e7415487 6712The time is in seconds as a floating point value. */);
29208e82 6713 DEFVAR_INT ("gcs-done", gcs_done,
e7415487 6714 doc: /* Accumulated number of garbage collections done. */);
2c5bd608 6715
7146af97
JB
6716 defsubr (&Scons);
6717 defsubr (&Slist);
6718 defsubr (&Svector);
6719 defsubr (&Smake_byte_code);
6720 defsubr (&Smake_list);
6721 defsubr (&Smake_vector);
6722 defsubr (&Smake_string);
7b07587b 6723 defsubr (&Smake_bool_vector);
7146af97
JB
6724 defsubr (&Smake_symbol);
6725 defsubr (&Smake_marker);
6726 defsubr (&Spurecopy);
6727 defsubr (&Sgarbage_collect);
20d24714 6728 defsubr (&Smemory_limit);
310ea200 6729 defsubr (&Smemory_use_counts);
34400008
GM
6730
6731#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
6732 defsubr (&Sgc_status);
6733#endif
7146af97 6734}
5eceb8fb 6735
4706125e
PE
6736/* When compiled with GCC, GDB might say "No enum type named
6737 pvec_type" if we don't have at least one symbol with that type, and
6738 then xbacktrace could fail. Similarly for the other enums and
62aba0d4
FP
6739 their values. Some non-GCC compilers don't like these constructs. */
6740#ifdef __GNUC__
4706125e
PE
6741union
6742{
03a660a6
PE
6743 enum CHARTAB_SIZE_BITS CHARTAB_SIZE_BITS;
6744 enum CHAR_TABLE_STANDARD_SLOTS CHAR_TABLE_STANDARD_SLOTS;
6745 enum char_bits char_bits;
4706125e 6746 enum CHECK_LISP_OBJECT_TYPE CHECK_LISP_OBJECT_TYPE;
03a660a6 6747 enum DEFAULT_HASH_SIZE DEFAULT_HASH_SIZE;
4706125e 6748 enum enum_USE_LSB_TAG enum_USE_LSB_TAG;
03a660a6 6749 enum FLOAT_TO_STRING_BUFSIZE FLOAT_TO_STRING_BUFSIZE;
4706125e 6750 enum Lisp_Bits Lisp_Bits;
03a660a6
PE
6751 enum Lisp_Compiled Lisp_Compiled;
6752 enum maxargs maxargs;
6753 enum MAX_ALLOCA MAX_ALLOCA;
4706125e
PE
6754 enum More_Lisp_Bits More_Lisp_Bits;
6755 enum pvec_type pvec_type;
6756} const EXTERNALLY_VISIBLE gdb_make_enums_visible = {0};
62aba0d4 6757#endif /* __GNUC__ */