Fix compiler warnings from XCode 5.0 on OSX.
[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
3e0b94e7
DC
2004verify (sizeof (size_t) * CHAR_BIT == BITS_PER_SIZE_T);
2005verify ((BITS_PER_SIZE_T & (BITS_PER_SIZE_T - 1)) == 0);
2006
2007static
2008ptrdiff_t
2009bool_vector_payload_bytes (ptrdiff_t nr_bits,
2010 ptrdiff_t* exact_needed_bytes_out)
2011{
2012 ptrdiff_t exact_needed_bytes;
2013 ptrdiff_t needed_bytes;
2014
2015 eassert_and_assume (nr_bits >= 0);
2016
2017 exact_needed_bytes = ROUNDUP ((size_t) nr_bits, CHAR_BIT) / CHAR_BIT;
2018 needed_bytes = ROUNDUP ((size_t) nr_bits, BITS_PER_SIZE_T) / CHAR_BIT;
2019
2020 if (needed_bytes == 0)
2021 {
2022 /* Always allocate at least one machine word of payload so that
2023 bool-vector operations in data.c don't need a special case
2024 for empty vectors. */
2025 needed_bytes = sizeof (size_t);
2026 }
2027
2028 if (exact_needed_bytes_out != NULL)
2029 *exact_needed_bytes_out = exact_needed_bytes;
2030
2031 return needed_bytes;
2032}
2e471eb5 2033
a7ca3326 2034DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
909e3b33 2035 doc: /* Return a new bool-vector of length LENGTH, using INIT for each element.
7ee72033 2036LENGTH must be a number. INIT matters only in whether it is t or nil. */)
5842a27b 2037 (Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2038{
2039 register Lisp_Object val;
2040 struct Lisp_Bool_Vector *p;
3e0b94e7
DC
2041 ptrdiff_t exact_payload_bytes;
2042 ptrdiff_t total_payload_bytes;
2043 ptrdiff_t needed_elements;
2e471eb5 2044
b7826503 2045 CHECK_NATNUM (length);
3e0b94e7
DC
2046 if (PTRDIFF_MAX < XFASTINT (length))
2047 memory_full (SIZE_MAX);
2e471eb5 2048
3e0b94e7
DC
2049 total_payload_bytes = bool_vector_payload_bytes
2050 (XFASTINT (length), &exact_payload_bytes);
2e471eb5 2051
3e0b94e7
DC
2052 eassert_and_assume (exact_payload_bytes <= total_payload_bytes);
2053 eassert_and_assume (0 <= exact_payload_bytes);
2e471eb5 2054
3e0b94e7
DC
2055 needed_elements = ROUNDUP ((size_t) ((bool_header_size - header_size)
2056 + total_payload_bytes),
2057 word_size) / word_size;
177c0ea7 2058
3e0b94e7
DC
2059 p = (struct Lisp_Bool_Vector* ) allocate_vector (needed_elements);
2060 XSETVECTOR (val, p);
914adc42 2061 XSETPVECTYPESIZE (XVECTOR (val), PVEC_BOOL_VECTOR, 0, 0);
d2029e5b 2062
2e471eb5 2063 p->size = XFASTINT (length);
3e0b94e7 2064 if (exact_payload_bytes)
c0c1ee9f 2065 {
3e0b94e7 2066 memset (p->data, ! NILP (init) ? -1 : 0, exact_payload_bytes);
177c0ea7 2067
c0c1ee9f 2068 /* Clear any extraneous bits in the last byte. */
3e0b94e7 2069 p->data[exact_payload_bytes - 1]
83713154 2070 &= (1 << ((XFASTINT (length) - 1) % BOOL_VECTOR_BITS_PER_CHAR + 1)) - 1;
c0c1ee9f 2071 }
2e471eb5 2072
3e0b94e7
DC
2073 /* Clear padding at the end. */
2074 memset (p->data + exact_payload_bytes,
2075 0,
2076 total_payload_bytes - exact_payload_bytes);
2077
2e471eb5
GM
2078 return val;
2079}
2080
2081
2082/* Make a string from NBYTES bytes at CONTENTS, and compute the number
2083 of characters from the contents. This string may be unibyte or
2084 multibyte, depending on the contents. */
2085
2086Lisp_Object
d311d28c 2087make_string (const char *contents, ptrdiff_t nbytes)
2e471eb5
GM
2088{
2089 register Lisp_Object val;
d311d28c 2090 ptrdiff_t nchars, multibyte_nbytes;
9eac9d59 2091
90256841
PE
2092 parse_str_as_multibyte ((const unsigned char *) contents, nbytes,
2093 &nchars, &multibyte_nbytes);
9eac9d59
KH
2094 if (nbytes == nchars || nbytes != multibyte_nbytes)
2095 /* CONTENTS contains no multibyte sequences or contains an invalid
2096 multibyte sequence. We must make unibyte string. */
495a6df3
KH
2097 val = make_unibyte_string (contents, nbytes);
2098 else
2099 val = make_multibyte_string (contents, nchars, nbytes);
2e471eb5
GM
2100 return val;
2101}
2102
2103
2104/* Make an unibyte string from LENGTH bytes at CONTENTS. */
2105
2106Lisp_Object
d311d28c 2107make_unibyte_string (const char *contents, ptrdiff_t length)
2e471eb5
GM
2108{
2109 register Lisp_Object val;
2110 val = make_uninit_string (length);
72af86bd 2111 memcpy (SDATA (val), contents, length);
2e471eb5
GM
2112 return val;
2113}
2114
2115
2116/* Make a multibyte string from NCHARS characters occupying NBYTES
2117 bytes at CONTENTS. */
2118
2119Lisp_Object
14162469 2120make_multibyte_string (const char *contents,
d311d28c 2121 ptrdiff_t nchars, ptrdiff_t nbytes)
2e471eb5
GM
2122{
2123 register Lisp_Object val;
2124 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2125 memcpy (SDATA (val), contents, nbytes);
2e471eb5
GM
2126 return val;
2127}
2128
2129
2130/* Make a string from NCHARS characters occupying NBYTES bytes at
2131 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
2132
2133Lisp_Object
14162469 2134make_string_from_bytes (const char *contents,
d311d28c 2135 ptrdiff_t nchars, ptrdiff_t nbytes)
2e471eb5
GM
2136{
2137 register Lisp_Object val;
2138 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2139 memcpy (SDATA (val), contents, nbytes);
d5db4077
KR
2140 if (SBYTES (val) == SCHARS (val))
2141 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2142 return val;
2143}
2144
2145
2146/* Make a string from NCHARS characters occupying NBYTES bytes at
2147 CONTENTS. The argument MULTIBYTE controls whether to label the
229b28c4
KH
2148 string as multibyte. If NCHARS is negative, it counts the number of
2149 characters by itself. */
2e471eb5
GM
2150
2151Lisp_Object
14162469 2152make_specified_string (const char *contents,
fce31d69 2153 ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
2e471eb5 2154{
fce31d69 2155 Lisp_Object val;
229b28c4
KH
2156
2157 if (nchars < 0)
2158 {
2159 if (multibyte)
90256841
PE
2160 nchars = multibyte_chars_in_text ((const unsigned char *) contents,
2161 nbytes);
229b28c4
KH
2162 else
2163 nchars = nbytes;
2164 }
2e471eb5 2165 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2166 memcpy (SDATA (val), contents, nbytes);
2e471eb5 2167 if (!multibyte)
d5db4077 2168 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2169 return val;
2170}
2171
2172
2e471eb5
GM
2173/* Return an unibyte Lisp_String set up to hold LENGTH characters
2174 occupying LENGTH bytes. */
2175
2176Lisp_Object
413d18e7 2177make_uninit_string (EMACS_INT length)
2e471eb5
GM
2178{
2179 Lisp_Object val;
4d774b0f
JB
2180
2181 if (!length)
2182 return empty_unibyte_string;
2e471eb5 2183 val = make_uninit_multibyte_string (length, length);
d5db4077 2184 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2185 return val;
2186}
2187
2188
2189/* Return a multibyte Lisp_String set up to hold NCHARS characters
2190 which occupy NBYTES bytes. */
2191
2192Lisp_Object
413d18e7 2193make_uninit_multibyte_string (EMACS_INT nchars, EMACS_INT nbytes)
2e471eb5
GM
2194{
2195 Lisp_Object string;
2196 struct Lisp_String *s;
2197
2198 if (nchars < 0)
1088b922 2199 emacs_abort ();
4d774b0f
JB
2200 if (!nbytes)
2201 return empty_multibyte_string;
2e471eb5
GM
2202
2203 s = allocate_string ();
77c7bcb1 2204 s->intervals = NULL;
2e471eb5
GM
2205 allocate_string_data (s, nchars, nbytes);
2206 XSETSTRING (string, s);
2207 string_chars_consed += nbytes;
2208 return string;
2209}
2210
a8290ec3
DA
2211/* Print arguments to BUF according to a FORMAT, then return
2212 a Lisp_String initialized with the data from BUF. */
2213
2214Lisp_Object
2215make_formatted_string (char *buf, const char *format, ...)
2216{
2217 va_list ap;
26bccfae 2218 int length;
a8290ec3
DA
2219
2220 va_start (ap, format);
2221 length = vsprintf (buf, format, ap);
2222 va_end (ap);
2223 return make_string (buf, length);
2224}
2e471eb5
GM
2225
2226\f
2227/***********************************************************************
2228 Float Allocation
2229 ***********************************************************************/
2230
2e471eb5
GM
2231/* We store float cells inside of float_blocks, allocating a new
2232 float_block with malloc whenever necessary. Float cells reclaimed
2233 by GC are put on a free list to be reallocated before allocating
ab6780cd 2234 any new float cells from the latest float_block. */
2e471eb5 2235
6b61353c
KH
2236#define FLOAT_BLOCK_SIZE \
2237 (((BLOCK_BYTES - sizeof (struct float_block *) \
2238 /* The compiler might add padding at the end. */ \
2239 - (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \
ab6780cd
SM
2240 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
2241
2242#define GETMARKBIT(block,n) \
5e617bc2
JB
2243 (((block)->gcmarkbits[(n) / (sizeof (int) * CHAR_BIT)] \
2244 >> ((n) % (sizeof (int) * CHAR_BIT))) \
ab6780cd
SM
2245 & 1)
2246
2247#define SETMARKBIT(block,n) \
5e617bc2
JB
2248 (block)->gcmarkbits[(n) / (sizeof (int) * CHAR_BIT)] \
2249 |= 1 << ((n) % (sizeof (int) * CHAR_BIT))
ab6780cd
SM
2250
2251#define UNSETMARKBIT(block,n) \
5e617bc2
JB
2252 (block)->gcmarkbits[(n) / (sizeof (int) * CHAR_BIT)] \
2253 &= ~(1 << ((n) % (sizeof (int) * CHAR_BIT)))
ab6780cd
SM
2254
2255#define FLOAT_BLOCK(fptr) \
d01a7826 2256 ((struct float_block *) (((uintptr_t) (fptr)) & ~(BLOCK_ALIGN - 1)))
ab6780cd
SM
2257
2258#define FLOAT_INDEX(fptr) \
d01a7826 2259 ((((uintptr_t) (fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float))
2e471eb5
GM
2260
2261struct float_block
2262{
ab6780cd 2263 /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job. */
2e471eb5 2264 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
5e617bc2 2265 int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof (int) * CHAR_BIT)];
ab6780cd 2266 struct float_block *next;
2e471eb5
GM
2267};
2268
ab6780cd
SM
2269#define FLOAT_MARKED_P(fptr) \
2270 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2271
2272#define FLOAT_MARK(fptr) \
2273 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2274
2275#define FLOAT_UNMARK(fptr) \
2276 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2277
34400008
GM
2278/* Current float_block. */
2279
244ed907 2280static struct float_block *float_block;
34400008
GM
2281
2282/* Index of first unused Lisp_Float in the current float_block. */
2283
fff62aa9 2284static int float_block_index = FLOAT_BLOCK_SIZE;
2e471eb5 2285
34400008
GM
2286/* Free-list of Lisp_Floats. */
2287
244ed907 2288static struct Lisp_Float *float_free_list;
2e471eb5 2289
34400008
GM
2290/* Return a new float object with value FLOAT_VALUE. */
2291
2e471eb5 2292Lisp_Object
971de7fb 2293make_float (double float_value)
2e471eb5
GM
2294{
2295 register Lisp_Object val;
2296
dafc79fa 2297 MALLOC_BLOCK_INPUT;
cfb2f32e 2298
2e471eb5
GM
2299 if (float_free_list)
2300 {
2301 /* We use the data field for chaining the free list
2302 so that we won't use the same field that has the mark bit. */
2303 XSETFLOAT (val, float_free_list);
28a099a4 2304 float_free_list = float_free_list->u.chain;
2e471eb5
GM
2305 }
2306 else
2307 {
2308 if (float_block_index == FLOAT_BLOCK_SIZE)
2309 {
38182d90
PE
2310 struct float_block *new
2311 = lisp_align_malloc (sizeof *new, MEM_TYPE_FLOAT);
2e471eb5 2312 new->next = float_block;
72af86bd 2313 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2314 float_block = new;
2315 float_block_index = 0;
3900d5de 2316 total_free_floats += FLOAT_BLOCK_SIZE;
2e471eb5 2317 }
6b61353c
KH
2318 XSETFLOAT (val, &float_block->floats[float_block_index]);
2319 float_block_index++;
2e471eb5 2320 }
177c0ea7 2321
dafc79fa 2322 MALLOC_UNBLOCK_INPUT;
e2984df0 2323
f601cdf3 2324 XFLOAT_INIT (val, float_value);
6b61353c 2325 eassert (!FLOAT_MARKED_P (XFLOAT (val)));
2e471eb5
GM
2326 consing_since_gc += sizeof (struct Lisp_Float);
2327 floats_consed++;
3900d5de 2328 total_free_floats--;
2e471eb5
GM
2329 return val;
2330}
2331
2e471eb5
GM
2332
2333\f
2334/***********************************************************************
2335 Cons Allocation
2336 ***********************************************************************/
2337
2338/* We store cons cells inside of cons_blocks, allocating a new
2339 cons_block with malloc whenever necessary. Cons cells reclaimed by
2340 GC are put on a free list to be reallocated before allocating
08b7c2cb 2341 any new cons cells from the latest cons_block. */
2e471eb5 2342
a2821611
AS
2343#define CONS_BLOCK_SIZE \
2344 (((BLOCK_BYTES - sizeof (struct cons_block *) \
2345 /* The compiler might add padding at the end. */ \
2346 - (sizeof (struct Lisp_Cons) - sizeof (int))) * CHAR_BIT) \
08b7c2cb
SM
2347 / (sizeof (struct Lisp_Cons) * CHAR_BIT + 1))
2348
2349#define CONS_BLOCK(fptr) \
d01a7826 2350 ((struct cons_block *) ((uintptr_t) (fptr) & ~(BLOCK_ALIGN - 1)))
08b7c2cb
SM
2351
2352#define CONS_INDEX(fptr) \
d01a7826 2353 (((uintptr_t) (fptr) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Cons))
2e471eb5
GM
2354
2355struct cons_block
2356{
08b7c2cb 2357 /* Place `conses' at the beginning, to ease up CONS_INDEX's job. */
2e471eb5 2358 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
5e617bc2 2359 int gcmarkbits[1 + CONS_BLOCK_SIZE / (sizeof (int) * CHAR_BIT)];
08b7c2cb 2360 struct cons_block *next;
2e471eb5
GM
2361};
2362
08b7c2cb
SM
2363#define CONS_MARKED_P(fptr) \
2364 GETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2365
2366#define CONS_MARK(fptr) \
2367 SETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2368
2369#define CONS_UNMARK(fptr) \
2370 UNSETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2371
34400008
GM
2372/* Current cons_block. */
2373
244ed907 2374static struct cons_block *cons_block;
34400008
GM
2375
2376/* Index of first unused Lisp_Cons in the current block. */
2377
fff62aa9 2378static int cons_block_index = CONS_BLOCK_SIZE;
2e471eb5 2379
34400008
GM
2380/* Free-list of Lisp_Cons structures. */
2381
244ed907 2382static struct Lisp_Cons *cons_free_list;
2e471eb5 2383
34400008 2384/* Explicitly free a cons cell by putting it on the free-list. */
2e471eb5
GM
2385
2386void
971de7fb 2387free_cons (struct Lisp_Cons *ptr)
2e471eb5 2388{
28a099a4 2389 ptr->u.chain = cons_free_list;
34400008 2390#if GC_MARK_STACK
c644523b 2391 ptr->car = Vdead;
34400008 2392#endif
2e471eb5 2393 cons_free_list = ptr;
0dd6d66d 2394 consing_since_gc -= sizeof *ptr;
3900d5de 2395 total_free_conses++;
2e471eb5
GM
2396}
2397
a7ca3326 2398DEFUN ("cons", Fcons, Scons, 2, 2, 0,
a6266d23 2399 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */)
5842a27b 2400 (Lisp_Object car, Lisp_Object cdr)
2e471eb5
GM
2401{
2402 register Lisp_Object val;
2403
dafc79fa 2404 MALLOC_BLOCK_INPUT;
cfb2f32e 2405
2e471eb5
GM
2406 if (cons_free_list)
2407 {
2408 /* We use the cdr for chaining the free list
2409 so that we won't use the same field that has the mark bit. */
2410 XSETCONS (val, cons_free_list);
28a099a4 2411 cons_free_list = cons_free_list->u.chain;
2e471eb5
GM
2412 }
2413 else
2414 {
2415 if (cons_block_index == CONS_BLOCK_SIZE)
2416 {
38182d90
PE
2417 struct cons_block *new
2418 = lisp_align_malloc (sizeof *new, MEM_TYPE_CONS);
72af86bd 2419 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2420 new->next = cons_block;
2421 cons_block = new;
2422 cons_block_index = 0;
3900d5de 2423 total_free_conses += CONS_BLOCK_SIZE;
2e471eb5 2424 }
6b61353c
KH
2425 XSETCONS (val, &cons_block->conses[cons_block_index]);
2426 cons_block_index++;
2e471eb5 2427 }
177c0ea7 2428
dafc79fa 2429 MALLOC_UNBLOCK_INPUT;
e2984df0 2430
f3fbd155
KR
2431 XSETCAR (val, car);
2432 XSETCDR (val, cdr);
6b61353c 2433 eassert (!CONS_MARKED_P (XCONS (val)));
2e471eb5 2434 consing_since_gc += sizeof (struct Lisp_Cons);
3900d5de 2435 total_free_conses--;
2e471eb5
GM
2436 cons_cells_consed++;
2437 return val;
2438}
2439
e5aab7e7 2440#ifdef GC_CHECK_CONS_LIST
e3e56238
RS
2441/* Get an error now if there's any junk in the cons free list. */
2442void
971de7fb 2443check_cons_list (void)
e3e56238
RS
2444{
2445 struct Lisp_Cons *tail = cons_free_list;
2446
e3e56238 2447 while (tail)
28a099a4 2448 tail = tail->u.chain;
e3e56238 2449}
e5aab7e7 2450#endif
34400008 2451
9b306d37
KS
2452/* Make a list of 1, 2, 3, 4 or 5 specified objects. */
2453
2454Lisp_Object
971de7fb 2455list1 (Lisp_Object arg1)
9b306d37
KS
2456{
2457 return Fcons (arg1, Qnil);
2458}
2e471eb5
GM
2459
2460Lisp_Object
971de7fb 2461list2 (Lisp_Object arg1, Lisp_Object arg2)
2e471eb5
GM
2462{
2463 return Fcons (arg1, Fcons (arg2, Qnil));
2464}
2465
34400008 2466
2e471eb5 2467Lisp_Object
971de7fb 2468list3 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
2e471eb5
GM
2469{
2470 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Qnil)));
2471}
2472
34400008 2473
2e471eb5 2474Lisp_Object
971de7fb 2475list4 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4)
2e471eb5
GM
2476{
2477 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4, Qnil))));
2478}
2479
34400008 2480
2e471eb5 2481Lisp_Object
971de7fb 2482list5 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5)
2e471eb5
GM
2483{
2484 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4,
2485 Fcons (arg5, Qnil)))));
2486}
2487
694b6c97
DA
2488/* Make a list of COUNT Lisp_Objects, where ARG is the
2489 first one. Allocate conses from pure space if TYPE
3438fe21 2490 is CONSTYPE_PURE, or allocate as usual if type is CONSTYPE_HEAP. */
694b6c97
DA
2491
2492Lisp_Object
2493listn (enum constype type, ptrdiff_t count, Lisp_Object arg, ...)
2494{
2495 va_list ap;
2496 ptrdiff_t i;
2497 Lisp_Object val, *objp;
2498
2499 /* Change to SAFE_ALLOCA if you hit this eassert. */
663e2b3f 2500 eassert (count <= MAX_ALLOCA / word_size);
694b6c97 2501
663e2b3f 2502 objp = alloca (count * word_size);
694b6c97
DA
2503 objp[0] = arg;
2504 va_start (ap, arg);
2505 for (i = 1; i < count; i++)
2506 objp[i] = va_arg (ap, Lisp_Object);
2507 va_end (ap);
2508
bcfbc9de 2509 for (val = Qnil, i = count - 1; i >= 0; i--)
694b6c97 2510 {
3438fe21 2511 if (type == CONSTYPE_PURE)
694b6c97 2512 val = pure_cons (objp[i], val);
3438fe21 2513 else if (type == CONSTYPE_HEAP)
694b6c97
DA
2514 val = Fcons (objp[i], val);
2515 else
1088b922 2516 emacs_abort ();
694b6c97
DA
2517 }
2518 return val;
2519}
34400008 2520
a7ca3326 2521DEFUN ("list", Flist, Slist, 0, MANY, 0,
eae936e2 2522 doc: /* Return a newly created list with specified arguments as elements.
ae8e8122
MB
2523Any number of arguments, even zero arguments, are allowed.
2524usage: (list &rest OBJECTS) */)
f66c7cf8 2525 (ptrdiff_t nargs, Lisp_Object *args)
2e471eb5
GM
2526{
2527 register Lisp_Object val;
2528 val = Qnil;
2529
2530 while (nargs > 0)
2531 {
2532 nargs--;
2533 val = Fcons (args[nargs], val);
2534 }
2535 return val;
2536}
2537
34400008 2538
a7ca3326 2539DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
a6266d23 2540 doc: /* Return a newly created list of length LENGTH, with each element being INIT. */)
5842a27b 2541 (register Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2542{
2543 register Lisp_Object val;
14162469 2544 register EMACS_INT size;
2e471eb5 2545
b7826503 2546 CHECK_NATNUM (length);
2e471eb5
GM
2547 size = XFASTINT (length);
2548
2549 val = Qnil;
ce070307
GM
2550 while (size > 0)
2551 {
2552 val = Fcons (init, val);
2553 --size;
2554
2555 if (size > 0)
2556 {
2557 val = Fcons (init, val);
2558 --size;
177c0ea7 2559
ce070307
GM
2560 if (size > 0)
2561 {
2562 val = Fcons (init, val);
2563 --size;
177c0ea7 2564
ce070307
GM
2565 if (size > 0)
2566 {
2567 val = Fcons (init, val);
2568 --size;
177c0ea7 2569
ce070307
GM
2570 if (size > 0)
2571 {
2572 val = Fcons (init, val);
2573 --size;
2574 }
2575 }
2576 }
2577 }
2578
2579 QUIT;
2580 }
177c0ea7 2581
7146af97
JB
2582 return val;
2583}
2e471eb5
GM
2584
2585
7146af97 2586\f
2e471eb5
GM
2587/***********************************************************************
2588 Vector Allocation
2589 ***********************************************************************/
7146af97 2590
f3372c87
DA
2591/* This value is balanced well enough to avoid too much internal overhead
2592 for the most common cases; it's not required to be a power of two, but
2593 it's expected to be a mult-of-ROUNDUP_SIZE (see below). */
34400008 2594
f3372c87 2595#define VECTOR_BLOCK_SIZE 4096
7146af97 2596
d06714cb 2597/* Align allocation request sizes to be a multiple of ROUNDUP_SIZE. */
dd0b0efb
PE
2598enum
2599 {
2b90362b 2600 roundup_size = COMMON_MULTIPLE (word_size, USE_LSB_TAG ? GCALIGNMENT : 1)
dd0b0efb 2601 };
34400008 2602
ca95b3eb
DA
2603/* Verify assumptions described above. */
2604verify ((VECTOR_BLOCK_SIZE % roundup_size) == 0);
ee28be33 2605verify (VECTOR_BLOCK_SIZE <= (1 << PSEUDOVECTOR_SIZE_BITS));
ca95b3eb 2606
3e0b94e7
DC
2607/* Round up X to nearest mult-of-ROUNDUP_SIZE --- use at compile time. */
2608#define vroundup_ct(x) ROUNDUP((size_t)(x), roundup_size)
2609/* Round up X to nearest mult-of-ROUNDUP_SIZE --- use at runtime. */
2610#define vroundup(x) (assume((x) >= 0), vroundup_ct(x))
f3372c87
DA
2611
2612/* Rounding helps to maintain alignment constraints if USE_LSB_TAG. */
2613
3e0b94e7 2614#define VECTOR_BLOCK_BYTES (VECTOR_BLOCK_SIZE - vroundup_ct (sizeof (void *)))
f3372c87
DA
2615
2616/* Size of the minimal vector allocated from block. */
2617
3e0b94e7 2618#define VBLOCK_BYTES_MIN vroundup_ct (header_size + sizeof (Lisp_Object))
f3372c87
DA
2619
2620/* Size of the largest vector allocated from block. */
2621
2622#define VBLOCK_BYTES_MAX \
d06714cb 2623 vroundup ((VECTOR_BLOCK_BYTES / 2) - word_size)
f3372c87
DA
2624
2625/* We maintain one free list for each possible block-allocated
2626 vector size, and this is the number of free lists we have. */
2627
2628#define VECTOR_MAX_FREE_LIST_INDEX \
2629 ((VECTOR_BLOCK_BYTES - VBLOCK_BYTES_MIN) / roundup_size + 1)
2630
f3372c87
DA
2631/* Common shortcut to advance vector pointer over a block data. */
2632
2633#define ADVANCE(v, nbytes) ((struct Lisp_Vector *) ((char *) (v) + (nbytes)))
2634
2635/* Common shortcut to calculate NBYTES-vector index in VECTOR_FREE_LISTS. */
2636
2637#define VINDEX(nbytes) (((nbytes) - VBLOCK_BYTES_MIN) / roundup_size)
2638
76ae24d7
PE
2639/* Get and set the next field in block-allocated vectorlike objects on
2640 the free list. Doing it this way respects C's aliasing rules.
2641 We could instead make 'contents' a union, but that would mean
2642 changes everywhere that the code uses 'contents'. */
2643static struct Lisp_Vector *
2644next_in_free_list (struct Lisp_Vector *v)
7d377c48 2645{
76ae24d7
PE
2646 intptr_t i = XLI (v->contents[0]);
2647 return (struct Lisp_Vector *) i;
2648}
2649static void
2650set_next_in_free_list (struct Lisp_Vector *v, struct Lisp_Vector *next)
2651{
2652 v->contents[0] = XIL ((intptr_t) next);
2653}
914adc42 2654
f3372c87
DA
2655/* Common shortcut to setup vector on a free list. */
2656
914adc42
DA
2657#define SETUP_ON_FREE_LIST(v, nbytes, tmp) \
2658 do { \
2659 (tmp) = ((nbytes - header_size) / word_size); \
2660 XSETPVECTYPESIZE (v, PVEC_FREE, 0, (tmp)); \
2661 eassert ((nbytes) % roundup_size == 0); \
2662 (tmp) = VINDEX (nbytes); \
2663 eassert ((tmp) < VECTOR_MAX_FREE_LIST_INDEX); \
76ae24d7 2664 set_next_in_free_list (v, vector_free_lists[tmp]); \
914adc42
DA
2665 vector_free_lists[tmp] = (v); \
2666 total_free_vector_slots += (nbytes) / word_size; \
f3372c87
DA
2667 } while (0)
2668
914adc42
DA
2669/* This internal type is used to maintain the list of large vectors
2670 which are allocated at their own, e.g. outside of vector blocks. */
2671
2672struct large_vector
2673{
2674 union {
2675 struct large_vector *vector;
2676#if USE_LSB_TAG
2677 /* We need to maintain ROUNDUP_SIZE alignment for the vector member. */
3e0b94e7 2678 unsigned char c[vroundup_ct (sizeof (struct large_vector *))];
914adc42
DA
2679#endif
2680 } next;
2681 struct Lisp_Vector v;
2682};
2683
2684/* This internal type is used to maintain an underlying storage
2685 for small vectors. */
2686
f3372c87
DA
2687struct vector_block
2688{
2689 char data[VECTOR_BLOCK_BYTES];
2690 struct vector_block *next;
2691};
2692
2693/* Chain of vector blocks. */
2694
2695static struct vector_block *vector_blocks;
2696
2697/* Vector free lists, where NTH item points to a chain of free
2698 vectors of the same NBYTES size, so NTH == VINDEX (NBYTES). */
2699
2700static struct Lisp_Vector *vector_free_lists[VECTOR_MAX_FREE_LIST_INDEX];
2701
2702/* Singly-linked list of large vectors. */
2703
914adc42 2704static struct large_vector *large_vectors;
f3372c87
DA
2705
2706/* The only vector with 0 slots, allocated from pure space. */
2707
9730daca 2708Lisp_Object zero_vector;
f3372c87 2709
3ab6e069
DA
2710/* Number of live vectors. */
2711
2712static EMACS_INT total_vectors;
2713
5b835e1d 2714/* Total size of live and free vectors, in Lisp_Object units. */
3ab6e069 2715
5b835e1d 2716static EMACS_INT total_vector_slots, total_free_vector_slots;
3ab6e069 2717
f3372c87
DA
2718/* Get a new vector block. */
2719
2720static struct vector_block *
2721allocate_vector_block (void)
2722{
38182d90 2723 struct vector_block *block = xmalloc (sizeof *block);
f3372c87
DA
2724
2725#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
2726 mem_insert (block->data, block->data + VECTOR_BLOCK_BYTES,
2727 MEM_TYPE_VECTOR_BLOCK);
2728#endif
2729
2730 block->next = vector_blocks;
2731 vector_blocks = block;
2732 return block;
2733}
2734
2735/* Called once to initialize vector allocation. */
2736
2737static void
2738init_vectors (void)
2739{
9730daca 2740 zero_vector = make_pure_vector (0);
f3372c87
DA
2741}
2742
2743/* Allocate vector from a vector block. */
2744
2745static struct Lisp_Vector *
2746allocate_vector_from_block (size_t nbytes)
2747{
914adc42 2748 struct Lisp_Vector *vector;
f3372c87
DA
2749 struct vector_block *block;
2750 size_t index, restbytes;
2751
2752 eassert (VBLOCK_BYTES_MIN <= nbytes && nbytes <= VBLOCK_BYTES_MAX);
2753 eassert (nbytes % roundup_size == 0);
2754
2755 /* First, try to allocate from a free list
2756 containing vectors of the requested size. */
2757 index = VINDEX (nbytes);
2758 if (vector_free_lists[index])
2759 {
2760 vector = vector_free_lists[index];
76ae24d7 2761 vector_free_lists[index] = next_in_free_list (vector);
5b835e1d 2762 total_free_vector_slots -= nbytes / word_size;
f3372c87
DA
2763 return vector;
2764 }
2765
2766 /* Next, check free lists containing larger vectors. Since
2767 we will split the result, we should have remaining space
2768 large enough to use for one-slot vector at least. */
2769 for (index = VINDEX (nbytes + VBLOCK_BYTES_MIN);
2770 index < VECTOR_MAX_FREE_LIST_INDEX; index++)
2771 if (vector_free_lists[index])
2772 {
2773 /* This vector is larger than requested. */
2774 vector = vector_free_lists[index];
76ae24d7 2775 vector_free_lists[index] = next_in_free_list (vector);
5b835e1d 2776 total_free_vector_slots -= nbytes / word_size;
f3372c87
DA
2777
2778 /* Excess bytes are used for the smaller vector,
2779 which should be set on an appropriate free list. */
2780 restbytes = index * roundup_size + VBLOCK_BYTES_MIN - nbytes;
2781 eassert (restbytes % roundup_size == 0);
914adc42 2782 SETUP_ON_FREE_LIST (ADVANCE (vector, nbytes), restbytes, index);
f3372c87
DA
2783 return vector;
2784 }
2785
2786 /* Finally, need a new vector block. */
2787 block = allocate_vector_block ();
2788
2789 /* New vector will be at the beginning of this block. */
2790 vector = (struct Lisp_Vector *) block->data;
f3372c87
DA
2791
2792 /* If the rest of space from this block is large enough
2793 for one-slot vector at least, set up it on a free list. */
2794 restbytes = VECTOR_BLOCK_BYTES - nbytes;
2795 if (restbytes >= VBLOCK_BYTES_MIN)
2796 {
2797 eassert (restbytes % roundup_size == 0);
914adc42 2798 SETUP_ON_FREE_LIST (ADVANCE (vector, nbytes), restbytes, index);
f3372c87
DA
2799 }
2800 return vector;
914adc42 2801}
f3372c87 2802
f3372c87
DA
2803/* Nonzero if VECTOR pointer is valid pointer inside BLOCK. */
2804
2805#define VECTOR_IN_BLOCK(vector, block) \
2806 ((char *) (vector) <= (block)->data \
2807 + VECTOR_BLOCK_BYTES - VBLOCK_BYTES_MIN)
2808
914adc42 2809/* Return the memory footprint of V in bytes. */
ee28be33 2810
914adc42
DA
2811static ptrdiff_t
2812vector_nbytes (struct Lisp_Vector *v)
2813{
2814 ptrdiff_t size = v->header.size & ~ARRAY_MARK_FLAG;
2815
2816 if (size & PSEUDOVECTOR_FLAG)
2817 {
2818 if (PSEUDOVECTOR_TYPEP (&v->header, PVEC_BOOL_VECTOR))
3e0b94e7
DC
2819 {
2820 struct Lisp_Bool_Vector *bv = (struct Lisp_Bool_Vector *) v;
2821 ptrdiff_t payload_bytes =
2822 bool_vector_payload_bytes (bv->size, NULL);
2823
2824 eassert_and_assume (payload_bytes >= 0);
2825 size = bool_header_size + ROUNDUP (payload_bytes, word_size);
2826 }
914adc42
DA
2827 else
2828 size = (header_size
2829 + ((size & PSEUDOVECTOR_SIZE_MASK)
2830 + ((size & PSEUDOVECTOR_REST_MASK)
2831 >> PSEUDOVECTOR_SIZE_BITS)) * word_size);
2832 }
2833 else
2834 size = header_size + size * word_size;
2835 return vroundup (size);
2836}
ee28be33 2837
f3372c87
DA
2838/* Reclaim space used by unmarked vectors. */
2839
2840static void
2841sweep_vectors (void)
2842{
1570ae92 2843 struct vector_block *block, **bprev = &vector_blocks;
914adc42
DA
2844 struct large_vector *lv, **lvprev = &large_vectors;
2845 struct Lisp_Vector *vector, *next;
f3372c87 2846
5b835e1d 2847 total_vectors = total_vector_slots = total_free_vector_slots = 0;
f3372c87
DA
2848 memset (vector_free_lists, 0, sizeof (vector_free_lists));
2849
2850 /* Looking through vector blocks. */
2851
2852 for (block = vector_blocks; block; block = *bprev)
2853 {
fce31d69 2854 bool free_this_block = 0;
914adc42 2855 ptrdiff_t nbytes;
f3372c87
DA
2856
2857 for (vector = (struct Lisp_Vector *) block->data;
2858 VECTOR_IN_BLOCK (vector, block); vector = next)
2859 {
2860 if (VECTOR_MARKED_P (vector))
2861 {
2862 VECTOR_UNMARK (vector);
3ab6e069 2863 total_vectors++;
914adc42
DA
2864 nbytes = vector_nbytes (vector);
2865 total_vector_slots += nbytes / word_size;
2866 next = ADVANCE (vector, nbytes);
f3372c87
DA
2867 }
2868 else
2869 {
914adc42 2870 ptrdiff_t total_bytes;
f3372c87 2871
914adc42
DA
2872 nbytes = vector_nbytes (vector);
2873 total_bytes = nbytes;
ee28be33 2874 next = ADVANCE (vector, nbytes);
f3372c87
DA
2875
2876 /* While NEXT is not marked, try to coalesce with VECTOR,
2877 thus making VECTOR of the largest possible size. */
2878
2879 while (VECTOR_IN_BLOCK (next, block))
2880 {
2881 if (VECTOR_MARKED_P (next))
2882 break;
914adc42 2883 nbytes = vector_nbytes (next);
ee28be33 2884 total_bytes += nbytes;
f3372c87
DA
2885 next = ADVANCE (next, nbytes);
2886 }
bfe3e0a2 2887
ee28be33 2888 eassert (total_bytes % roundup_size == 0);
f3372c87
DA
2889
2890 if (vector == (struct Lisp_Vector *) block->data
2891 && !VECTOR_IN_BLOCK (next, block))
2892 /* This block should be freed because all of it's
2893 space was coalesced into the only free vector. */
2894 free_this_block = 1;
2895 else
ee28be33
SM
2896 {
2897 int tmp;
2898 SETUP_ON_FREE_LIST (vector, total_bytes, tmp);
2899 }
f3372c87
DA
2900 }
2901 }
2902
2903 if (free_this_block)
2904 {
2905 *bprev = block->next;
2906#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
2907 mem_delete (mem_find (block->data));
2908#endif
2909 xfree (block);
2910 }
2911 else
2912 bprev = &block->next;
2913 }
2914
2915 /* Sweep large vectors. */
2916
914adc42 2917 for (lv = large_vectors; lv; lv = *lvprev)
f3372c87 2918 {
914adc42 2919 vector = &lv->v;
f3372c87
DA
2920 if (VECTOR_MARKED_P (vector))
2921 {
2922 VECTOR_UNMARK (vector);
3ab6e069 2923 total_vectors++;
169925ec
DA
2924 if (vector->header.size & PSEUDOVECTOR_FLAG)
2925 {
d06714cb
PE
2926 /* All non-bool pseudovectors are small enough to be allocated
2927 from vector blocks. This code should be redesigned if some
2928 pseudovector type grows beyond VBLOCK_BYTES_MAX. */
2929 eassert (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_BOOL_VECTOR));
3e0b94e7 2930 total_vector_slots += vector_nbytes (vector) / word_size;
169925ec
DA
2931 }
2932 else
5b835e1d
DA
2933 total_vector_slots
2934 += header_size / word_size + vector->header.size;
914adc42 2935 lvprev = &lv->next.vector;
f3372c87
DA
2936 }
2937 else
2938 {
914adc42
DA
2939 *lvprev = lv->next.vector;
2940 lisp_free (lv);
f3372c87
DA
2941 }
2942 }
2943}
2944
34400008
GM
2945/* Value is a pointer to a newly allocated Lisp_Vector structure
2946 with room for LEN Lisp_Objects. */
2947
ece93c02 2948static struct Lisp_Vector *
d311d28c 2949allocate_vectorlike (ptrdiff_t len)
1825c68d
KH
2950{
2951 struct Lisp_Vector *p;
2952
dafc79fa
SM
2953 MALLOC_BLOCK_INPUT;
2954
f3372c87 2955 if (len == 0)
9730daca 2956 p = XVECTOR (zero_vector);
d12e8f5a 2957 else
8bbbc977 2958 {
d12e8f5a 2959 size_t nbytes = header_size + len * word_size;
f3372c87 2960
d12e8f5a
DA
2961#ifdef DOUG_LEA_MALLOC
2962 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
2963 because mapped region contents are not preserved in
2964 a dumped Emacs. */
2965 mallopt (M_MMAP_MAX, 0);
2966#endif
f3372c87 2967
d12e8f5a
DA
2968 if (nbytes <= VBLOCK_BYTES_MAX)
2969 p = allocate_vector_from_block (vroundup (nbytes));
2970 else
2971 {
914adc42 2972 struct large_vector *lv
fbe9e0b9
PE
2973 = lisp_malloc ((offsetof (struct large_vector, v.contents)
2974 + len * word_size),
914adc42
DA
2975 MEM_TYPE_VECTORLIKE);
2976 lv->next.vector = large_vectors;
2977 large_vectors = lv;
2978 p = &lv->v;
d12e8f5a 2979 }
177c0ea7 2980
d1658221 2981#ifdef DOUG_LEA_MALLOC
d12e8f5a
DA
2982 /* Back to a reasonable maximum of mmap'ed areas. */
2983 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
d1658221 2984#endif
177c0ea7 2985
d12e8f5a
DA
2986 consing_since_gc += nbytes;
2987 vector_cells_consed += len;
2988 }
1825c68d 2989
dafc79fa 2990 MALLOC_UNBLOCK_INPUT;
e2984df0 2991
1825c68d
KH
2992 return p;
2993}
2994
34400008 2995
dd0b0efb 2996/* Allocate a vector with LEN slots. */
ece93c02
GM
2997
2998struct Lisp_Vector *
dd0b0efb 2999allocate_vector (EMACS_INT len)
ece93c02 3000{
dd0b0efb
PE
3001 struct Lisp_Vector *v;
3002 ptrdiff_t nbytes_max = min (PTRDIFF_MAX, SIZE_MAX);
3003
3004 if (min ((nbytes_max - header_size) / word_size, MOST_POSITIVE_FIXNUM) < len)
3005 memory_full (SIZE_MAX);
3006 v = allocate_vectorlike (len);
3007 v->header.size = len;
ece93c02
GM
3008 return v;
3009}
3010
3011
3012/* Allocate other vector-like structures. */
3013
30f95089 3014struct Lisp_Vector *
914adc42 3015allocate_pseudovector (int memlen, int lisplen, enum pvec_type tag)
ece93c02 3016{
d2029e5b 3017 struct Lisp_Vector *v = allocate_vectorlike (memlen);
e46bb31a 3018 int i;
177c0ea7 3019
914adc42
DA
3020 /* Catch bogus values. */
3021 eassert (tag <= PVEC_FONT);
3022 eassert (memlen - lisplen <= (1 << PSEUDOVECTOR_REST_BITS) - 1);
3023 eassert (lisplen <= (1 << PSEUDOVECTOR_SIZE_BITS) - 1);
3024
d2029e5b 3025 /* Only the first lisplen slots will be traced normally by the GC. */
d2029e5b 3026 for (i = 0; i < lisplen; ++i)
ece93c02 3027 v->contents[i] = Qnil;
177c0ea7 3028
914adc42 3029 XSETPVECTYPESIZE (v, tag, lisplen, memlen - lisplen);
d2029e5b
SM
3030 return v;
3031}
d2029e5b 3032
36429c89
DA
3033struct buffer *
3034allocate_buffer (void)
3035{
38182d90 3036 struct buffer *b = lisp_malloc (sizeof *b, MEM_TYPE_BUFFER);
36429c89 3037
914adc42 3038 BUFFER_PVEC_INIT (b);
c752cfa9 3039 /* Put B on the chain of all buffers including killed ones. */
914adc42 3040 b->next = all_buffers;
c752cfa9
DA
3041 all_buffers = b;
3042 /* Note that the rest fields of B are not initialized. */
36429c89
DA
3043 return b;
3044}
3045
ece93c02 3046struct Lisp_Hash_Table *
878f97ff 3047allocate_hash_table (void)
ece93c02 3048{
878f97ff 3049 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table, count, PVEC_HASH_TABLE);
ece93c02
GM
3050}
3051
ece93c02 3052struct window *
971de7fb 3053allocate_window (void)
ece93c02 3054{
62efea5e 3055 struct window *w;
177c0ea7 3056
62efea5e
DA
3057 w = ALLOCATE_PSEUDOVECTOR (struct window, current_matrix, PVEC_WINDOW);
3058 /* Users assumes that non-Lisp data is zeroed. */
3059 memset (&w->current_matrix, 0,
3060 sizeof (*w) - offsetof (struct window, current_matrix));
3061 return w;
3062}
177c0ea7 3063
4a729fd8 3064struct terminal *
971de7fb 3065allocate_terminal (void)
4a729fd8 3066{
62efea5e 3067 struct terminal *t;
ece93c02 3068
62efea5e
DA
3069 t = ALLOCATE_PSEUDOVECTOR (struct terminal, next_terminal, PVEC_TERMINAL);
3070 /* Users assumes that non-Lisp data is zeroed. */
3071 memset (&t->next_terminal, 0,
3072 sizeof (*t) - offsetof (struct terminal, next_terminal));
d2029e5b 3073 return t;
4a729fd8 3074}
ece93c02
GM
3075
3076struct frame *
971de7fb 3077allocate_frame (void)
ece93c02 3078{
62efea5e
DA
3079 struct frame *f;
3080
3081 f = ALLOCATE_PSEUDOVECTOR (struct frame, face_cache, PVEC_FRAME);
3082 /* Users assumes that non-Lisp data is zeroed. */
72af86bd 3083 memset (&f->face_cache, 0,
62efea5e 3084 sizeof (*f) - offsetof (struct frame, face_cache));
d2029e5b 3085 return f;
ece93c02
GM
3086}
3087
ece93c02 3088struct Lisp_Process *
971de7fb 3089allocate_process (void)
ece93c02 3090{
62efea5e 3091 struct Lisp_Process *p;
ece93c02 3092
62efea5e
DA
3093 p = ALLOCATE_PSEUDOVECTOR (struct Lisp_Process, pid, PVEC_PROCESS);
3094 /* Users assumes that non-Lisp data is zeroed. */
3095 memset (&p->pid, 0,
3096 sizeof (*p) - offsetof (struct Lisp_Process, pid));
3097 return p;
3098}
ece93c02 3099
a7ca3326 3100DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
a6266d23 3101 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
7ee72033 3102See also the function `vector'. */)
5842a27b 3103 (register Lisp_Object length, Lisp_Object init)
7146af97 3104{
1825c68d 3105 Lisp_Object vector;
d311d28c
PE
3106 register ptrdiff_t sizei;
3107 register ptrdiff_t i;
7146af97
JB
3108 register struct Lisp_Vector *p;
3109
b7826503 3110 CHECK_NATNUM (length);
7146af97 3111
d311d28c
PE
3112 p = allocate_vector (XFASTINT (length));
3113 sizei = XFASTINT (length);
ae35e756
PE
3114 for (i = 0; i < sizei; i++)
3115 p->contents[i] = init;
7146af97 3116
1825c68d 3117 XSETVECTOR (vector, p);
7146af97
JB
3118 return vector;
3119}
3120
34400008 3121
a7ca3326 3122DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
eae936e2 3123 doc: /* Return a newly created vector with specified arguments as elements.
ae8e8122
MB
3124Any number of arguments, even zero arguments, are allowed.
3125usage: (vector &rest OBJECTS) */)
f66c7cf8 3126 (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3127{
f66c7cf8 3128 ptrdiff_t i;
25721f5b
DA
3129 register Lisp_Object val = make_uninit_vector (nargs);
3130 register struct Lisp_Vector *p = XVECTOR (val);
7146af97 3131
ae35e756
PE
3132 for (i = 0; i < nargs; i++)
3133 p->contents[i] = args[i];
7146af97
JB
3134 return val;
3135}
3136
3017f87f
SM
3137void
3138make_byte_code (struct Lisp_Vector *v)
3139{
3140 if (v->header.size > 1 && STRINGP (v->contents[1])
3141 && STRING_MULTIBYTE (v->contents[1]))
3142 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
3143 earlier because they produced a raw 8-bit string for byte-code
3144 and now such a byte-code string is loaded as multibyte while
3145 raw 8-bit characters converted to multibyte form. Thus, now we
3146 must convert them back to the original unibyte form. */
3147 v->contents[1] = Fstring_as_unibyte (v->contents[1]);
3148 XSETPVECTYPE (v, PVEC_COMPILED);
3149}
34400008 3150
a7ca3326 3151DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
a6266d23 3152 doc: /* Create a byte-code object with specified arguments as elements.
e2abe5a1
SM
3153The arguments should be the ARGLIST, bytecode-string BYTE-CODE, constant
3154vector CONSTANTS, maximum stack size DEPTH, (optional) DOCSTRING,
3155and (optional) INTERACTIVE-SPEC.
228299fa 3156The first four arguments are required; at most six have any
ae8e8122 3157significance.
e2abe5a1
SM
3158The ARGLIST can be either like the one of `lambda', in which case the arguments
3159will be dynamically bound before executing the byte code, or it can be an
3160integer of the form NNNNNNNRMMMMMMM where the 7bit MMMMMMM specifies the
3161minimum number of arguments, the 7-bit NNNNNNN specifies the maximum number
3162of arguments (ignoring &rest) and the R bit specifies whether there is a &rest
3163argument to catch the left-over arguments. If such an integer is used, the
3164arguments will not be dynamically bound but will be instead pushed on the
3165stack before executing the byte-code.
92cc28b2 3166usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
f66c7cf8 3167 (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3168{
f66c7cf8 3169 ptrdiff_t i;
25721f5b
DA
3170 register Lisp_Object val = make_uninit_vector (nargs);
3171 register struct Lisp_Vector *p = XVECTOR (val);
7146af97 3172
12fbe755 3173 /* We used to purecopy everything here, if purify-flag was set. This worked
3017f87f
SM
3174 OK for Emacs-23, but with Emacs-24's lexical binding code, it can be
3175 dangerous, since make-byte-code is used during execution to build
3176 closures, so any closure built during the preload phase would end up
3177 copied into pure space, including its free variables, which is sometimes
3178 just wasteful and other times plainly wrong (e.g. those free vars may want
3179 to be setcar'd). */
9eac9d59 3180
ae35e756 3181 for (i = 0; i < nargs; i++)
3017f87f
SM
3182 p->contents[i] = args[i];
3183 make_byte_code (p);
876c194c 3184 XSETCOMPILED (val, p);
7146af97
JB
3185 return val;
3186}
2e471eb5 3187
34400008 3188
7146af97 3189\f
2e471eb5
GM
3190/***********************************************************************
3191 Symbol Allocation
3192 ***********************************************************************/
7146af97 3193
d55c12ed
AS
3194/* Like struct Lisp_Symbol, but padded so that the size is a multiple
3195 of the required alignment if LSB tags are used. */
3196
3197union aligned_Lisp_Symbol
3198{
3199 struct Lisp_Symbol s;
bfe3e0a2 3200#if USE_LSB_TAG
2b90362b
DA
3201 unsigned char c[(sizeof (struct Lisp_Symbol) + GCALIGNMENT - 1)
3202 & -GCALIGNMENT];
d55c12ed
AS
3203#endif
3204};
3205
2e471eb5
GM
3206/* Each symbol_block is just under 1020 bytes long, since malloc
3207 really allocates in units of powers of two and uses 4 bytes for its
3017f87f 3208 own overhead. */
7146af97
JB
3209
3210#define SYMBOL_BLOCK_SIZE \
d55c12ed 3211 ((1020 - sizeof (struct symbol_block *)) / sizeof (union aligned_Lisp_Symbol))
7146af97
JB
3212
3213struct symbol_block
2e471eb5 3214{
6b61353c 3215 /* Place `symbols' first, to preserve alignment. */
d55c12ed 3216 union aligned_Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
6b61353c 3217 struct symbol_block *next;
2e471eb5 3218};
7146af97 3219
34400008
GM
3220/* Current symbol block and index of first unused Lisp_Symbol
3221 structure in it. */
3222
d3d47262 3223static struct symbol_block *symbol_block;
fff62aa9 3224static int symbol_block_index = SYMBOL_BLOCK_SIZE;
7146af97 3225
34400008
GM
3226/* List of free symbols. */
3227
d3d47262 3228static struct Lisp_Symbol *symbol_free_list;
7146af97 3229
84575e67
PE
3230static void
3231set_symbol_name (Lisp_Object sym, Lisp_Object name)
3232{
3233 XSYMBOL (sym)->name = name;
3234}
3235
a7ca3326 3236DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
a6266d23 3237 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
eadf1faa 3238Its value is void, and its function definition and property list are nil. */)
5842a27b 3239 (Lisp_Object name)
7146af97
JB
3240{
3241 register Lisp_Object val;
3242 register struct Lisp_Symbol *p;
3243
b7826503 3244 CHECK_STRING (name);
7146af97 3245
dafc79fa 3246 MALLOC_BLOCK_INPUT;
e2984df0 3247
7146af97
JB
3248 if (symbol_free_list)
3249 {
45d12a89 3250 XSETSYMBOL (val, symbol_free_list);
28a099a4 3251 symbol_free_list = symbol_free_list->next;
7146af97
JB
3252 }
3253 else
3254 {
3255 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
3256 {
38182d90
PE
3257 struct symbol_block *new
3258 = lisp_malloc (sizeof *new, MEM_TYPE_SYMBOL);
7146af97
JB
3259 new->next = symbol_block;
3260 symbol_block = new;
3261 symbol_block_index = 0;
3900d5de 3262 total_free_symbols += SYMBOL_BLOCK_SIZE;
7146af97 3263 }
d55c12ed 3264 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index].s);
6b61353c 3265 symbol_block_index++;
7146af97 3266 }
177c0ea7 3267
dafc79fa 3268 MALLOC_UNBLOCK_INPUT;
e2984df0 3269
7146af97 3270 p = XSYMBOL (val);
c644523b
DA
3271 set_symbol_name (val, name);
3272 set_symbol_plist (val, Qnil);
ce5b453a
SM
3273 p->redirect = SYMBOL_PLAINVAL;
3274 SET_SYMBOL_VAL (p, Qunbound);
eadf1faa 3275 set_symbol_function (val, Qnil);
c644523b 3276 set_symbol_next (val, NULL);
2336fe58 3277 p->gcmarkbit = 0;
9e713715
GM
3278 p->interned = SYMBOL_UNINTERNED;
3279 p->constant = 0;
b9598260 3280 p->declared_special = 0;
2e471eb5
GM
3281 consing_since_gc += sizeof (struct Lisp_Symbol);
3282 symbols_consed++;
3900d5de 3283 total_free_symbols--;
7146af97
JB
3284 return val;
3285}
3286
3f25e183 3287
2e471eb5
GM
3288\f
3289/***********************************************************************
34400008 3290 Marker (Misc) Allocation
2e471eb5 3291 ***********************************************************************/
3f25e183 3292
d55c12ed
AS
3293/* Like union Lisp_Misc, but padded so that its size is a multiple of
3294 the required alignment when LSB tags are used. */
3295
3296union aligned_Lisp_Misc
3297{
3298 union Lisp_Misc m;
bfe3e0a2 3299#if USE_LSB_TAG
2b90362b
DA
3300 unsigned char c[(sizeof (union Lisp_Misc) + GCALIGNMENT - 1)
3301 & -GCALIGNMENT];
d55c12ed
AS
3302#endif
3303};
3304
2e471eb5
GM
3305/* Allocation of markers and other objects that share that structure.
3306 Works like allocation of conses. */
c0696668 3307
2e471eb5 3308#define MARKER_BLOCK_SIZE \
d55c12ed 3309 ((1020 - sizeof (struct marker_block *)) / sizeof (union aligned_Lisp_Misc))
2e471eb5
GM
3310
3311struct marker_block
c0696668 3312{
6b61353c 3313 /* Place `markers' first, to preserve alignment. */
d55c12ed 3314 union aligned_Lisp_Misc markers[MARKER_BLOCK_SIZE];
6b61353c 3315 struct marker_block *next;
2e471eb5 3316};
c0696668 3317
d3d47262 3318static struct marker_block *marker_block;
fff62aa9 3319static int marker_block_index = MARKER_BLOCK_SIZE;
c0696668 3320
d3d47262 3321static union Lisp_Misc *marker_free_list;
c0696668 3322
d7a7fda3 3323/* Return a newly allocated Lisp_Misc object of specified TYPE. */
2e471eb5 3324
1b971ac1 3325static Lisp_Object
d7a7fda3 3326allocate_misc (enum Lisp_Misc_Type type)
7146af97 3327{
2e471eb5 3328 Lisp_Object val;
7146af97 3329
dafc79fa 3330 MALLOC_BLOCK_INPUT;
cfb2f32e 3331
2e471eb5 3332 if (marker_free_list)
7146af97 3333 {
2e471eb5
GM
3334 XSETMISC (val, marker_free_list);
3335 marker_free_list = marker_free_list->u_free.chain;
7146af97
JB
3336 }
3337 else
7146af97 3338 {
2e471eb5
GM
3339 if (marker_block_index == MARKER_BLOCK_SIZE)
3340 {
38182d90 3341 struct marker_block *new = lisp_malloc (sizeof *new, MEM_TYPE_MISC);
2e471eb5
GM
3342 new->next = marker_block;
3343 marker_block = new;
3344 marker_block_index = 0;
7b7990cc 3345 total_free_markers += MARKER_BLOCK_SIZE;
2e471eb5 3346 }
d55c12ed 3347 XSETMISC (val, &marker_block->markers[marker_block_index].m);
6b61353c 3348 marker_block_index++;
7146af97 3349 }
177c0ea7 3350
dafc79fa 3351 MALLOC_UNBLOCK_INPUT;
e2984df0 3352
7b7990cc 3353 --total_free_markers;
2e471eb5
GM
3354 consing_since_gc += sizeof (union Lisp_Misc);
3355 misc_objects_consed++;
84575e67 3356 XMISCANY (val)->type = type;
67ee9f6e 3357 XMISCANY (val)->gcmarkbit = 0;
2e471eb5
GM
3358 return val;
3359}
3360
73ebd38f 3361/* Free a Lisp_Misc object. */
7b7990cc 3362
73ebd38f 3363void
971de7fb 3364free_misc (Lisp_Object misc)
7b7990cc 3365{
84575e67 3366 XMISCANY (misc)->type = Lisp_Misc_Free;
7b7990cc
KS
3367 XMISC (misc)->u_free.chain = marker_free_list;
3368 marker_free_list = XMISC (misc);
0dd6d66d 3369 consing_since_gc -= sizeof (union Lisp_Misc);
7b7990cc
KS
3370 total_free_markers++;
3371}
3372
7b1123d8
PE
3373/* Verify properties of Lisp_Save_Value's representation
3374 that are assumed here and elsewhere. */
3375
3376verify (SAVE_UNUSED == 0);
52a9bcae
PE
3377verify (((SAVE_INTEGER | SAVE_POINTER | SAVE_FUNCPOINTER | SAVE_OBJECT)
3378 >> SAVE_SLOT_BITS)
3379 == 0);
7b1123d8 3380
1396ac86
PE
3381/* Return Lisp_Save_Value objects for the various combinations
3382 that callers need. */
1b971ac1
DA
3383
3384Lisp_Object
1396ac86 3385make_save_int_int_int (ptrdiff_t a, ptrdiff_t b, ptrdiff_t c)
1b971ac1 3386{
1b971ac1
DA
3387 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3388 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1396ac86
PE
3389 p->save_type = SAVE_TYPE_INT_INT_INT;
3390 p->data[0].integer = a;
3391 p->data[1].integer = b;
3392 p->data[2].integer = c;
3393 return val;
3394}
1b971ac1 3395
1396ac86
PE
3396Lisp_Object
3397make_save_obj_obj_obj_obj (Lisp_Object a, Lisp_Object b, Lisp_Object c,
3398 Lisp_Object d)
3399{
3400 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3401 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3402 p->save_type = SAVE_TYPE_OBJ_OBJ_OBJ_OBJ;
3403 p->data[0].object = a;
3404 p->data[1].object = b;
3405 p->data[2].object = c;
3406 p->data[3].object = d;
3407 return val;
3408}
1b971ac1 3409
198fa217 3410#if defined HAVE_NS || defined HAVE_NTGUI
1396ac86
PE
3411Lisp_Object
3412make_save_ptr (void *a)
3413{
3414 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3415 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3416 p->save_type = SAVE_POINTER;
3417 p->data[0].pointer = a;
3418 return val;
3419}
3420#endif
7b1123d8 3421
1396ac86
PE
3422Lisp_Object
3423make_save_ptr_int (void *a, ptrdiff_t b)
3424{
3425 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3426 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3427 p->save_type = SAVE_TYPE_PTR_INT;
3428 p->data[0].pointer = a;
3429 p->data[1].integer = b;
3430 return val;
3431}
1b971ac1 3432
f4e891b5
PE
3433#if defined HAVE_MENUS && ! (defined USE_X_TOOLKIT || defined USE_GTK)
3434Lisp_Object
3435make_save_ptr_ptr (void *a, void *b)
3436{
3437 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3438 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3439 p->save_type = SAVE_TYPE_PTR_PTR;
3440 p->data[0].pointer = a;
3441 p->data[1].pointer = b;
3442 return val;
3443}
3444#endif
3445
1396ac86
PE
3446Lisp_Object
3447make_save_funcptr_ptr_obj (void (*a) (void), void *b, Lisp_Object c)
3448{
3449 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3450 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3451 p->save_type = SAVE_TYPE_FUNCPTR_PTR_OBJ;
3452 p->data[0].funcpointer = a;
3453 p->data[1].pointer = b;
3454 p->data[2].object = c;
1b971ac1
DA
3455 return val;
3456}
3457
1396ac86
PE
3458/* Return a Lisp_Save_Value object that represents an array A
3459 of N Lisp objects. */
42172a6b
RS
3460
3461Lisp_Object
1396ac86 3462make_save_memory (Lisp_Object *a, ptrdiff_t n)
42172a6b 3463{
468afbac
DA
3464 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3465 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1396ac86
PE
3466 p->save_type = SAVE_TYPE_MEMORY;
3467 p->data[0].pointer = a;
3468 p->data[1].integer = n;
468afbac 3469 return val;
42172a6b
RS
3470}
3471
73ebd38f
DA
3472/* Free a Lisp_Save_Value object. Do not use this function
3473 if SAVE contains pointer other than returned by xmalloc. */
62c2e5ed 3474
27e498e6 3475void
62c2e5ed
DA
3476free_save_value (Lisp_Object save)
3477{
2b30549c 3478 xfree (XSAVE_POINTER (save, 0));
62c2e5ed
DA
3479 free_misc (save);
3480}
3481
d7a7fda3
DA
3482/* Return a Lisp_Misc_Overlay object with specified START, END and PLIST. */
3483
3484Lisp_Object
3485build_overlay (Lisp_Object start, Lisp_Object end, Lisp_Object plist)
3486{
3487 register Lisp_Object overlay;
3488
3489 overlay = allocate_misc (Lisp_Misc_Overlay);
3490 OVERLAY_START (overlay) = start;
3491 OVERLAY_END (overlay) = end;
c644523b 3492 set_overlay_plist (overlay, plist);
d7a7fda3
DA
3493 XOVERLAY (overlay)->next = NULL;
3494 return overlay;
3495}
3496
a7ca3326 3497DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
a6266d23 3498 doc: /* Return a newly allocated marker which does not point at any place. */)
5842a27b 3499 (void)
2e471eb5 3500{
eeaea515
DA
3501 register Lisp_Object val;
3502 register struct Lisp_Marker *p;
7146af97 3503
eeaea515
DA
3504 val = allocate_misc (Lisp_Misc_Marker);
3505 p = XMARKER (val);
3506 p->buffer = 0;
3507 p->bytepos = 0;
3508 p->charpos = 0;
3509 p->next = NULL;
3510 p->insertion_type = 0;
101ed2bb 3511 p->need_adjustment = 0;
eeaea515 3512 return val;
7146af97 3513}
2e471eb5 3514
657924ff
DA
3515/* Return a newly allocated marker which points into BUF
3516 at character position CHARPOS and byte position BYTEPOS. */
3517
3518Lisp_Object
3519build_marker (struct buffer *buf, ptrdiff_t charpos, ptrdiff_t bytepos)
3520{
eeaea515
DA
3521 Lisp_Object obj;
3522 struct Lisp_Marker *m;
657924ff
DA
3523
3524 /* No dead buffers here. */
e578f381 3525 eassert (BUFFER_LIVE_P (buf));
657924ff 3526
eeaea515
DA
3527 /* Every character is at least one byte. */
3528 eassert (charpos <= bytepos);
3529
3530 obj = allocate_misc (Lisp_Misc_Marker);
3531 m = XMARKER (obj);
3532 m->buffer = buf;
3533 m->charpos = charpos;
3534 m->bytepos = bytepos;
3535 m->insertion_type = 0;
101ed2bb 3536 m->need_adjustment = 0;
eeaea515
DA
3537 m->next = BUF_MARKERS (buf);
3538 BUF_MARKERS (buf) = m;
3539 return obj;
657924ff
DA
3540}
3541
2e471eb5
GM
3542/* Put MARKER back on the free list after using it temporarily. */
3543
3544void
971de7fb 3545free_marker (Lisp_Object marker)
2e471eb5 3546{
ef89c2ce 3547 unchain_marker (XMARKER (marker));
7b7990cc 3548 free_misc (marker);
2e471eb5
GM
3549}
3550
c0696668 3551\f
7146af97 3552/* Return a newly created vector or string with specified arguments as
736471d1
RS
3553 elements. If all the arguments are characters that can fit
3554 in a string of events, make a string; otherwise, make a vector.
3555
3556 Any number of arguments, even zero arguments, are allowed. */
7146af97
JB
3557
3558Lisp_Object
0c90b9ee 3559make_event_array (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3560{
0c90b9ee 3561 ptrdiff_t i;
7146af97
JB
3562
3563 for (i = 0; i < nargs; i++)
736471d1 3564 /* The things that fit in a string
c9ca4659
RS
3565 are characters that are in 0...127,
3566 after discarding the meta bit and all the bits above it. */
e687453f 3567 if (!INTEGERP (args[i])
c11285dc 3568 || (XINT (args[i]) & ~(-CHAR_META)) >= 0200)
7146af97
JB
3569 return Fvector (nargs, args);
3570
3571 /* Since the loop exited, we know that all the things in it are
3572 characters, so we can make a string. */
3573 {
c13ccad2 3574 Lisp_Object result;
177c0ea7 3575
50aee051 3576 result = Fmake_string (make_number (nargs), make_number (0));
7146af97 3577 for (i = 0; i < nargs; i++)
736471d1 3578 {
46e7e6b0 3579 SSET (result, i, XINT (args[i]));
736471d1
RS
3580 /* Move the meta bit to the right place for a string char. */
3581 if (XINT (args[i]) & CHAR_META)
46e7e6b0 3582 SSET (result, i, SREF (result, i) | 0x80);
736471d1 3583 }
177c0ea7 3584
7146af97
JB
3585 return result;
3586 }
3587}
2e471eb5
GM
3588
3589
7146af97 3590\f
24d8a105
RS
3591/************************************************************************
3592 Memory Full Handling
3593 ************************************************************************/
3594
3595
531b0165
PE
3596/* Called if malloc (NBYTES) returns zero. If NBYTES == SIZE_MAX,
3597 there may have been size_t overflow so that malloc was never
3598 called, or perhaps malloc was invoked successfully but the
3599 resulting pointer had problems fitting into a tagged EMACS_INT. In
3600 either case this counts as memory being full even though malloc did
3601 not fail. */
24d8a105
RS
3602
3603void
531b0165 3604memory_full (size_t nbytes)
24d8a105 3605{
531b0165 3606 /* Do not go into hysterics merely because a large request failed. */
fce31d69 3607 bool enough_free_memory = 0;
2b6148e4 3608 if (SPARE_MEMORY < nbytes)
531b0165 3609 {
66606eea
PE
3610 void *p;
3611
3612 MALLOC_BLOCK_INPUT;
3613 p = malloc (SPARE_MEMORY);
531b0165
PE
3614 if (p)
3615 {
4d09bcf6 3616 free (p);
531b0165
PE
3617 enough_free_memory = 1;
3618 }
66606eea 3619 MALLOC_UNBLOCK_INPUT;
531b0165 3620 }
24d8a105 3621
531b0165
PE
3622 if (! enough_free_memory)
3623 {
3624 int i;
24d8a105 3625
531b0165
PE
3626 Vmemory_full = Qt;
3627
3628 memory_full_cons_threshold = sizeof (struct cons_block);
3629
3630 /* The first time we get here, free the spare memory. */
3631 for (i = 0; i < sizeof (spare_memory) / sizeof (char *); i++)
3632 if (spare_memory[i])
3633 {
3634 if (i == 0)
3635 free (spare_memory[i]);
3636 else if (i >= 1 && i <= 4)
3637 lisp_align_free (spare_memory[i]);
3638 else
3639 lisp_free (spare_memory[i]);
3640 spare_memory[i] = 0;
3641 }
531b0165 3642 }
24d8a105
RS
3643
3644 /* This used to call error, but if we've run out of memory, we could
3645 get infinite recursion trying to build the string. */
9b306d37 3646 xsignal (Qnil, Vmemory_signal_data);
24d8a105
RS
3647}
3648
3649/* If we released our reserve (due to running out of memory),
3650 and we have a fair amount free once again,
3651 try to set aside another reserve in case we run out once more.
3652
3653 This is called when a relocatable block is freed in ralloc.c,
3654 and also directly from this file, in case we're not using ralloc.c. */
3655
3656void
971de7fb 3657refill_memory_reserve (void)
24d8a105
RS
3658{
3659#ifndef SYSTEM_MALLOC
3660 if (spare_memory[0] == 0)
38182d90 3661 spare_memory[0] = malloc (SPARE_MEMORY);
24d8a105 3662 if (spare_memory[1] == 0)
38182d90 3663 spare_memory[1] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3664 MEM_TYPE_SPARE);
24d8a105 3665 if (spare_memory[2] == 0)
38182d90 3666 spare_memory[2] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3667 MEM_TYPE_SPARE);
24d8a105 3668 if (spare_memory[3] == 0)
38182d90 3669 spare_memory[3] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3670 MEM_TYPE_SPARE);
24d8a105 3671 if (spare_memory[4] == 0)
38182d90 3672 spare_memory[4] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3673 MEM_TYPE_SPARE);
24d8a105 3674 if (spare_memory[5] == 0)
38182d90 3675 spare_memory[5] = lisp_malloc (sizeof (struct string_block),
35aaa1ea 3676 MEM_TYPE_SPARE);
24d8a105 3677 if (spare_memory[6] == 0)
38182d90 3678 spare_memory[6] = lisp_malloc (sizeof (struct string_block),
35aaa1ea 3679 MEM_TYPE_SPARE);
24d8a105
RS
3680 if (spare_memory[0] && spare_memory[1] && spare_memory[5])
3681 Vmemory_full = Qnil;
3682#endif
3683}
3684\f
34400008
GM
3685/************************************************************************
3686 C Stack Marking
3687 ************************************************************************/
3688
13c844fb
GM
3689#if GC_MARK_STACK || defined GC_MALLOC_CHECK
3690
71cf5fa0
GM
3691/* Conservative C stack marking requires a method to identify possibly
3692 live Lisp objects given a pointer value. We do this by keeping
3693 track of blocks of Lisp data that are allocated in a red-black tree
3694 (see also the comment of mem_node which is the type of nodes in
3695 that tree). Function lisp_malloc adds information for an allocated
3696 block to the red-black tree with calls to mem_insert, and function
3697 lisp_free removes it with mem_delete. Functions live_string_p etc
3698 call mem_find to lookup information about a given pointer in the
3699 tree, and use that to determine if the pointer points to a Lisp
3700 object or not. */
3701
34400008
GM
3702/* Initialize this part of alloc.c. */
3703
3704static void
971de7fb 3705mem_init (void)
34400008
GM
3706{
3707 mem_z.left = mem_z.right = MEM_NIL;
3708 mem_z.parent = NULL;
3709 mem_z.color = MEM_BLACK;
3710 mem_z.start = mem_z.end = NULL;
3711 mem_root = MEM_NIL;
3712}
3713
3714
3715/* Value is a pointer to the mem_node containing START. Value is
3716 MEM_NIL if there is no node in the tree containing START. */
3717
b0ab8123 3718static struct mem_node *
971de7fb 3719mem_find (void *start)
34400008
GM
3720{
3721 struct mem_node *p;
3722
ece93c02
GM
3723 if (start < min_heap_address || start > max_heap_address)
3724 return MEM_NIL;
3725
34400008
GM
3726 /* Make the search always successful to speed up the loop below. */
3727 mem_z.start = start;
3728 mem_z.end = (char *) start + 1;
3729
3730 p = mem_root;
3731 while (start < p->start || start >= p->end)
3732 p = start < p->start ? p->left : p->right;
3733 return p;
3734}
3735
3736
3737/* Insert a new node into the tree for a block of memory with start
3738 address START, end address END, and type TYPE. Value is a
3739 pointer to the node that was inserted. */
3740
3741static struct mem_node *
971de7fb 3742mem_insert (void *start, void *end, enum mem_type type)
34400008
GM
3743{
3744 struct mem_node *c, *parent, *x;
3745
add3c3ea 3746 if (min_heap_address == NULL || start < min_heap_address)
ece93c02 3747 min_heap_address = start;
add3c3ea 3748 if (max_heap_address == NULL || end > max_heap_address)
ece93c02
GM
3749 max_heap_address = end;
3750
34400008
GM
3751 /* See where in the tree a node for START belongs. In this
3752 particular application, it shouldn't happen that a node is already
3753 present. For debugging purposes, let's check that. */
3754 c = mem_root;
3755 parent = NULL;
3756
3757#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
177c0ea7 3758
34400008
GM
3759 while (c != MEM_NIL)
3760 {
3761 if (start >= c->start && start < c->end)
1088b922 3762 emacs_abort ();
34400008
GM
3763 parent = c;
3764 c = start < c->start ? c->left : c->right;
3765 }
177c0ea7 3766
34400008 3767#else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
177c0ea7 3768
34400008
GM
3769 while (c != MEM_NIL)
3770 {
3771 parent = c;
3772 c = start < c->start ? c->left : c->right;
3773 }
177c0ea7 3774
34400008
GM
3775#endif /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
3776
3777 /* Create a new node. */
877935b1 3778#ifdef GC_MALLOC_CHECK
0caaedb1 3779 x = malloc (sizeof *x);
877935b1 3780 if (x == NULL)
1088b922 3781 emacs_abort ();
877935b1 3782#else
23f86fce 3783 x = xmalloc (sizeof *x);
877935b1 3784#endif
34400008
GM
3785 x->start = start;
3786 x->end = end;
3787 x->type = type;
3788 x->parent = parent;
3789 x->left = x->right = MEM_NIL;
3790 x->color = MEM_RED;
3791
3792 /* Insert it as child of PARENT or install it as root. */
3793 if (parent)
3794 {
3795 if (start < parent->start)
3796 parent->left = x;
3797 else
3798 parent->right = x;
3799 }
177c0ea7 3800 else
34400008
GM
3801 mem_root = x;
3802
3803 /* Re-establish red-black tree properties. */
3804 mem_insert_fixup (x);
877935b1 3805
34400008
GM
3806 return x;
3807}
3808
3809
3810/* Re-establish the red-black properties of the tree, and thereby
3811 balance the tree, after node X has been inserted; X is always red. */
3812
3813static void
971de7fb 3814mem_insert_fixup (struct mem_node *x)
34400008
GM
3815{
3816 while (x != mem_root && x->parent->color == MEM_RED)
3817 {
3818 /* X is red and its parent is red. This is a violation of
3819 red-black tree property #3. */
177c0ea7 3820
34400008
GM
3821 if (x->parent == x->parent->parent->left)
3822 {
3823 /* We're on the left side of our grandparent, and Y is our
3824 "uncle". */
3825 struct mem_node *y = x->parent->parent->right;
177c0ea7 3826
34400008
GM
3827 if (y->color == MEM_RED)
3828 {
3829 /* Uncle and parent are red but should be black because
3830 X is red. Change the colors accordingly and proceed
3831 with the grandparent. */
3832 x->parent->color = MEM_BLACK;
3833 y->color = MEM_BLACK;
3834 x->parent->parent->color = MEM_RED;
3835 x = x->parent->parent;
3836 }
3837 else
3838 {
3839 /* Parent and uncle have different colors; parent is
3840 red, uncle is black. */
3841 if (x == x->parent->right)
3842 {
3843 x = x->parent;
3844 mem_rotate_left (x);
3845 }
3846
3847 x->parent->color = MEM_BLACK;
3848 x->parent->parent->color = MEM_RED;
3849 mem_rotate_right (x->parent->parent);
3850 }
3851 }
3852 else
3853 {
3854 /* This is the symmetrical case of above. */
3855 struct mem_node *y = x->parent->parent->left;
177c0ea7 3856
34400008
GM
3857 if (y->color == MEM_RED)
3858 {
3859 x->parent->color = MEM_BLACK;
3860 y->color = MEM_BLACK;
3861 x->parent->parent->color = MEM_RED;
3862 x = x->parent->parent;
3863 }
3864 else
3865 {
3866 if (x == x->parent->left)
3867 {
3868 x = x->parent;
3869 mem_rotate_right (x);
3870 }
177c0ea7 3871
34400008
GM
3872 x->parent->color = MEM_BLACK;
3873 x->parent->parent->color = MEM_RED;
3874 mem_rotate_left (x->parent->parent);
3875 }
3876 }
3877 }
3878
3879 /* The root may have been changed to red due to the algorithm. Set
3880 it to black so that property #5 is satisfied. */
3881 mem_root->color = MEM_BLACK;
3882}
3883
3884
177c0ea7
JB
3885/* (x) (y)
3886 / \ / \
34400008
GM
3887 a (y) ===> (x) c
3888 / \ / \
3889 b c a b */
3890
3891static void
971de7fb 3892mem_rotate_left (struct mem_node *x)
34400008
GM
3893{
3894 struct mem_node *y;
3895
3896 /* Turn y's left sub-tree into x's right sub-tree. */
3897 y = x->right;
3898 x->right = y->left;
3899 if (y->left != MEM_NIL)
3900 y->left->parent = x;
3901
3902 /* Y's parent was x's parent. */
3903 if (y != MEM_NIL)
3904 y->parent = x->parent;
3905
3906 /* Get the parent to point to y instead of x. */
3907 if (x->parent)
3908 {
3909 if (x == x->parent->left)
3910 x->parent->left = y;
3911 else
3912 x->parent->right = y;
3913 }
3914 else
3915 mem_root = y;
3916
3917 /* Put x on y's left. */
3918 y->left = x;
3919 if (x != MEM_NIL)
3920 x->parent = y;
3921}
3922
3923
177c0ea7
JB
3924/* (x) (Y)
3925 / \ / \
3926 (y) c ===> a (x)
3927 / \ / \
34400008
GM
3928 a b b c */
3929
3930static void
971de7fb 3931mem_rotate_right (struct mem_node *x)
34400008
GM
3932{
3933 struct mem_node *y = x->left;
3934
3935 x->left = y->right;
3936 if (y->right != MEM_NIL)
3937 y->right->parent = x;
177c0ea7 3938
34400008
GM
3939 if (y != MEM_NIL)
3940 y->parent = x->parent;
3941 if (x->parent)
3942 {
3943 if (x == x->parent->right)
3944 x->parent->right = y;
3945 else
3946 x->parent->left = y;
3947 }
3948 else
3949 mem_root = y;
177c0ea7 3950
34400008
GM
3951 y->right = x;
3952 if (x != MEM_NIL)
3953 x->parent = y;
3954}
3955
3956
3957/* Delete node Z from the tree. If Z is null or MEM_NIL, do nothing. */
3958
3959static void
971de7fb 3960mem_delete (struct mem_node *z)
34400008
GM
3961{
3962 struct mem_node *x, *y;
3963
3964 if (!z || z == MEM_NIL)
3965 return;
3966
3967 if (z->left == MEM_NIL || z->right == MEM_NIL)
3968 y = z;
3969 else
3970 {
3971 y = z->right;
3972 while (y->left != MEM_NIL)
3973 y = y->left;
3974 }
3975
3976 if (y->left != MEM_NIL)
3977 x = y->left;
3978 else
3979 x = y->right;
3980
3981 x->parent = y->parent;
3982 if (y->parent)
3983 {
3984 if (y == y->parent->left)
3985 y->parent->left = x;
3986 else
3987 y->parent->right = x;
3988 }
3989 else
3990 mem_root = x;
3991
3992 if (y != z)
3993 {
3994 z->start = y->start;
3995 z->end = y->end;
3996 z->type = y->type;
3997 }
177c0ea7 3998
34400008
GM
3999 if (y->color == MEM_BLACK)
4000 mem_delete_fixup (x);
877935b1
GM
4001
4002#ifdef GC_MALLOC_CHECK
0caaedb1 4003 free (y);
877935b1 4004#else
34400008 4005 xfree (y);
877935b1 4006#endif
34400008
GM
4007}
4008
4009
4010/* Re-establish the red-black properties of the tree, after a
4011 deletion. */
4012
4013static void
971de7fb 4014mem_delete_fixup (struct mem_node *x)
34400008
GM
4015{
4016 while (x != mem_root && x->color == MEM_BLACK)
4017 {
4018 if (x == x->parent->left)
4019 {
4020 struct mem_node *w = x->parent->right;
177c0ea7 4021
34400008
GM
4022 if (w->color == MEM_RED)
4023 {
4024 w->color = MEM_BLACK;
4025 x->parent->color = MEM_RED;
4026 mem_rotate_left (x->parent);
4027 w = x->parent->right;
4028 }
177c0ea7 4029
34400008
GM
4030 if (w->left->color == MEM_BLACK && w->right->color == MEM_BLACK)
4031 {
4032 w->color = MEM_RED;
4033 x = x->parent;
4034 }
4035 else
4036 {
4037 if (w->right->color == MEM_BLACK)
4038 {
4039 w->left->color = MEM_BLACK;
4040 w->color = MEM_RED;
4041 mem_rotate_right (w);
4042 w = x->parent->right;
4043 }
4044 w->color = x->parent->color;
4045 x->parent->color = MEM_BLACK;
4046 w->right->color = MEM_BLACK;
4047 mem_rotate_left (x->parent);
4048 x = mem_root;
4049 }
4050 }
4051 else
4052 {
4053 struct mem_node *w = x->parent->left;
177c0ea7 4054
34400008
GM
4055 if (w->color == MEM_RED)
4056 {
4057 w->color = MEM_BLACK;
4058 x->parent->color = MEM_RED;
4059 mem_rotate_right (x->parent);
4060 w = x->parent->left;
4061 }
177c0ea7 4062
34400008
GM
4063 if (w->right->color == MEM_BLACK && w->left->color == MEM_BLACK)
4064 {
4065 w->color = MEM_RED;
4066 x = x->parent;
4067 }
4068 else
4069 {
4070 if (w->left->color == MEM_BLACK)
4071 {
4072 w->right->color = MEM_BLACK;
4073 w->color = MEM_RED;
4074 mem_rotate_left (w);
4075 w = x->parent->left;
4076 }
177c0ea7 4077
34400008
GM
4078 w->color = x->parent->color;
4079 x->parent->color = MEM_BLACK;
4080 w->left->color = MEM_BLACK;
4081 mem_rotate_right (x->parent);
4082 x = mem_root;
4083 }
4084 }
4085 }
177c0ea7 4086
34400008
GM
4087 x->color = MEM_BLACK;
4088}
4089
4090
4091/* Value is non-zero if P is a pointer to a live Lisp string on
4092 the heap. M is a pointer to the mem_block for P. */
4093
b0ab8123 4094static bool
971de7fb 4095live_string_p (struct mem_node *m, void *p)
34400008
GM
4096{
4097 if (m->type == MEM_TYPE_STRING)
4098 {
7d652d97 4099 struct string_block *b = m->start;
14162469 4100 ptrdiff_t offset = (char *) p - (char *) &b->strings[0];
34400008
GM
4101
4102 /* P must point to the start of a Lisp_String structure, and it
4103 must not be on the free-list. */
176bc847
GM
4104 return (offset >= 0
4105 && offset % sizeof b->strings[0] == 0
6b61353c 4106 && offset < (STRING_BLOCK_SIZE * sizeof b->strings[0])
34400008
GM
4107 && ((struct Lisp_String *) p)->data != NULL);
4108 }
4109 else
4110 return 0;
4111}
4112
4113
4114/* Value is non-zero if P is a pointer to a live Lisp cons on
4115 the heap. M is a pointer to the mem_block for P. */
4116
b0ab8123 4117static bool
971de7fb 4118live_cons_p (struct mem_node *m, void *p)
34400008
GM
4119{
4120 if (m->type == MEM_TYPE_CONS)
4121 {
7d652d97 4122 struct cons_block *b = m->start;
14162469 4123 ptrdiff_t offset = (char *) p - (char *) &b->conses[0];
34400008
GM
4124
4125 /* P must point to the start of a Lisp_Cons, not be
4126 one of the unused cells in the current cons block,
4127 and not be on the free-list. */
176bc847
GM
4128 return (offset >= 0
4129 && offset % sizeof b->conses[0] == 0
6b61353c 4130 && offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
34400008
GM
4131 && (b != cons_block
4132 || offset / sizeof b->conses[0] < cons_block_index)
c644523b 4133 && !EQ (((struct Lisp_Cons *) p)->car, Vdead));
34400008
GM
4134 }
4135 else
4136 return 0;
4137}
4138
4139
4140/* Value is non-zero if P is a pointer to a live Lisp symbol on
4141 the heap. M is a pointer to the mem_block for P. */
4142
b0ab8123 4143static bool
971de7fb 4144live_symbol_p (struct mem_node *m, void *p)
34400008
GM
4145{
4146 if (m->type == MEM_TYPE_SYMBOL)
4147 {
7d652d97 4148 struct symbol_block *b = m->start;
14162469 4149 ptrdiff_t offset = (char *) p - (char *) &b->symbols[0];
177c0ea7 4150
34400008
GM
4151 /* P must point to the start of a Lisp_Symbol, not be
4152 one of the unused cells in the current symbol block,
4153 and not be on the free-list. */
176bc847
GM
4154 return (offset >= 0
4155 && offset % sizeof b->symbols[0] == 0
6b61353c 4156 && offset < (SYMBOL_BLOCK_SIZE * sizeof b->symbols[0])
34400008
GM
4157 && (b != symbol_block
4158 || offset / sizeof b->symbols[0] < symbol_block_index)
c644523b 4159 && !EQ (((struct Lisp_Symbol *)p)->function, Vdead));
34400008
GM
4160 }
4161 else
4162 return 0;
4163}
4164
4165
4166/* Value is non-zero if P is a pointer to a live Lisp float on
4167 the heap. M is a pointer to the mem_block for P. */
4168
b0ab8123 4169static bool
971de7fb 4170live_float_p (struct mem_node *m, void *p)
34400008
GM
4171{
4172 if (m->type == MEM_TYPE_FLOAT)
4173 {
7d652d97 4174 struct float_block *b = m->start;
14162469 4175 ptrdiff_t offset = (char *) p - (char *) &b->floats[0];
177c0ea7 4176
ab6780cd
SM
4177 /* P must point to the start of a Lisp_Float and not be
4178 one of the unused cells in the current float block. */
176bc847
GM
4179 return (offset >= 0
4180 && offset % sizeof b->floats[0] == 0
6b61353c 4181 && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
34400008 4182 && (b != float_block
ab6780cd 4183 || offset / sizeof b->floats[0] < float_block_index));
34400008
GM
4184 }
4185 else
4186 return 0;
4187}
4188
4189
4190/* Value is non-zero if P is a pointer to a live Lisp Misc on
4191 the heap. M is a pointer to the mem_block for P. */
4192
b0ab8123 4193static bool
971de7fb 4194live_misc_p (struct mem_node *m, void *p)
34400008
GM
4195{
4196 if (m->type == MEM_TYPE_MISC)
4197 {
7d652d97 4198 struct marker_block *b = m->start;
14162469 4199 ptrdiff_t offset = (char *) p - (char *) &b->markers[0];
177c0ea7 4200
34400008
GM
4201 /* P must point to the start of a Lisp_Misc, not be
4202 one of the unused cells in the current misc block,
4203 and not be on the free-list. */
176bc847
GM
4204 return (offset >= 0
4205 && offset % sizeof b->markers[0] == 0
6b61353c 4206 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0])
34400008
GM
4207 && (b != marker_block
4208 || offset / sizeof b->markers[0] < marker_block_index)
d314756e 4209 && ((union Lisp_Misc *) p)->u_any.type != Lisp_Misc_Free);
34400008
GM
4210 }
4211 else
4212 return 0;
4213}
4214
4215
4216/* Value is non-zero if P is a pointer to a live vector-like object.
4217 M is a pointer to the mem_block for P. */
4218
b0ab8123 4219static bool
971de7fb 4220live_vector_p (struct mem_node *m, void *p)
34400008 4221{
f3372c87
DA
4222 if (m->type == MEM_TYPE_VECTOR_BLOCK)
4223 {
4224 /* This memory node corresponds to a vector block. */
7d652d97 4225 struct vector_block *block = m->start;
f3372c87
DA
4226 struct Lisp_Vector *vector = (struct Lisp_Vector *) block->data;
4227
4228 /* P is in the block's allocation range. Scan the block
4229 up to P and see whether P points to the start of some
4230 vector which is not on a free list. FIXME: check whether
4231 some allocation patterns (probably a lot of short vectors)
4232 may cause a substantial overhead of this loop. */
4233 while (VECTOR_IN_BLOCK (vector, block)
4234 && vector <= (struct Lisp_Vector *) p)
4235 {
914adc42 4236 if (!PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FREE) && vector == p)
f3372c87
DA
4237 return 1;
4238 else
914adc42 4239 vector = ADVANCE (vector, vector_nbytes (vector));
f3372c87
DA
4240 }
4241 }
914adc42
DA
4242 else if (m->type == MEM_TYPE_VECTORLIKE
4243 && (char *) p == ((char *) m->start
4244 + offsetof (struct large_vector, v)))
f3372c87
DA
4245 /* This memory node corresponds to a large vector. */
4246 return 1;
4247 return 0;
34400008
GM
4248}
4249
4250
2336fe58 4251/* Value is non-zero if P is a pointer to a live buffer. M is a
34400008
GM
4252 pointer to the mem_block for P. */
4253
b0ab8123 4254static bool
971de7fb 4255live_buffer_p (struct mem_node *m, void *p)
34400008
GM
4256{
4257 /* P must point to the start of the block, and the buffer
4258 must not have been killed. */
4259 return (m->type == MEM_TYPE_BUFFER
4260 && p == m->start
e34f7f79 4261 && !NILP (((struct buffer *) p)->INTERNAL_FIELD (name)));
34400008
GM
4262}
4263
13c844fb
GM
4264#endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */
4265
4266#if GC_MARK_STACK
4267
34400008
GM
4268#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4269
0c5307b0
DA
4270/* Currently not used, but may be called from gdb. */
4271
4272void dump_zombies (void) EXTERNALLY_VISIBLE;
4273
34400008
GM
4274/* Array of objects that are kept alive because the C stack contains
4275 a pattern that looks like a reference to them . */
4276
4277#define MAX_ZOMBIES 10
4278static Lisp_Object zombies[MAX_ZOMBIES];
4279
4280/* Number of zombie objects. */
4281
211a0b2a 4282static EMACS_INT nzombies;
34400008
GM
4283
4284/* Number of garbage collections. */
4285
211a0b2a 4286static EMACS_INT ngcs;
34400008
GM
4287
4288/* Average percentage of zombies per collection. */
4289
4290static double avg_zombies;
4291
4292/* Max. number of live and zombie objects. */
4293
211a0b2a 4294static EMACS_INT max_live, max_zombies;
34400008
GM
4295
4296/* Average number of live objects per GC. */
4297
4298static double avg_live;
4299
a7ca3326 4300DEFUN ("gc-status", Fgc_status, Sgc_status, 0, 0, "",
7ee72033 4301 doc: /* Show information about live and zombie objects. */)
5842a27b 4302 (void)
34400008 4303{
83fc9c63 4304 Lisp_Object args[8], zombie_list = Qnil;
211a0b2a 4305 EMACS_INT i;
6e4b3fbe 4306 for (i = 0; i < min (MAX_ZOMBIES, nzombies); i++)
83fc9c63
DL
4307 zombie_list = Fcons (zombies[i], zombie_list);
4308 args[0] = build_string ("%d GCs, avg live/zombies = %.2f/%.2f (%f%%), max %d/%d\nzombies: %S");
34400008
GM
4309 args[1] = make_number (ngcs);
4310 args[2] = make_float (avg_live);
4311 args[3] = make_float (avg_zombies);
4312 args[4] = make_float (avg_zombies / avg_live / 100);
4313 args[5] = make_number (max_live);
4314 args[6] = make_number (max_zombies);
83fc9c63
DL
4315 args[7] = zombie_list;
4316 return Fmessage (8, args);
34400008
GM
4317}
4318
4319#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
4320
4321
182ff242
GM
4322/* Mark OBJ if we can prove it's a Lisp_Object. */
4323
b0ab8123 4324static void
971de7fb 4325mark_maybe_object (Lisp_Object obj)
182ff242 4326{
b609f591
YM
4327 void *po;
4328 struct mem_node *m;
4329
4330 if (INTEGERP (obj))
4331 return;
4332
4333 po = (void *) XPNTR (obj);
4334 m = mem_find (po);
177c0ea7 4335
182ff242
GM
4336 if (m != MEM_NIL)
4337 {
fce31d69 4338 bool mark_p = 0;
182ff242 4339
8e50cc2d 4340 switch (XTYPE (obj))
182ff242
GM
4341 {
4342 case Lisp_String:
4343 mark_p = (live_string_p (m, po)
4344 && !STRING_MARKED_P ((struct Lisp_String *) po));
4345 break;
4346
4347 case Lisp_Cons:
08b7c2cb 4348 mark_p = (live_cons_p (m, po) && !CONS_MARKED_P (XCONS (obj)));
182ff242
GM
4349 break;
4350
4351 case Lisp_Symbol:
2336fe58 4352 mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit);
182ff242
GM
4353 break;
4354
4355 case Lisp_Float:
ab6780cd 4356 mark_p = (live_float_p (m, po) && !FLOAT_MARKED_P (XFLOAT (obj)));
182ff242
GM
4357 break;
4358
4359 case Lisp_Vectorlike:
8e50cc2d 4360 /* Note: can't check BUFFERP before we know it's a
182ff242
GM
4361 buffer because checking that dereferences the pointer
4362 PO which might point anywhere. */
4363 if (live_vector_p (m, po))
8e50cc2d 4364 mark_p = !SUBRP (obj) && !VECTOR_MARKED_P (XVECTOR (obj));
182ff242 4365 else if (live_buffer_p (m, po))
8e50cc2d 4366 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj));
182ff242
GM
4367 break;
4368
4369 case Lisp_Misc:
67ee9f6e 4370 mark_p = (live_misc_p (m, po) && !XMISCANY (obj)->gcmarkbit);
182ff242 4371 break;
6bbd7a29 4372
2de9f71c 4373 default:
6bbd7a29 4374 break;
182ff242
GM
4375 }
4376
4377 if (mark_p)
4378 {
4379#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4380 if (nzombies < MAX_ZOMBIES)
83fc9c63 4381 zombies[nzombies] = obj;
182ff242
GM
4382 ++nzombies;
4383#endif
49723c04 4384 mark_object (obj);
182ff242
GM
4385 }
4386 }
4387}
ece93c02
GM
4388
4389
4390/* If P points to Lisp data, mark that as live if it isn't already
4391 marked. */
4392
b0ab8123 4393static void
971de7fb 4394mark_maybe_pointer (void *p)
ece93c02
GM
4395{
4396 struct mem_node *m;
4397
bfe3e0a2 4398 /* Quickly rule out some values which can't point to Lisp data.
2b90362b 4399 USE_LSB_TAG needs Lisp data to be aligned on multiples of GCALIGNMENT.
bfe3e0a2 4400 Otherwise, assume that Lisp data is aligned on even addresses. */
2b90362b 4401 if ((intptr_t) p % (USE_LSB_TAG ? GCALIGNMENT : 2))
ece93c02 4402 return;
177c0ea7 4403
ece93c02
GM
4404 m = mem_find (p);
4405 if (m != MEM_NIL)
4406 {
4407 Lisp_Object obj = Qnil;
177c0ea7 4408
ece93c02
GM
4409 switch (m->type)
4410 {
4411 case MEM_TYPE_NON_LISP:
5474c384 4412 case MEM_TYPE_SPARE:
2fe50224 4413 /* Nothing to do; not a pointer to Lisp memory. */
ece93c02 4414 break;
177c0ea7 4415
ece93c02 4416 case MEM_TYPE_BUFFER:
5e617bc2 4417 if (live_buffer_p (m, p) && !VECTOR_MARKED_P ((struct buffer *)p))
ece93c02
GM
4418 XSETVECTOR (obj, p);
4419 break;
177c0ea7 4420
ece93c02 4421 case MEM_TYPE_CONS:
08b7c2cb 4422 if (live_cons_p (m, p) && !CONS_MARKED_P ((struct Lisp_Cons *) p))
ece93c02
GM
4423 XSETCONS (obj, p);
4424 break;
177c0ea7 4425
ece93c02
GM
4426 case MEM_TYPE_STRING:
4427 if (live_string_p (m, p)
4428 && !STRING_MARKED_P ((struct Lisp_String *) p))
4429 XSETSTRING (obj, p);
4430 break;
4431
4432 case MEM_TYPE_MISC:
2336fe58
SM
4433 if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit)
4434 XSETMISC (obj, p);
ece93c02 4435 break;
177c0ea7 4436
ece93c02 4437 case MEM_TYPE_SYMBOL:
2336fe58 4438 if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit)
ece93c02
GM
4439 XSETSYMBOL (obj, p);
4440 break;
177c0ea7 4441
ece93c02 4442 case MEM_TYPE_FLOAT:
ab6780cd 4443 if (live_float_p (m, p) && !FLOAT_MARKED_P (p))
ece93c02
GM
4444 XSETFLOAT (obj, p);
4445 break;
177c0ea7 4446
9c545a55 4447 case MEM_TYPE_VECTORLIKE:
f3372c87 4448 case MEM_TYPE_VECTOR_BLOCK:
ece93c02
GM
4449 if (live_vector_p (m, p))
4450 {
4451 Lisp_Object tem;
4452 XSETVECTOR (tem, p);
8e50cc2d 4453 if (!SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem)))
ece93c02
GM
4454 obj = tem;
4455 }
4456 break;
4457
4458 default:
1088b922 4459 emacs_abort ();
ece93c02
GM
4460 }
4461
8e50cc2d 4462 if (!NILP (obj))
49723c04 4463 mark_object (obj);
ece93c02
GM
4464 }
4465}
4466
4467
e32a5799 4468/* Alignment of pointer values. Use alignof, as it sometimes returns
e3fb2efb
PE
4469 a smaller alignment than GCC's __alignof__ and mark_memory might
4470 miss objects if __alignof__ were used. */
e32a5799 4471#define GC_POINTER_ALIGNMENT alignof (void *)
3164aeac 4472
e3fb2efb
PE
4473/* Define POINTERS_MIGHT_HIDE_IN_OBJECTS to 1 if marking via C pointers does
4474 not suffice, which is the typical case. A host where a Lisp_Object is
4475 wider than a pointer might allocate a Lisp_Object in non-adjacent halves.
4476 If USE_LSB_TAG, the bottom half is not a valid pointer, but it should
4477 suffice to widen it to to a Lisp_Object and check it that way. */
bfe3e0a2
PE
4478#if USE_LSB_TAG || VAL_MAX < UINTPTR_MAX
4479# if !USE_LSB_TAG && VAL_MAX < UINTPTR_MAX >> GCTYPEBITS
e3fb2efb
PE
4480 /* If tag bits straddle pointer-word boundaries, neither mark_maybe_pointer
4481 nor mark_maybe_object can follow the pointers. This should not occur on
4482 any practical porting target. */
4483# error "MSB type bits straddle pointer-word boundaries"
4484# endif
4485 /* Marking via C pointers does not suffice, because Lisp_Objects contain
4486 pointer words that hold pointers ORed with type bits. */
4487# define POINTERS_MIGHT_HIDE_IN_OBJECTS 1
4488#else
4489 /* Marking via C pointers suffices, because Lisp_Objects contain pointer
4490 words that hold unmodified pointers. */
4491# define POINTERS_MIGHT_HIDE_IN_OBJECTS 0
4492#endif
4493
55a314a5
YM
4494/* Mark Lisp objects referenced from the address range START+OFFSET..END
4495 or END+OFFSET..START. */
34400008 4496
177c0ea7 4497static void
3164aeac 4498mark_memory (void *start, void *end)
b41253a3
JW
4499#if defined (__clang__) && defined (__has_feature)
4500#if __has_feature(address_sanitizer)
ed6b3510
JW
4501 /* Do not allow -faddress-sanitizer to check this function, since it
4502 crosses the function stack boundary, and thus would yield many
4503 false positives. */
4504 __attribute__((no_address_safety_analysis))
4505#endif
b41253a3 4506#endif
34400008 4507{
ece93c02 4508 void **pp;
3164aeac 4509 int i;
34400008
GM
4510
4511#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4512 nzombies = 0;
4513#endif
4514
4515 /* Make START the pointer to the start of the memory region,
4516 if it isn't already. */
4517 if (end < start)
4518 {
4519 void *tem = start;
4520 start = end;
4521 end = tem;
4522 }
ece93c02 4523
ece93c02
GM
4524 /* Mark Lisp data pointed to. This is necessary because, in some
4525 situations, the C compiler optimizes Lisp objects away, so that
4526 only a pointer to them remains. Example:
4527
4528 DEFUN ("testme", Ftestme, Stestme, 0, 0, 0, "")
7ee72033 4529 ()
ece93c02
GM
4530 {
4531 Lisp_Object obj = build_string ("test");
4532 struct Lisp_String *s = XSTRING (obj);
4533 Fgarbage_collect ();
4534 fprintf (stderr, "test `%s'\n", s->data);
4535 return Qnil;
4536 }
4537
4538 Here, `obj' isn't really used, and the compiler optimizes it
4539 away. The only reference to the life string is through the
4540 pointer `s'. */
177c0ea7 4541
3164aeac
PE
4542 for (pp = start; (void *) pp < end; pp++)
4543 for (i = 0; i < sizeof *pp; i += GC_POINTER_ALIGNMENT)
27f3c637 4544 {
e3fb2efb
PE
4545 void *p = *(void **) ((char *) pp + i);
4546 mark_maybe_pointer (p);
4547 if (POINTERS_MIGHT_HIDE_IN_OBJECTS)
646b5f55 4548 mark_maybe_object (XIL ((intptr_t) p));
27f3c637 4549 }
182ff242
GM
4550}
4551
182ff242
GM
4552#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
4553
fce31d69
PE
4554static bool setjmp_tested_p;
4555static int longjmps_done;
182ff242
GM
4556
4557#define SETJMP_WILL_LIKELY_WORK "\
4558\n\
4559Emacs garbage collector has been changed to use conservative stack\n\
4560marking. Emacs has determined that the method it uses to do the\n\
4561marking will likely work on your system, but this isn't sure.\n\
4562\n\
4563If you are a system-programmer, or can get the help of a local wizard\n\
4564who is, please take a look at the function mark_stack in alloc.c, and\n\
4565verify that the methods used are appropriate for your system.\n\
4566\n\
d191623b 4567Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4568"
4569
4570#define SETJMP_WILL_NOT_WORK "\
4571\n\
4572Emacs garbage collector has been changed to use conservative stack\n\
4573marking. Emacs has determined that the default method it uses to do the\n\
4574marking will not work on your system. We will need a system-dependent\n\
4575solution for your system.\n\
4576\n\
4577Please take a look at the function mark_stack in alloc.c, and\n\
4578try to find a way to make it work on your system.\n\
30f637f8
DL
4579\n\
4580Note that you may get false negatives, depending on the compiler.\n\
4581In particular, you need to use -O with GCC for this test.\n\
4582\n\
d191623b 4583Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4584"
4585
4586
4587/* Perform a quick check if it looks like setjmp saves registers in a
4588 jmp_buf. Print a message to stderr saying so. When this test
4589 succeeds, this is _not_ a proof that setjmp is sufficient for
4590 conservative stack marking. Only the sources or a disassembly
4591 can prove that. */
4592
4593static void
2018939f 4594test_setjmp (void)
182ff242
GM
4595{
4596 char buf[10];
4597 register int x;
0328b6de 4598 sys_jmp_buf jbuf;
182ff242
GM
4599
4600 /* Arrange for X to be put in a register. */
4601 sprintf (buf, "1");
4602 x = strlen (buf);
4603 x = 2 * x - 1;
4604
0328b6de 4605 sys_setjmp (jbuf);
182ff242 4606 if (longjmps_done == 1)
34400008 4607 {
182ff242 4608 /* Came here after the longjmp at the end of the function.
34400008 4609
182ff242
GM
4610 If x == 1, the longjmp has restored the register to its
4611 value before the setjmp, and we can hope that setjmp
4612 saves all such registers in the jmp_buf, although that
4613 isn't sure.
34400008 4614
182ff242
GM
4615 For other values of X, either something really strange is
4616 taking place, or the setjmp just didn't save the register. */
4617
4618 if (x == 1)
4619 fprintf (stderr, SETJMP_WILL_LIKELY_WORK);
4620 else
4621 {
4622 fprintf (stderr, SETJMP_WILL_NOT_WORK);
4623 exit (1);
34400008
GM
4624 }
4625 }
182ff242
GM
4626
4627 ++longjmps_done;
4628 x = 2;
4629 if (longjmps_done == 1)
0328b6de 4630 sys_longjmp (jbuf, 1);
34400008
GM
4631}
4632
182ff242
GM
4633#endif /* not GC_SAVE_REGISTERS_ON_STACK && not GC_SETJMP_WORKS */
4634
34400008
GM
4635
4636#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4637
4638/* Abort if anything GCPRO'd doesn't survive the GC. */
4639
4640static void
2018939f 4641check_gcpros (void)
34400008
GM
4642{
4643 struct gcpro *p;
f66c7cf8 4644 ptrdiff_t i;
34400008
GM
4645
4646 for (p = gcprolist; p; p = p->next)
4647 for (i = 0; i < p->nvars; ++i)
4648 if (!survives_gc_p (p->var[i]))
92cc28b2
SM
4649 /* FIXME: It's not necessarily a bug. It might just be that the
4650 GCPRO is unnecessary or should release the object sooner. */
1088b922 4651 emacs_abort ();
34400008
GM
4652}
4653
4654#elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4655
0c5307b0 4656void
2018939f 4657dump_zombies (void)
34400008
GM
4658{
4659 int i;
4660
6e4b3fbe 4661 fprintf (stderr, "\nZombies kept alive = %"pI"d:\n", nzombies);
34400008
GM
4662 for (i = 0; i < min (MAX_ZOMBIES, nzombies); ++i)
4663 {
4664 fprintf (stderr, " %d = ", i);
4665 debug_print (zombies[i]);
4666 }
4667}
4668
4669#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
4670
4671
182ff242
GM
4672/* Mark live Lisp objects on the C stack.
4673
4674 There are several system-dependent problems to consider when
4675 porting this to new architectures:
4676
4677 Processor Registers
4678
4679 We have to mark Lisp objects in CPU registers that can hold local
4680 variables or are used to pass parameters.
4681
4682 If GC_SAVE_REGISTERS_ON_STACK is defined, it should expand to
4683 something that either saves relevant registers on the stack, or
4684 calls mark_maybe_object passing it each register's contents.
4685
4686 If GC_SAVE_REGISTERS_ON_STACK is not defined, the current
4687 implementation assumes that calling setjmp saves registers we need
4688 to see in a jmp_buf which itself lies on the stack. This doesn't
4689 have to be true! It must be verified for each system, possibly
4690 by taking a look at the source code of setjmp.
4691
2018939f
AS
4692 If __builtin_unwind_init is available (defined by GCC >= 2.8) we
4693 can use it as a machine independent method to store all registers
4694 to the stack. In this case the macros described in the previous
4695 two paragraphs are not used.
4696
182ff242
GM
4697 Stack Layout
4698
4699 Architectures differ in the way their processor stack is organized.
4700 For example, the stack might look like this
4701
4702 +----------------+
4703 | Lisp_Object | size = 4
4704 +----------------+
4705 | something else | size = 2
4706 +----------------+
4707 | Lisp_Object | size = 4
4708 +----------------+
4709 | ... |
4710
4711 In such a case, not every Lisp_Object will be aligned equally. To
4712 find all Lisp_Object on the stack it won't be sufficient to walk
4713 the stack in steps of 4 bytes. Instead, two passes will be
4714 necessary, one starting at the start of the stack, and a second
4715 pass starting at the start of the stack + 2. Likewise, if the
4716 minimal alignment of Lisp_Objects on the stack is 1, four passes
4717 would be necessary, each one starting with one byte more offset
c9af454e 4718 from the stack start. */
34400008
GM
4719
4720static void
971de7fb 4721mark_stack (void)
34400008 4722{
34400008
GM
4723 void *end;
4724
2018939f
AS
4725#ifdef HAVE___BUILTIN_UNWIND_INIT
4726 /* Force callee-saved registers and register windows onto the stack.
4727 This is the preferred method if available, obviating the need for
4728 machine dependent methods. */
4729 __builtin_unwind_init ();
4730 end = &end;
4731#else /* not HAVE___BUILTIN_UNWIND_INIT */
dff45157
PE
4732#ifndef GC_SAVE_REGISTERS_ON_STACK
4733 /* jmp_buf may not be aligned enough on darwin-ppc64 */
4734 union aligned_jmpbuf {
4735 Lisp_Object o;
0328b6de 4736 sys_jmp_buf j;
dff45157 4737 } j;
fce31d69 4738 volatile bool stack_grows_down_p = (char *) &j > (char *) stack_base;
dff45157 4739#endif
34400008
GM
4740 /* This trick flushes the register windows so that all the state of
4741 the process is contained in the stack. */
ab6780cd 4742 /* Fixme: Code in the Boehm GC suggests flushing (with `flushrs') is
422eec7e
DL
4743 needed on ia64 too. See mach_dep.c, where it also says inline
4744 assembler doesn't work with relevant proprietary compilers. */
4a00783e 4745#ifdef __sparc__
4d18a7a2
DN
4746#if defined (__sparc64__) && defined (__FreeBSD__)
4747 /* FreeBSD does not have a ta 3 handler. */
4c1616be
CY
4748 asm ("flushw");
4749#else
34400008 4750 asm ("ta 3");
4c1616be 4751#endif
34400008 4752#endif
177c0ea7 4753
34400008
GM
4754 /* Save registers that we need to see on the stack. We need to see
4755 registers used to hold register variables and registers used to
4756 pass parameters. */
4757#ifdef GC_SAVE_REGISTERS_ON_STACK
4758 GC_SAVE_REGISTERS_ON_STACK (end);
182ff242 4759#else /* not GC_SAVE_REGISTERS_ON_STACK */
177c0ea7 4760
182ff242
GM
4761#ifndef GC_SETJMP_WORKS /* If it hasn't been checked yet that
4762 setjmp will definitely work, test it
4763 and print a message with the result
4764 of the test. */
4765 if (!setjmp_tested_p)
4766 {
4767 setjmp_tested_p = 1;
4768 test_setjmp ();
4769 }
4770#endif /* GC_SETJMP_WORKS */
177c0ea7 4771
0328b6de 4772 sys_setjmp (j.j);
34400008 4773 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
182ff242 4774#endif /* not GC_SAVE_REGISTERS_ON_STACK */
2018939f 4775#endif /* not HAVE___BUILTIN_UNWIND_INIT */
34400008
GM
4776
4777 /* This assumes that the stack is a contiguous region in memory. If
182ff242
GM
4778 that's not the case, something has to be done here to iterate
4779 over the stack segments. */
3164aeac
PE
4780 mark_memory (stack_base, end);
4781
4dec23ff
AS
4782 /* Allow for marking a secondary stack, like the register stack on the
4783 ia64. */
4784#ifdef GC_MARK_SECONDARY_STACK
4785 GC_MARK_SECONDARY_STACK ();
4786#endif
34400008
GM
4787
4788#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4789 check_gcpros ();
4790#endif
4791}
4792
0c5307b0
DA
4793#else /* GC_MARK_STACK == 0 */
4794
4795#define mark_maybe_object(obj) emacs_abort ()
4796
34400008
GM
4797#endif /* GC_MARK_STACK != 0 */
4798
4799
7ffb6955 4800/* Determine whether it is safe to access memory at address P. */
d3d47262 4801static int
971de7fb 4802valid_pointer_p (void *p)
7ffb6955 4803{
f892cf9c
EZ
4804#ifdef WINDOWSNT
4805 return w32_valid_pointer_p (p, 16);
4806#else
41bed37d 4807 int fd[2];
7ffb6955
KS
4808
4809 /* Obviously, we cannot just access it (we would SEGV trying), so we
4810 trick the o/s to tell us whether p is a valid pointer.
4811 Unfortunately, we cannot use NULL_DEVICE here, as emacs_write may
4812 not validate p in that case. */
4813
c7ddc792 4814 if (emacs_pipe (fd) == 0)
7ffb6955 4815 {
fce31d69 4816 bool valid = emacs_write (fd[1], (char *) p, 16) == 16;
41bed37d
PE
4817 emacs_close (fd[1]);
4818 emacs_close (fd[0]);
7ffb6955
KS
4819 return valid;
4820 }
4821
4822 return -1;
f892cf9c 4823#endif
7ffb6955 4824}
3cd55735 4825
6cda572a
DA
4826/* Return 2 if OBJ is a killed or special buffer object, 1 if OBJ is a
4827 valid lisp object, 0 if OBJ is NOT a valid lisp object, or -1 if we
4828 cannot validate OBJ. This function can be quite slow, so its primary
4829 use is the manual debugging. The only exception is print_object, where
4830 we use it to check whether the memory referenced by the pointer of
4831 Lisp_Save_Value object contains valid objects. */
3cd55735
KS
4832
4833int
971de7fb 4834valid_lisp_object_p (Lisp_Object obj)
3cd55735 4835{
de7124a7 4836 void *p;
7ffb6955 4837#if GC_MARK_STACK
3cd55735 4838 struct mem_node *m;
de7124a7 4839#endif
3cd55735
KS
4840
4841 if (INTEGERP (obj))
4842 return 1;
4843
4844 p = (void *) XPNTR (obj);
3cd55735
KS
4845 if (PURE_POINTER_P (p))
4846 return 1;
4847
c1ca42ca
DA
4848 if (p == &buffer_defaults || p == &buffer_local_symbols)
4849 return 2;
4850
de7124a7 4851#if !GC_MARK_STACK
7ffb6955 4852 return valid_pointer_p (p);
de7124a7
KS
4853#else
4854
3cd55735
KS
4855 m = mem_find (p);
4856
4857 if (m == MEM_NIL)
7ffb6955
KS
4858 {
4859 int valid = valid_pointer_p (p);
4860 if (valid <= 0)
4861 return valid;
4862
4863 if (SUBRP (obj))
4864 return 1;
4865
4866 return 0;
4867 }
3cd55735
KS
4868
4869 switch (m->type)
4870 {
4871 case MEM_TYPE_NON_LISP:
5474c384 4872 case MEM_TYPE_SPARE:
3cd55735
KS
4873 return 0;
4874
4875 case MEM_TYPE_BUFFER:
c1ca42ca 4876 return live_buffer_p (m, p) ? 1 : 2;
3cd55735
KS
4877
4878 case MEM_TYPE_CONS:
4879 return live_cons_p (m, p);
4880
4881 case MEM_TYPE_STRING:
4882 return live_string_p (m, p);
4883
4884 case MEM_TYPE_MISC:
4885 return live_misc_p (m, p);
4886
4887 case MEM_TYPE_SYMBOL:
4888 return live_symbol_p (m, p);
4889
4890 case MEM_TYPE_FLOAT:
4891 return live_float_p (m, p);
4892
9c545a55 4893 case MEM_TYPE_VECTORLIKE:
f3372c87 4894 case MEM_TYPE_VECTOR_BLOCK:
3cd55735
KS
4895 return live_vector_p (m, p);
4896
4897 default:
4898 break;
4899 }
4900
4901 return 0;
4902#endif
4903}
4904
4905
4906
34400008 4907\f
2e471eb5
GM
4908/***********************************************************************
4909 Pure Storage Management
4910 ***********************************************************************/
4911
1f0b3fd2
GM
4912/* Allocate room for SIZE bytes from pure Lisp storage and return a
4913 pointer to it. TYPE is the Lisp type for which the memory is
e5bc14d4 4914 allocated. TYPE < 0 means it's not used for a Lisp object. */
1f0b3fd2 4915
261cb4bb 4916static void *
971de7fb 4917pure_alloc (size_t size, int type)
1f0b3fd2 4918{
261cb4bb 4919 void *result;
bfe3e0a2 4920#if USE_LSB_TAG
2b90362b 4921 size_t alignment = GCALIGNMENT;
6b61353c 4922#else
e32a5799 4923 size_t alignment = alignof (EMACS_INT);
1f0b3fd2
GM
4924
4925 /* Give Lisp_Floats an extra alignment. */
4926 if (type == Lisp_Float)
e32a5799 4927 alignment = alignof (struct Lisp_Float);
6b61353c 4928#endif
1f0b3fd2 4929
44117420 4930 again:
e5bc14d4
YM
4931 if (type >= 0)
4932 {
4933 /* Allocate space for a Lisp object from the beginning of the free
4934 space with taking account of alignment. */
4935 result = ALIGN (purebeg + pure_bytes_used_lisp, alignment);
4936 pure_bytes_used_lisp = ((char *)result - (char *)purebeg) + size;
4937 }
4938 else
4939 {
4940 /* Allocate space for a non-Lisp object from the end of the free
4941 space. */
4942 pure_bytes_used_non_lisp += size;
4943 result = purebeg + pure_size - pure_bytes_used_non_lisp;
4944 }
4945 pure_bytes_used = pure_bytes_used_lisp + pure_bytes_used_non_lisp;
44117420
KS
4946
4947 if (pure_bytes_used <= pure_size)
4948 return result;
4949
4950 /* Don't allocate a large amount here,
4951 because it might get mmap'd and then its address
4952 might not be usable. */
23f86fce 4953 purebeg = xmalloc (10000);
44117420
KS
4954 pure_size = 10000;
4955 pure_bytes_used_before_overflow += pure_bytes_used - size;
4956 pure_bytes_used = 0;
e5bc14d4 4957 pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;
44117420 4958 goto again;
1f0b3fd2
GM
4959}
4960
4961
852f8cdc 4962/* Print a warning if PURESIZE is too small. */
9e713715
GM
4963
4964void
971de7fb 4965check_pure_size (void)
9e713715
GM
4966{
4967 if (pure_bytes_used_before_overflow)
c2982e87
PE
4968 message (("emacs:0:Pure Lisp storage overflow (approx. %"pI"d"
4969 " bytes needed)"),
4970 pure_bytes_used + pure_bytes_used_before_overflow);
9e713715
GM
4971}
4972
4973
79fd0489
YM
4974/* Find the byte sequence {DATA[0], ..., DATA[NBYTES-1], '\0'} from
4975 the non-Lisp data pool of the pure storage, and return its start
4976 address. Return NULL if not found. */
4977
4978static char *
d311d28c 4979find_string_data_in_pure (const char *data, ptrdiff_t nbytes)
79fd0489 4980{
14162469 4981 int i;
d311d28c 4982 ptrdiff_t skip, bm_skip[256], last_char_skip, infinity, start, start_max;
2aff7c53 4983 const unsigned char *p;
79fd0489
YM
4984 char *non_lisp_beg;
4985
d311d28c 4986 if (pure_bytes_used_non_lisp <= nbytes)
79fd0489
YM
4987 return NULL;
4988
4989 /* Set up the Boyer-Moore table. */
4990 skip = nbytes + 1;
4991 for (i = 0; i < 256; i++)
4992 bm_skip[i] = skip;
4993
2aff7c53 4994 p = (const unsigned char *) data;
79fd0489
YM
4995 while (--skip > 0)
4996 bm_skip[*p++] = skip;
4997
4998 last_char_skip = bm_skip['\0'];
4999
5000 non_lisp_beg = purebeg + pure_size - pure_bytes_used_non_lisp;
5001 start_max = pure_bytes_used_non_lisp - (nbytes + 1);
5002
5003 /* See the comments in the function `boyer_moore' (search.c) for the
5004 use of `infinity'. */
5005 infinity = pure_bytes_used_non_lisp + 1;
5006 bm_skip['\0'] = infinity;
5007
2aff7c53 5008 p = (const unsigned char *) non_lisp_beg + nbytes;
79fd0489
YM
5009 start = 0;
5010 do
5011 {
5012 /* Check the last character (== '\0'). */
5013 do
5014 {
5015 start += bm_skip[*(p + start)];
5016 }
5017 while (start <= start_max);
5018
5019 if (start < infinity)
5020 /* Couldn't find the last character. */
5021 return NULL;
5022
5023 /* No less than `infinity' means we could find the last
5024 character at `p[start - infinity]'. */
5025 start -= infinity;
5026
5027 /* Check the remaining characters. */
5028 if (memcmp (data, non_lisp_beg + start, nbytes) == 0)
5029 /* Found. */
5030 return non_lisp_beg + start;
5031
5032 start += last_char_skip;
5033 }
5034 while (start <= start_max);
5035
5036 return NULL;
5037}
5038
5039
2e471eb5
GM
5040/* Return a string allocated in pure space. DATA is a buffer holding
5041 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
fce31d69 5042 means make the result string multibyte.
1a4f1e2c 5043
2e471eb5
GM
5044 Must get an error if pure storage is full, since if it cannot hold
5045 a large string it may be able to hold conses that point to that
5046 string; then the string is not protected from gc. */
7146af97
JB
5047
5048Lisp_Object
14162469 5049make_pure_string (const char *data,
fce31d69 5050 ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
7146af97 5051{
2e471eb5 5052 Lisp_Object string;
98c6f1e3 5053 struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
90256841 5054 s->data = (unsigned char *) find_string_data_in_pure (data, nbytes);
79fd0489
YM
5055 if (s->data == NULL)
5056 {
98c6f1e3 5057 s->data = pure_alloc (nbytes + 1, -1);
72af86bd 5058 memcpy (s->data, data, nbytes);
79fd0489
YM
5059 s->data[nbytes] = '\0';
5060 }
2e471eb5
GM
5061 s->size = nchars;
5062 s->size_byte = multibyte ? nbytes : -1;
77c7bcb1 5063 s->intervals = NULL;
2e471eb5
GM
5064 XSETSTRING (string, s);
5065 return string;
7146af97
JB
5066}
5067
2a0213a6
DA
5068/* Return a string allocated in pure space. Do not
5069 allocate the string data, just point to DATA. */
a56eaaef
DN
5070
5071Lisp_Object
2a0213a6 5072make_pure_c_string (const char *data, ptrdiff_t nchars)
a56eaaef
DN
5073{
5074 Lisp_Object string;
98c6f1e3 5075 struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
a56eaaef
DN
5076 s->size = nchars;
5077 s->size_byte = -1;
323637a2 5078 s->data = (unsigned char *) data;
77c7bcb1 5079 s->intervals = NULL;
a56eaaef
DN
5080 XSETSTRING (string, s);
5081 return string;
5082}
2e471eb5 5083
34400008
GM
5084/* Return a cons allocated from pure space. Give it pure copies
5085 of CAR as car and CDR as cdr. */
5086
7146af97 5087Lisp_Object
971de7fb 5088pure_cons (Lisp_Object car, Lisp_Object cdr)
7146af97 5089{
98c6f1e3
PE
5090 Lisp_Object new;
5091 struct Lisp_Cons *p = pure_alloc (sizeof *p, Lisp_Cons);
1f0b3fd2 5092 XSETCONS (new, p);
f3fbd155
KR
5093 XSETCAR (new, Fpurecopy (car));
5094 XSETCDR (new, Fpurecopy (cdr));
7146af97
JB
5095 return new;
5096}
5097
7146af97 5098
34400008
GM
5099/* Value is a float object with value NUM allocated from pure space. */
5100
d3d47262 5101static Lisp_Object
971de7fb 5102make_pure_float (double num)
7146af97 5103{
98c6f1e3
PE
5104 Lisp_Object new;
5105 struct Lisp_Float *p = pure_alloc (sizeof *p, Lisp_Float);
1f0b3fd2 5106 XSETFLOAT (new, p);
f601cdf3 5107 XFLOAT_INIT (new, num);
7146af97
JB
5108 return new;
5109}
5110
34400008
GM
5111
5112/* Return a vector with room for LEN Lisp_Objects allocated from
5113 pure space. */
5114
72cb32cf 5115static Lisp_Object
d311d28c 5116make_pure_vector (ptrdiff_t len)
7146af97 5117{
1f0b3fd2 5118 Lisp_Object new;
d06714cb 5119 size_t size = header_size + len * word_size;
98c6f1e3 5120 struct Lisp_Vector *p = pure_alloc (size, Lisp_Vectorlike);
1f0b3fd2 5121 XSETVECTOR (new, p);
eab3844f 5122 XVECTOR (new)->header.size = len;
7146af97
JB
5123 return new;
5124}
5125
34400008 5126
a7ca3326 5127DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
909e3b33 5128 doc: /* Make a copy of object OBJ in pure storage.
228299fa 5129Recursively copies contents of vectors and cons cells.
7ee72033 5130Does not copy symbols. Copies strings without text properties. */)
5842a27b 5131 (register Lisp_Object obj)
7146af97 5132{
265a9e55 5133 if (NILP (Vpurify_flag))
7146af97
JB
5134 return obj;
5135
1f0b3fd2 5136 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
5137 return obj;
5138
e9515805
SM
5139 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
5140 {
5141 Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil);
5142 if (!NILP (tmp))
5143 return tmp;
5144 }
5145
d6dd74bb 5146 if (CONSP (obj))
e9515805 5147 obj = pure_cons (XCAR (obj), XCDR (obj));
d6dd74bb 5148 else if (FLOATP (obj))
e9515805 5149 obj = make_pure_float (XFLOAT_DATA (obj));
d6dd74bb 5150 else if (STRINGP (obj))
42a5b22f 5151 obj = make_pure_string (SSDATA (obj), SCHARS (obj),
e9515805
SM
5152 SBYTES (obj),
5153 STRING_MULTIBYTE (obj));
876c194c 5154 else if (COMPILEDP (obj) || VECTORP (obj))
d6dd74bb
KH
5155 {
5156 register struct Lisp_Vector *vec;
d311d28c
PE
5157 register ptrdiff_t i;
5158 ptrdiff_t size;
d6dd74bb 5159
77b37c05 5160 size = ASIZE (obj);
7d535c68
KH
5161 if (size & PSEUDOVECTOR_FLAG)
5162 size &= PSEUDOVECTOR_SIZE_MASK;
6b61353c 5163 vec = XVECTOR (make_pure_vector (size));
d6dd74bb 5164 for (i = 0; i < size; i++)
28be1ada 5165 vec->contents[i] = Fpurecopy (AREF (obj, i));
876c194c 5166 if (COMPILEDP (obj))
985773c9 5167 {
876c194c
SM
5168 XSETPVECTYPE (vec, PVEC_COMPILED);
5169 XSETCOMPILED (obj, vec);
985773c9 5170 }
d6dd74bb
KH
5171 else
5172 XSETVECTOR (obj, vec);
7146af97 5173 }
d6dd74bb
KH
5174 else if (MARKERP (obj))
5175 error ("Attempt to copy a marker to pure storage");
e9515805
SM
5176 else
5177 /* Not purified, don't hash-cons. */
5178 return obj;
5179
5180 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
5181 Fputhash (obj, obj, Vpurify_flag);
6bbd7a29
GM
5182
5183 return obj;
7146af97 5184}
2e471eb5 5185
34400008 5186
7146af97 5187\f
34400008
GM
5188/***********************************************************************
5189 Protection from GC
5190 ***********************************************************************/
5191
2e471eb5
GM
5192/* Put an entry in staticvec, pointing at the variable with address
5193 VARADDRESS. */
7146af97
JB
5194
5195void
971de7fb 5196staticpro (Lisp_Object *varaddress)
7146af97 5197{
7146af97 5198 if (staticidx >= NSTATICS)
afb8aa24 5199 fatal ("NSTATICS too small; try increasing and recompiling Emacs.");
4195afc3 5200 staticvec[staticidx++] = varaddress;
7146af97
JB
5201}
5202
7146af97 5203\f
34400008
GM
5204/***********************************************************************
5205 Protection from GC
5206 ***********************************************************************/
1a4f1e2c 5207
e8197642
RS
5208/* Temporarily prevent garbage collection. */
5209
d311d28c 5210ptrdiff_t
971de7fb 5211inhibit_garbage_collection (void)
e8197642 5212{
d311d28c 5213 ptrdiff_t count = SPECPDL_INDEX ();
54defd0d 5214
6349ae4d 5215 specbind (Qgc_cons_threshold, make_number (MOST_POSITIVE_FIXNUM));
e8197642
RS
5216 return count;
5217}
5218
3ab6e069
DA
5219/* Used to avoid possible overflows when
5220 converting from C to Lisp integers. */
5221
b0ab8123 5222static Lisp_Object
3ab6e069
DA
5223bounded_number (EMACS_INT number)
5224{
5225 return make_number (min (MOST_POSITIVE_FIXNUM, number));
5226}
34400008 5227
12b3895d
TM
5228/* Calculate total bytes of live objects. */
5229
5230static size_t
5231total_bytes_of_live_objects (void)
5232{
5233 size_t tot = 0;
5234 tot += total_conses * sizeof (struct Lisp_Cons);
5235 tot += total_symbols * sizeof (struct Lisp_Symbol);
5236 tot += total_markers * sizeof (union Lisp_Misc);
5237 tot += total_string_bytes;
5238 tot += total_vector_slots * word_size;
5239 tot += total_floats * sizeof (struct Lisp_Float);
5240 tot += total_intervals * sizeof (struct interval);
5241 tot += total_strings * sizeof (struct Lisp_String);
5242 return tot;
5243}
5244
a7ca3326 5245DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
7ee72033 5246 doc: /* Reclaim storage for Lisp objects no longer needed.
e1e37596
RS
5247Garbage collection happens automatically if you cons more than
5248`gc-cons-threshold' bytes of Lisp data since previous garbage collection.
5db81e33
SM
5249`garbage-collect' normally returns a list with info on amount of space in use,
5250where each entry has the form (NAME SIZE USED FREE), where:
5251- NAME is a symbol describing the kind of objects this entry represents,
5252- SIZE is the number of bytes used by each one,
5253- USED is the number of those objects that were found live in the heap,
5254- FREE is the number of those objects that are not live but that Emacs
5255 keeps around for future allocations (maybe because it does not know how
5256 to return them to the OS).
e1e37596 5257However, if there was overflow in pure space, `garbage-collect'
999dd333
GM
5258returns nil, because real GC can't be done.
5259See Info node `(elisp)Garbage Collection'. */)
5842a27b 5260 (void)
7146af97 5261{
fce31d69 5262 struct buffer *nextb;
7146af97 5263 char stack_top_variable;
f66c7cf8 5264 ptrdiff_t i;
fce31d69 5265 bool message_p;
d311d28c 5266 ptrdiff_t count = SPECPDL_INDEX ();
43aac990 5267 struct timespec start;
fecbd8ff 5268 Lisp_Object retval = Qnil;
12b3895d 5269 size_t tot_before = 0;
2c5bd608 5270
3de0effb 5271 if (abort_on_gc)
1088b922 5272 emacs_abort ();
3de0effb 5273
9e713715
GM
5274 /* Can't GC if pure storage overflowed because we can't determine
5275 if something is a pure object or not. */
5276 if (pure_bytes_used_before_overflow)
5277 return Qnil;
5278
3d80c99f 5279 /* Record this function, so it appears on the profiler's backtraces. */
2f592f95 5280 record_in_backtrace (Qautomatic_gc, &Qnil, 0);
3d80c99f 5281
7e63e0c3 5282 check_cons_list ();
bbc012e0 5283
3c7e66a8
RS
5284 /* Don't keep undo information around forever.
5285 Do this early on, so it is no problem if the user quits. */
52b852c7 5286 FOR_EACH_BUFFER (nextb)
9cd47b72 5287 compact_buffer (nextb);
3c7e66a8 5288
6521894d 5289 if (profiler_memory_running)
12b3895d
TM
5290 tot_before = total_bytes_of_live_objects ();
5291
43aac990 5292 start = current_timespec ();
3c7e66a8 5293
58595309
KH
5294 /* In case user calls debug_print during GC,
5295 don't let that cause a recursive GC. */
5296 consing_since_gc = 0;
5297
6efc7df7
GM
5298 /* Save what's currently displayed in the echo area. */
5299 message_p = push_message ();
27e498e6 5300 record_unwind_protect_void (pop_message_unwind);
41c28a37 5301
7146af97
JB
5302 /* Save a copy of the contents of the stack, for debugging. */
5303#if MAX_SAVE_STACK > 0
265a9e55 5304 if (NILP (Vpurify_flag))
7146af97 5305 {
dd3f25f7 5306 char *stack;
903fe15d 5307 ptrdiff_t stack_size;
dd3f25f7 5308 if (&stack_top_variable < stack_bottom)
7146af97 5309 {
dd3f25f7
PE
5310 stack = &stack_top_variable;
5311 stack_size = stack_bottom - &stack_top_variable;
5312 }
5313 else
5314 {
5315 stack = stack_bottom;
5316 stack_size = &stack_top_variable - stack_bottom;
5317 }
5318 if (stack_size <= MAX_SAVE_STACK)
7146af97 5319 {
dd3f25f7 5320 if (stack_copy_size < stack_size)
7146af97 5321 {
38182d90 5322 stack_copy = xrealloc (stack_copy, stack_size);
dd3f25f7 5323 stack_copy_size = stack_size;
7146af97 5324 }
dd3f25f7 5325 memcpy (stack_copy, stack, stack_size);
7146af97
JB
5326 }
5327 }
5328#endif /* MAX_SAVE_STACK > 0 */
5329
299585ee 5330 if (garbage_collection_messages)
691c4285 5331 message1_nolog ("Garbage collecting...");
7146af97 5332
4d7e6e51 5333 block_input ();
6e0fca1d 5334
eec7b73d
RS
5335 shrink_regexp_cache ();
5336
7146af97
JB
5337 gc_in_progress = 1;
5338
005ca5c7 5339 /* Mark all the special slots that serve as the roots of accessibility. */
7146af97 5340
c752cfa9
DA
5341 mark_buffer (&buffer_defaults);
5342 mark_buffer (&buffer_local_symbols);
5343
7146af97 5344 for (i = 0; i < staticidx; i++)
49723c04 5345 mark_object (*staticvec[i]);
34400008 5346
2f592f95 5347 mark_specpdl ();
6ed8eeff 5348 mark_terminals ();
126f9c02
SM
5349 mark_kboards ();
5350
5351#ifdef USE_GTK
a411ac43 5352 xg_mark_data ();
126f9c02
SM
5353#endif
5354
34400008
GM
5355#if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
5356 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
5357 mark_stack ();
5358#else
acf5f7d3
SM
5359 {
5360 register struct gcpro *tail;
5361 for (tail = gcprolist; tail; tail = tail->next)
5362 for (i = 0; i < tail->nvars; i++)
005ca5c7 5363 mark_object (tail->var[i]);
acf5f7d3 5364 }
3e21b6a7 5365 mark_byte_stack ();
b286858c
SM
5366 {
5367 struct catchtag *catch;
5368 struct handler *handler;
177c0ea7 5369
7146af97
JB
5370 for (catch = catchlist; catch; catch = catch->next)
5371 {
49723c04
SM
5372 mark_object (catch->tag);
5373 mark_object (catch->val);
177c0ea7 5374 }
7146af97
JB
5375 for (handler = handlerlist; handler; handler = handler->next)
5376 {
49723c04
SM
5377 mark_object (handler->handler);
5378 mark_object (handler->var);
177c0ea7 5379 }
b286858c 5380 }
b286858c 5381#endif
7146af97 5382
454d7973
KS
5383#ifdef HAVE_WINDOW_SYSTEM
5384 mark_fringe_data ();
5385#endif
5386
74c35a48
SM
5387#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
5388 mark_stack ();
5389#endif
5390
c37adf23
SM
5391 /* Everything is now marked, except for the things that require special
5392 finalization, i.e. the undo_list.
5393 Look thru every buffer's undo list
4c315bda
RS
5394 for elements that update markers that were not marked,
5395 and delete them. */
52b852c7 5396 FOR_EACH_BUFFER (nextb)
d17337e5
DA
5397 {
5398 /* If a buffer's undo list is Qt, that means that undo is
5399 turned off in that buffer. Calling truncate_undo_list on
5400 Qt tends to return NULL, which effectively turns undo back on.
5401 So don't call truncate_undo_list if undo_list is Qt. */
e34f7f79 5402 if (! EQ (nextb->INTERNAL_FIELD (undo_list), Qt))
d17337e5
DA
5403 {
5404 Lisp_Object tail, prev;
e34f7f79 5405 tail = nextb->INTERNAL_FIELD (undo_list);
d17337e5
DA
5406 prev = Qnil;
5407 while (CONSP (tail))
5408 {
5409 if (CONSP (XCAR (tail))
5410 && MARKERP (XCAR (XCAR (tail)))
5411 && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
5412 {
5413 if (NILP (prev))
e34f7f79 5414 nextb->INTERNAL_FIELD (undo_list) = tail = XCDR (tail);
d17337e5
DA
5415 else
5416 {
5417 tail = XCDR (tail);
5418 XSETCDR (prev, tail);
5419 }
5420 }
5421 else
5422 {
5423 prev = tail;
5424 tail = XCDR (tail);
5425 }
5426 }
5427 }
5428 /* Now that we have stripped the elements that need not be in the
5429 undo_list any more, we can finally mark the list. */
e34f7f79 5430 mark_object (nextb->INTERNAL_FIELD (undo_list));
d17337e5 5431 }
4c315bda 5432
7146af97
JB
5433 gc_sweep ();
5434
5435 /* Clear the mark bits that we set in certain root slots. */
5436
033a5fa3 5437 unmark_byte_stack ();
3ef06d12
SM
5438 VECTOR_UNMARK (&buffer_defaults);
5439 VECTOR_UNMARK (&buffer_local_symbols);
7146af97 5440
34400008
GM
5441#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
5442 dump_zombies ();
5443#endif
5444
7e63e0c3 5445 check_cons_list ();
bbc012e0 5446
7146af97
JB
5447 gc_in_progress = 0;
5448
5c747675
DA
5449 unblock_input ();
5450
7146af97 5451 consing_since_gc = 0;
0dd6d66d
DA
5452 if (gc_cons_threshold < GC_DEFAULT_THRESHOLD / 10)
5453 gc_cons_threshold = GC_DEFAULT_THRESHOLD / 10;
7146af97 5454
c0c5c8ae 5455 gc_relative_threshold = 0;
96f077ad
SM
5456 if (FLOATP (Vgc_cons_percentage))
5457 { /* Set gc_cons_combined_threshold. */
12b3895d 5458 double tot = total_bytes_of_live_objects ();
ae35e756 5459
c0c5c8ae 5460 tot *= XFLOAT_DATA (Vgc_cons_percentage);
7216e43b 5461 if (0 < tot)
c0c5c8ae
PE
5462 {
5463 if (tot < TYPE_MAXIMUM (EMACS_INT))
5464 gc_relative_threshold = tot;
5465 else
5466 gc_relative_threshold = TYPE_MAXIMUM (EMACS_INT);
5467 }
96f077ad
SM
5468 }
5469
299585ee
RS
5470 if (garbage_collection_messages)
5471 {
6efc7df7
GM
5472 if (message_p || minibuf_level > 0)
5473 restore_message ();
299585ee
RS
5474 else
5475 message1_nolog ("Garbage collecting...done");
5476 }
7146af97 5477
98edb5ff 5478 unbind_to (count, Qnil);
fecbd8ff
SM
5479 {
5480 Lisp_Object total[11];
5481 int total_size = 10;
2e471eb5 5482
fecbd8ff
SM
5483 total[0] = list4 (Qconses, make_number (sizeof (struct Lisp_Cons)),
5484 bounded_number (total_conses),
5485 bounded_number (total_free_conses));
3ab6e069 5486
fecbd8ff
SM
5487 total[1] = list4 (Qsymbols, make_number (sizeof (struct Lisp_Symbol)),
5488 bounded_number (total_symbols),
5489 bounded_number (total_free_symbols));
3ab6e069 5490
fecbd8ff
SM
5491 total[2] = list4 (Qmiscs, make_number (sizeof (union Lisp_Misc)),
5492 bounded_number (total_markers),
5493 bounded_number (total_free_markers));
3ab6e069 5494
fecbd8ff
SM
5495 total[3] = list4 (Qstrings, make_number (sizeof (struct Lisp_String)),
5496 bounded_number (total_strings),
5497 bounded_number (total_free_strings));
3ab6e069 5498
fecbd8ff
SM
5499 total[4] = list3 (Qstring_bytes, make_number (1),
5500 bounded_number (total_string_bytes));
3ab6e069 5501
fbe9e0b9
PE
5502 total[5] = list3 (Qvectors,
5503 make_number (header_size + sizeof (Lisp_Object)),
fecbd8ff 5504 bounded_number (total_vectors));
5b835e1d 5505
fecbd8ff
SM
5506 total[6] = list4 (Qvector_slots, make_number (word_size),
5507 bounded_number (total_vector_slots),
5508 bounded_number (total_free_vector_slots));
5b835e1d 5509
fecbd8ff
SM
5510 total[7] = list4 (Qfloats, make_number (sizeof (struct Lisp_Float)),
5511 bounded_number (total_floats),
5512 bounded_number (total_free_floats));
3ab6e069 5513
fecbd8ff
SM
5514 total[8] = list4 (Qintervals, make_number (sizeof (struct interval)),
5515 bounded_number (total_intervals),
5516 bounded_number (total_free_intervals));
3ab6e069 5517
fecbd8ff
SM
5518 total[9] = list3 (Qbuffers, make_number (sizeof (struct buffer)),
5519 bounded_number (total_buffers));
2e471eb5 5520
f8643a6b 5521#ifdef DOUG_LEA_MALLOC
fecbd8ff
SM
5522 total_size++;
5523 total[10] = list4 (Qheap, make_number (1024),
5524 bounded_number ((mallinfo ().uordblks + 1023) >> 10),
5525 bounded_number ((mallinfo ().fordblks + 1023) >> 10));
f8643a6b 5526#endif
fecbd8ff
SM
5527 retval = Flist (total_size, total);
5528 }
f8643a6b 5529
34400008 5530#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
7146af97 5531 {
34400008 5532 /* Compute average percentage of zombies. */
fecbd8ff
SM
5533 double nlive
5534 = (total_conses + total_symbols + total_markers + total_strings
5535 + total_vectors + total_floats + total_intervals + total_buffers);
34400008
GM
5536
5537 avg_live = (avg_live * ngcs + nlive) / (ngcs + 1);
5538 max_live = max (nlive, max_live);
5539 avg_zombies = (avg_zombies * ngcs + nzombies) / (ngcs + 1);
5540 max_zombies = max (nzombies, max_zombies);
5541 ++ngcs;
dbcf001c 5542 }
34400008 5543#endif
7146af97 5544
9e713715
GM
5545 if (!NILP (Vpost_gc_hook))
5546 {
d311d28c 5547 ptrdiff_t gc_count = inhibit_garbage_collection ();
9e713715 5548 safe_run_hooks (Qpost_gc_hook);
ae35e756 5549 unbind_to (gc_count, Qnil);
9e713715 5550 }
2c5bd608
DL
5551
5552 /* Accumulate statistics. */
2c5bd608 5553 if (FLOATP (Vgc_elapsed))
387d4d92 5554 {
43aac990 5555 struct timespec since_start = timespec_sub (current_timespec (), start);
387d4d92 5556 Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed)
43aac990 5557 + timespectod (since_start));
387d4d92 5558 }
d35af63c 5559
2c5bd608
DL
5560 gcs_done++;
5561
12b3895d 5562 /* Collect profiling data. */
6521894d 5563 if (profiler_memory_running)
12b3895d
TM
5564 {
5565 size_t swept = 0;
6521894d
SM
5566 size_t tot_after = total_bytes_of_live_objects ();
5567 if (tot_before > tot_after)
5568 swept = tot_before - tot_after;
3d80c99f 5569 malloc_probe (swept);
12b3895d
TM
5570 }
5571
fecbd8ff 5572 return retval;
7146af97 5573}
34400008 5574
41c28a37 5575
3770920e
GM
5576/* Mark Lisp objects in glyph matrix MATRIX. Currently the
5577 only interesting objects referenced from glyphs are strings. */
41c28a37
GM
5578
5579static void
971de7fb 5580mark_glyph_matrix (struct glyph_matrix *matrix)
41c28a37
GM
5581{
5582 struct glyph_row *row = matrix->rows;
5583 struct glyph_row *end = row + matrix->nrows;
5584
2e471eb5
GM
5585 for (; row < end; ++row)
5586 if (row->enabled_p)
5587 {
5588 int area;
5589 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
5590 {
5591 struct glyph *glyph = row->glyphs[area];
5592 struct glyph *end_glyph = glyph + row->used[area];
177c0ea7 5593
2e471eb5 5594 for (; glyph < end_glyph; ++glyph)
8e50cc2d 5595 if (STRINGP (glyph->object)
2e471eb5 5596 && !STRING_MARKED_P (XSTRING (glyph->object)))
49723c04 5597 mark_object (glyph->object);
2e471eb5
GM
5598 }
5599 }
41c28a37
GM
5600}
5601
34400008 5602
41c28a37
GM
5603/* Mark Lisp faces in the face cache C. */
5604
5605static void
971de7fb 5606mark_face_cache (struct face_cache *c)
41c28a37
GM
5607{
5608 if (c)
5609 {
5610 int i, j;
5611 for (i = 0; i < c->used; ++i)
5612 {
5613 struct face *face = FACE_FROM_ID (c->f, i);
5614
5615 if (face)
5616 {
5617 for (j = 0; j < LFACE_VECTOR_SIZE; ++j)
49723c04 5618 mark_object (face->lface[j]);
41c28a37
GM
5619 }
5620 }
5621 }
5622}
5623
5624
7146af97 5625\f
1a4f1e2c 5626/* Mark reference to a Lisp_Object.
2e471eb5
GM
5627 If the object referred to has not been seen yet, recursively mark
5628 all the references contained in it. */
7146af97 5629
785cd37f 5630#define LAST_MARKED_SIZE 500
d3d47262 5631static Lisp_Object last_marked[LAST_MARKED_SIZE];
244ed907 5632static int last_marked_index;
785cd37f 5633
1342fc6f
RS
5634/* For debugging--call abort when we cdr down this many
5635 links of a list, in mark_object. In debugging,
5636 the call to abort will hit a breakpoint.
5637 Normally this is zero and the check never goes off. */
903fe15d 5638ptrdiff_t mark_object_loop_halt EXTERNALLY_VISIBLE;
1342fc6f 5639
8f11f7ec 5640static void
971de7fb 5641mark_vectorlike (struct Lisp_Vector *ptr)
d2029e5b 5642{
d311d28c
PE
5643 ptrdiff_t size = ptr->header.size;
5644 ptrdiff_t i;
d2029e5b 5645
8f11f7ec 5646 eassert (!VECTOR_MARKED_P (ptr));
7555c33f 5647 VECTOR_MARK (ptr); /* Else mark it. */
d2029e5b
SM
5648 if (size & PSEUDOVECTOR_FLAG)
5649 size &= PSEUDOVECTOR_SIZE_MASK;
d3d47262 5650
d2029e5b
SM
5651 /* Note that this size is not the memory-footprint size, but only
5652 the number of Lisp_Object fields that we should trace.
5653 The distinction is used e.g. by Lisp_Process which places extra
7555c33f
SM
5654 non-Lisp_Object fields at the end of the structure... */
5655 for (i = 0; i < size; i++) /* ...and then mark its elements. */
d2029e5b 5656 mark_object (ptr->contents[i]);
d2029e5b
SM
5657}
5658
58026347
KH
5659/* Like mark_vectorlike but optimized for char-tables (and
5660 sub-char-tables) assuming that the contents are mostly integers or
5661 symbols. */
5662
5663static void
971de7fb 5664mark_char_table (struct Lisp_Vector *ptr)
58026347 5665{
b6439961
PE
5666 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
5667 int i;
58026347 5668
8f11f7ec 5669 eassert (!VECTOR_MARKED_P (ptr));
58026347
KH
5670 VECTOR_MARK (ptr);
5671 for (i = 0; i < size; i++)
5672 {
5673 Lisp_Object val = ptr->contents[i];
5674
ef1b0ba7 5675 if (INTEGERP (val) || (SYMBOLP (val) && XSYMBOL (val)->gcmarkbit))
58026347
KH
5676 continue;
5677 if (SUB_CHAR_TABLE_P (val))
5678 {
5679 if (! VECTOR_MARKED_P (XVECTOR (val)))
5680 mark_char_table (XVECTOR (val));
5681 }
5682 else
5683 mark_object (val);
5684 }
5685}
5686
36429c89
DA
5687/* Mark the chain of overlays starting at PTR. */
5688
5689static void
5690mark_overlay (struct Lisp_Overlay *ptr)
5691{
5692 for (; ptr && !ptr->gcmarkbit; ptr = ptr->next)
5693 {
5694 ptr->gcmarkbit = 1;
c644523b
DA
5695 mark_object (ptr->start);
5696 mark_object (ptr->end);
5697 mark_object (ptr->plist);
36429c89
DA
5698 }
5699}
5700
5701/* Mark Lisp_Objects and special pointers in BUFFER. */
cf5c0175
DA
5702
5703static void
5704mark_buffer (struct buffer *buffer)
5705{
b4fa72f2
DA
5706 /* This is handled much like other pseudovectors... */
5707 mark_vectorlike ((struct Lisp_Vector *) buffer);
cf5c0175 5708
b4fa72f2 5709 /* ...but there are some buffer-specific things. */
cf5c0175 5710
b4fa72f2 5711 MARK_INTERVAL_TREE (buffer_intervals (buffer));
cf5c0175 5712
b4fa72f2
DA
5713 /* For now, we just don't mark the undo_list. It's done later in
5714 a special way just before the sweep phase, and after stripping
5715 some of its elements that are not needed any more. */
cf5c0175 5716
b4fa72f2
DA
5717 mark_overlay (buffer->overlays_before);
5718 mark_overlay (buffer->overlays_after);
cf5c0175 5719
b4fa72f2
DA
5720 /* If this is an indirect buffer, mark its base buffer. */
5721 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
5722 mark_buffer (buffer->base_buffer);
cf5c0175
DA
5723}
5724
d59a1afb 5725/* Remove killed buffers or items whose car is a killed buffer from
e99f70c8 5726 LIST, and mark other items. Return changed LIST, which is marked. */
d73e321c 5727
5779a1dc 5728static Lisp_Object
d59a1afb 5729mark_discard_killed_buffers (Lisp_Object list)
d73e321c 5730{
d59a1afb 5731 Lisp_Object tail, *prev = &list;
d73e321c 5732
d59a1afb
DA
5733 for (tail = list; CONSP (tail) && !CONS_MARKED_P (XCONS (tail));
5734 tail = XCDR (tail))
d73e321c 5735 {
5779a1dc 5736 Lisp_Object tem = XCAR (tail);
d73e321c
DA
5737 if (CONSP (tem))
5738 tem = XCAR (tem);
5739 if (BUFFERP (tem) && !BUFFER_LIVE_P (XBUFFER (tem)))
5779a1dc 5740 *prev = XCDR (tail);
d73e321c 5741 else
d59a1afb
DA
5742 {
5743 CONS_MARK (XCONS (tail));
5744 mark_object (XCAR (tail));
84575e67 5745 prev = xcdr_addr (tail);
d59a1afb 5746 }
d73e321c 5747 }
e99f70c8 5748 mark_object (tail);
d73e321c
DA
5749 return list;
5750}
5751
cf5c0175
DA
5752/* Determine type of generic Lisp_Object and mark it accordingly. */
5753
41c28a37 5754void
971de7fb 5755mark_object (Lisp_Object arg)
7146af97 5756{
49723c04 5757 register Lisp_Object obj = arg;
4f5c1376
GM
5758#ifdef GC_CHECK_MARKED_OBJECTS
5759 void *po;
5760 struct mem_node *m;
5761#endif
903fe15d 5762 ptrdiff_t cdr_count = 0;
7146af97 5763
9149e743 5764 loop:
7146af97 5765
1f0b3fd2 5766 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
5767 return;
5768
49723c04 5769 last_marked[last_marked_index++] = obj;
785cd37f
RS
5770 if (last_marked_index == LAST_MARKED_SIZE)
5771 last_marked_index = 0;
5772
4f5c1376
GM
5773 /* Perform some sanity checks on the objects marked here. Abort if
5774 we encounter an object we know is bogus. This increases GC time
5775 by ~80%, and requires compilation with GC_MARK_STACK != 0. */
5776#ifdef GC_CHECK_MARKED_OBJECTS
5777
5778 po = (void *) XPNTR (obj);
5779
5780 /* Check that the object pointed to by PO is known to be a Lisp
5781 structure allocated from the heap. */
5782#define CHECK_ALLOCATED() \
5783 do { \
5784 m = mem_find (po); \
5785 if (m == MEM_NIL) \
1088b922 5786 emacs_abort (); \
4f5c1376
GM
5787 } while (0)
5788
5789 /* Check that the object pointed to by PO is live, using predicate
5790 function LIVEP. */
5791#define CHECK_LIVE(LIVEP) \
5792 do { \
5793 if (!LIVEP (m, po)) \
1088b922 5794 emacs_abort (); \
4f5c1376
GM
5795 } while (0)
5796
5797 /* Check both of the above conditions. */
5798#define CHECK_ALLOCATED_AND_LIVE(LIVEP) \
5799 do { \
5800 CHECK_ALLOCATED (); \
5801 CHECK_LIVE (LIVEP); \
5802 } while (0) \
177c0ea7 5803
4f5c1376 5804#else /* not GC_CHECK_MARKED_OBJECTS */
177c0ea7 5805
4f5c1376
GM
5806#define CHECK_LIVE(LIVEP) (void) 0
5807#define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
177c0ea7 5808
4f5c1376
GM
5809#endif /* not GC_CHECK_MARKED_OBJECTS */
5810
7393bcbb 5811 switch (XTYPE (obj))
7146af97
JB
5812 {
5813 case Lisp_String:
5814 {
5815 register struct Lisp_String *ptr = XSTRING (obj);
8f11f7ec
SM
5816 if (STRING_MARKED_P (ptr))
5817 break;
4f5c1376 5818 CHECK_ALLOCATED_AND_LIVE (live_string_p);
2e471eb5 5819 MARK_STRING (ptr);
7555c33f 5820 MARK_INTERVAL_TREE (ptr->intervals);
361b097f 5821#ifdef GC_CHECK_STRING_BYTES
676a7251 5822 /* Check that the string size recorded in the string is the
7555c33f 5823 same as the one recorded in the sdata structure. */
e499d0ee 5824 string_bytes (ptr);
361b097f 5825#endif /* GC_CHECK_STRING_BYTES */
7146af97
JB
5826 }
5827 break;
5828
76437631 5829 case Lisp_Vectorlike:
cf5c0175
DA
5830 {
5831 register struct Lisp_Vector *ptr = XVECTOR (obj);
5832 register ptrdiff_t pvectype;
5833
5834 if (VECTOR_MARKED_P (ptr))
5835 break;
5836
4f5c1376 5837#ifdef GC_CHECK_MARKED_OBJECTS
cf5c0175 5838 m = mem_find (po);
c752cfa9 5839 if (m == MEM_NIL && !SUBRP (obj))
1088b922 5840 emacs_abort ();
4f5c1376 5841#endif /* GC_CHECK_MARKED_OBJECTS */
177c0ea7 5842
cf5c0175 5843 if (ptr->header.size & PSEUDOVECTOR_FLAG)
ee28be33 5844 pvectype = ((ptr->header.size & PVEC_TYPE_MASK)
914adc42 5845 >> PSEUDOVECTOR_AREA_BITS);
cf5c0175 5846 else
6aea7528 5847 pvectype = PVEC_NORMAL_VECTOR;
cf5c0175 5848
cf5c0175
DA
5849 if (pvectype != PVEC_SUBR && pvectype != PVEC_BUFFER)
5850 CHECK_LIVE (live_vector_p);
169ee243 5851
ee28be33 5852 switch (pvectype)
cf5c0175 5853 {
ee28be33 5854 case PVEC_BUFFER:
cf5c0175 5855#ifdef GC_CHECK_MARKED_OBJECTS
c752cfa9
DA
5856 {
5857 struct buffer *b;
5858 FOR_EACH_BUFFER (b)
5859 if (b == po)
5860 break;
5861 if (b == NULL)
5862 emacs_abort ();
5863 }
cf5c0175
DA
5864#endif /* GC_CHECK_MARKED_OBJECTS */
5865 mark_buffer ((struct buffer *) ptr);
ee28be33
SM
5866 break;
5867
5868 case PVEC_COMPILED:
5869 { /* We could treat this just like a vector, but it is better
5870 to save the COMPILED_CONSTANTS element for last and avoid
5871 recursion there. */
5872 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
5873 int i;
5874
5875 VECTOR_MARK (ptr);
5876 for (i = 0; i < size; i++)
5877 if (i != COMPILED_CONSTANTS)
5878 mark_object (ptr->contents[i]);
5879 if (size > COMPILED_CONSTANTS)
5880 {
5881 obj = ptr->contents[COMPILED_CONSTANTS];
5882 goto loop;
5883 }
5884 }
5885 break;
cf5c0175 5886
ee28be33 5887 case PVEC_FRAME:
d59a1afb
DA
5888 mark_vectorlike (ptr);
5889 mark_face_cache (((struct frame *) ptr)->face_cache);
ee28be33 5890 break;
cf5c0175 5891
ee28be33
SM
5892 case PVEC_WINDOW:
5893 {
5894 struct window *w = (struct window *) ptr;
5779a1dc 5895
0699fc18 5896 mark_vectorlike (ptr);
e99f70c8 5897
e74aeda8 5898 /* Mark glyph matrices, if any. Marking window
0699fc18
DA
5899 matrices is sufficient because frame matrices
5900 use the same glyph memory. */
e74aeda8 5901 if (w->current_matrix)
ee28be33 5902 {
0699fc18
DA
5903 mark_glyph_matrix (w->current_matrix);
5904 mark_glyph_matrix (w->desired_matrix);
ee28be33 5905 }
e99f70c8
SM
5906
5907 /* Filter out killed buffers from both buffer lists
5908 in attempt to help GC to reclaim killed buffers faster.
5909 We can do it elsewhere for live windows, but this is the
5910 best place to do it for dead windows. */
5911 wset_prev_buffers
5912 (w, mark_discard_killed_buffers (w->prev_buffers));
5913 wset_next_buffers
5914 (w, mark_discard_killed_buffers (w->next_buffers));
ee28be33
SM
5915 }
5916 break;
cf5c0175 5917
ee28be33
SM
5918 case PVEC_HASH_TABLE:
5919 {
5920 struct Lisp_Hash_Table *h = (struct Lisp_Hash_Table *) ptr;
cf5c0175 5921
ee28be33 5922 mark_vectorlike (ptr);
b7432bb2
SM
5923 mark_object (h->test.name);
5924 mark_object (h->test.user_hash_function);
5925 mark_object (h->test.user_cmp_function);
ee28be33
SM
5926 /* If hash table is not weak, mark all keys and values.
5927 For weak tables, mark only the vector. */
5928 if (NILP (h->weak))
5929 mark_object (h->key_and_value);
5930 else
5931 VECTOR_MARK (XVECTOR (h->key_and_value));
5932 }
5933 break;
cf5c0175 5934
ee28be33
SM
5935 case PVEC_CHAR_TABLE:
5936 mark_char_table (ptr);
5937 break;
cf5c0175 5938
ee28be33
SM
5939 case PVEC_BOOL_VECTOR:
5940 /* No Lisp_Objects to mark in a bool vector. */
5941 VECTOR_MARK (ptr);
5942 break;
cf5c0175 5943
ee28be33
SM
5944 case PVEC_SUBR:
5945 break;
cf5c0175 5946
ee28be33 5947 case PVEC_FREE:
1088b922 5948 emacs_abort ();
cf5c0175 5949
ee28be33
SM
5950 default:
5951 mark_vectorlike (ptr);
5952 }
cf5c0175 5953 }
169ee243 5954 break;
7146af97 5955
7146af97
JB
5956 case Lisp_Symbol:
5957 {
c70bbf06 5958 register struct Lisp_Symbol *ptr = XSYMBOL (obj);
7146af97
JB
5959 struct Lisp_Symbol *ptrx;
5960
8f11f7ec
SM
5961 if (ptr->gcmarkbit)
5962 break;
4f5c1376 5963 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
2336fe58 5964 ptr->gcmarkbit = 1;
c644523b
DA
5965 mark_object (ptr->function);
5966 mark_object (ptr->plist);
ce5b453a
SM
5967 switch (ptr->redirect)
5968 {
5969 case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
5970 case SYMBOL_VARALIAS:
5971 {
5972 Lisp_Object tem;
5973 XSETSYMBOL (tem, SYMBOL_ALIAS (ptr));
5974 mark_object (tem);
5975 break;
5976 }
5977 case SYMBOL_LOCALIZED:
5978 {
5979 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
d73e321c
DA
5980 Lisp_Object where = blv->where;
5981 /* If the value is set up for a killed buffer or deleted
5982 frame, restore it's global binding. If the value is
5983 forwarded to a C variable, either it's not a Lisp_Object
5984 var, or it's staticpro'd already. */
5985 if ((BUFFERP (where) && !BUFFER_LIVE_P (XBUFFER (where)))
5986 || (FRAMEP (where) && !FRAME_LIVE_P (XFRAME (where))))
5987 swap_in_global_binding (ptr);
ce5b453a
SM
5988 mark_object (blv->where);
5989 mark_object (blv->valcell);
5990 mark_object (blv->defcell);
5991 break;
5992 }
5993 case SYMBOL_FORWARDED:
5994 /* If the value is forwarded to a buffer or keyboard field,
5995 these are marked when we see the corresponding object.
5996 And if it's forwarded to a C variable, either it's not
5997 a Lisp_Object var, or it's staticpro'd already. */
5998 break;
1088b922 5999 default: emacs_abort ();
ce5b453a 6000 }
c644523b
DA
6001 if (!PURE_POINTER_P (XSTRING (ptr->name)))
6002 MARK_STRING (XSTRING (ptr->name));
0c94c8d6 6003 MARK_INTERVAL_TREE (string_intervals (ptr->name));
177c0ea7 6004
7146af97
JB
6005 ptr = ptr->next;
6006 if (ptr)
6007 {
7555c33f 6008 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun. */
7146af97 6009 XSETSYMBOL (obj, ptrx);
49723c04 6010 goto loop;
7146af97
JB
6011 }
6012 }
6013 break;
6014
a0a38eb7 6015 case Lisp_Misc:
4f5c1376 6016 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
b766f870 6017
7555c33f
SM
6018 if (XMISCANY (obj)->gcmarkbit)
6019 break;
6020
6021 switch (XMISCTYPE (obj))
a0a38eb7 6022 {
7555c33f
SM
6023 case Lisp_Misc_Marker:
6024 /* DO NOT mark thru the marker's chain.
6025 The buffer's markers chain does not preserve markers from gc;
6026 instead, markers are removed from the chain when freed by gc. */
36429c89 6027 XMISCANY (obj)->gcmarkbit = 1;
7555c33f 6028 break;
465edf35 6029
7555c33f
SM
6030 case Lisp_Misc_Save_Value:
6031 XMISCANY (obj)->gcmarkbit = 1;
7555c33f 6032 {
7b1123d8
PE
6033 struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj);
6034 /* If `save_type' is zero, `data[0].pointer' is the address
73ebd38f
DA
6035 of a memory area containing `data[1].integer' potential
6036 Lisp_Objects. */
7b1123d8 6037 if (GC_MARK_STACK && ptr->save_type == SAVE_TYPE_MEMORY)
7555c33f 6038 {
c50cf2ea 6039 Lisp_Object *p = ptr->data[0].pointer;
7555c33f 6040 ptrdiff_t nelt;
73ebd38f 6041 for (nelt = ptr->data[1].integer; nelt > 0; nelt--, p++)
7555c33f
SM
6042 mark_maybe_object (*p);
6043 }
73ebd38f 6044 else
73ebd38f
DA
6045 {
6046 /* Find Lisp_Objects in `data[N]' slots and mark them. */
7b1123d8
PE
6047 int i;
6048 for (i = 0; i < SAVE_VALUE_SLOTS; i++)
6049 if (save_type (ptr, i) == SAVE_OBJECT)
6050 mark_object (ptr->data[i].object);
73ebd38f 6051 }
7555c33f 6052 }
7555c33f
SM
6053 break;
6054
6055 case Lisp_Misc_Overlay:
6056 mark_overlay (XOVERLAY (obj));
6057 break;
6058
6059 default:
1088b922 6060 emacs_abort ();
a0a38eb7 6061 }
7146af97
JB
6062 break;
6063
6064 case Lisp_Cons:
7146af97
JB
6065 {
6066 register struct Lisp_Cons *ptr = XCONS (obj);
8f11f7ec
SM
6067 if (CONS_MARKED_P (ptr))
6068 break;
4f5c1376 6069 CHECK_ALLOCATED_AND_LIVE (live_cons_p);
08b7c2cb 6070 CONS_MARK (ptr);
c54ca951 6071 /* If the cdr is nil, avoid recursion for the car. */
c644523b 6072 if (EQ (ptr->u.cdr, Qnil))
c54ca951 6073 {
c644523b 6074 obj = ptr->car;
1342fc6f 6075 cdr_count = 0;
c54ca951
RS
6076 goto loop;
6077 }
c644523b
DA
6078 mark_object (ptr->car);
6079 obj = ptr->u.cdr;
1342fc6f
RS
6080 cdr_count++;
6081 if (cdr_count == mark_object_loop_halt)
1088b922 6082 emacs_abort ();
7146af97
JB
6083 goto loop;
6084 }
6085
7146af97 6086 case Lisp_Float:
4f5c1376 6087 CHECK_ALLOCATED_AND_LIVE (live_float_p);
ab6780cd 6088 FLOAT_MARK (XFLOAT (obj));
7146af97 6089 break;
7146af97 6090
2de9f71c 6091 case_Lisp_Int:
7146af97
JB
6092 break;
6093
6094 default:
1088b922 6095 emacs_abort ();
7146af97 6096 }
4f5c1376
GM
6097
6098#undef CHECK_LIVE
6099#undef CHECK_ALLOCATED
6100#undef CHECK_ALLOCATED_AND_LIVE
7146af97 6101}
4a729fd8 6102/* Mark the Lisp pointers in the terminal objects.
0ba2624f 6103 Called by Fgarbage_collect. */
4a729fd8 6104
4a729fd8
SM
6105static void
6106mark_terminals (void)
6107{
6108 struct terminal *t;
6109 for (t = terminal_list; t; t = t->next_terminal)
6110 {
6111 eassert (t->name != NULL);
354884c4 6112#ifdef HAVE_WINDOW_SYSTEM
96ad0af7
YM
6113 /* If a terminal object is reachable from a stacpro'ed object,
6114 it might have been marked already. Make sure the image cache
6115 gets marked. */
6116 mark_image_cache (t->image_cache);
354884c4 6117#endif /* HAVE_WINDOW_SYSTEM */
96ad0af7
YM
6118 if (!VECTOR_MARKED_P (t))
6119 mark_vectorlike ((struct Lisp_Vector *)t);
4a729fd8
SM
6120 }
6121}
6122
6123
084b1a0c 6124
41c28a37
GM
6125/* Value is non-zero if OBJ will survive the current GC because it's
6126 either marked or does not need to be marked to survive. */
6127
fce31d69 6128bool
971de7fb 6129survives_gc_p (Lisp_Object obj)
41c28a37 6130{
fce31d69 6131 bool survives_p;
177c0ea7 6132
8e50cc2d 6133 switch (XTYPE (obj))
41c28a37 6134 {
2de9f71c 6135 case_Lisp_Int:
41c28a37
GM
6136 survives_p = 1;
6137 break;
6138
6139 case Lisp_Symbol:
2336fe58 6140 survives_p = XSYMBOL (obj)->gcmarkbit;
41c28a37
GM
6141 break;
6142
6143 case Lisp_Misc:
67ee9f6e 6144 survives_p = XMISCANY (obj)->gcmarkbit;
41c28a37
GM
6145 break;
6146
6147 case Lisp_String:
08b7c2cb 6148 survives_p = STRING_MARKED_P (XSTRING (obj));
41c28a37
GM
6149 break;
6150
6151 case Lisp_Vectorlike:
8e50cc2d 6152 survives_p = SUBRP (obj) || VECTOR_MARKED_P (XVECTOR (obj));
41c28a37
GM
6153 break;
6154
6155 case Lisp_Cons:
08b7c2cb 6156 survives_p = CONS_MARKED_P (XCONS (obj));
41c28a37
GM
6157 break;
6158
41c28a37 6159 case Lisp_Float:
ab6780cd 6160 survives_p = FLOAT_MARKED_P (XFLOAT (obj));
41c28a37 6161 break;
41c28a37
GM
6162
6163 default:
1088b922 6164 emacs_abort ();
41c28a37
GM
6165 }
6166
34400008 6167 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj));
41c28a37
GM
6168}
6169
6170
7146af97 6171\f
1a4f1e2c 6172/* Sweep: find all structures not marked, and free them. */
7146af97
JB
6173
6174static void
971de7fb 6175gc_sweep (void)
7146af97 6176{
41c28a37
GM
6177 /* Remove or mark entries in weak hash tables.
6178 This must be done before any object is unmarked. */
6179 sweep_weak_hash_tables ();
6180
2e471eb5 6181 sweep_strings ();
e499d0ee 6182 check_string_bytes (!noninteractive);
7146af97
JB
6183
6184 /* Put all unmarked conses on free list */
6185 {
6186 register struct cons_block *cblk;
6ca94ac9 6187 struct cons_block **cprev = &cons_block;
7146af97 6188 register int lim = cons_block_index;
c0c5c8ae 6189 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
6190
6191 cons_free_list = 0;
177c0ea7 6192
6ca94ac9 6193 for (cblk = cons_block; cblk; cblk = *cprev)
7146af97 6194 {
3ae2e3a3 6195 register int i = 0;
6ca94ac9 6196 int this_free = 0;
3ae2e3a3
RS
6197 int ilim = (lim + BITS_PER_INT - 1) / BITS_PER_INT;
6198
6199 /* Scan the mark bits an int at a time. */
47ea7f44 6200 for (i = 0; i < ilim; i++)
3ae2e3a3
RS
6201 {
6202 if (cblk->gcmarkbits[i] == -1)
6203 {
6204 /* Fast path - all cons cells for this int are marked. */
6205 cblk->gcmarkbits[i] = 0;
6206 num_used += BITS_PER_INT;
6207 }
6208 else
6209 {
6210 /* Some cons cells for this int are not marked.
6211 Find which ones, and free them. */
6212 int start, pos, stop;
6213
6214 start = i * BITS_PER_INT;
6215 stop = lim - start;
6216 if (stop > BITS_PER_INT)
6217 stop = BITS_PER_INT;
6218 stop += start;
6219
6220 for (pos = start; pos < stop; pos++)
6221 {
6222 if (!CONS_MARKED_P (&cblk->conses[pos]))
6223 {
6224 this_free++;
6225 cblk->conses[pos].u.chain = cons_free_list;
6226 cons_free_list = &cblk->conses[pos];
34400008 6227#if GC_MARK_STACK
c644523b 6228 cons_free_list->car = Vdead;
34400008 6229#endif
3ae2e3a3
RS
6230 }
6231 else
6232 {
6233 num_used++;
6234 CONS_UNMARK (&cblk->conses[pos]);
6235 }
6236 }
6237 }
6238 }
6239
7146af97 6240 lim = CONS_BLOCK_SIZE;
6ca94ac9
KH
6241 /* If this block contains only free conses and we have already
6242 seen more than two blocks worth of free conses then deallocate
6243 this block. */
6feef451 6244 if (this_free == CONS_BLOCK_SIZE && num_free > CONS_BLOCK_SIZE)
6ca94ac9 6245 {
6ca94ac9
KH
6246 *cprev = cblk->next;
6247 /* Unhook from the free list. */
28a099a4 6248 cons_free_list = cblk->conses[0].u.chain;
08b7c2cb 6249 lisp_align_free (cblk);
6ca94ac9
KH
6250 }
6251 else
6feef451
AS
6252 {
6253 num_free += this_free;
6254 cprev = &cblk->next;
6255 }
7146af97
JB
6256 }
6257 total_conses = num_used;
6258 total_free_conses = num_free;
6259 }
6260
7146af97
JB
6261 /* Put all unmarked floats on free list */
6262 {
6263 register struct float_block *fblk;
6ca94ac9 6264 struct float_block **fprev = &float_block;
7146af97 6265 register int lim = float_block_index;
c0c5c8ae 6266 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
6267
6268 float_free_list = 0;
177c0ea7 6269
6ca94ac9 6270 for (fblk = float_block; fblk; fblk = *fprev)
7146af97
JB
6271 {
6272 register int i;
6ca94ac9 6273 int this_free = 0;
7146af97 6274 for (i = 0; i < lim; i++)
ab6780cd 6275 if (!FLOAT_MARKED_P (&fblk->floats[i]))
7146af97 6276 {
6ca94ac9 6277 this_free++;
28a099a4 6278 fblk->floats[i].u.chain = float_free_list;
7146af97
JB
6279 float_free_list = &fblk->floats[i];
6280 }
6281 else
6282 {
6283 num_used++;
ab6780cd 6284 FLOAT_UNMARK (&fblk->floats[i]);
7146af97
JB
6285 }
6286 lim = FLOAT_BLOCK_SIZE;
6ca94ac9
KH
6287 /* If this block contains only free floats and we have already
6288 seen more than two blocks worth of free floats then deallocate
6289 this block. */
6feef451 6290 if (this_free == FLOAT_BLOCK_SIZE && num_free > FLOAT_BLOCK_SIZE)
6ca94ac9 6291 {
6ca94ac9
KH
6292 *fprev = fblk->next;
6293 /* Unhook from the free list. */
28a099a4 6294 float_free_list = fblk->floats[0].u.chain;
ab6780cd 6295 lisp_align_free (fblk);
6ca94ac9
KH
6296 }
6297 else
6feef451
AS
6298 {
6299 num_free += this_free;
6300 fprev = &fblk->next;
6301 }
7146af97
JB
6302 }
6303 total_floats = num_used;
6304 total_free_floats = num_free;
6305 }
7146af97 6306
d5e35230
JA
6307 /* Put all unmarked intervals on free list */
6308 {
6309 register struct interval_block *iblk;
6ca94ac9 6310 struct interval_block **iprev = &interval_block;
d5e35230 6311 register int lim = interval_block_index;
c0c5c8ae 6312 EMACS_INT num_free = 0, num_used = 0;
d5e35230
JA
6313
6314 interval_free_list = 0;
6315
6ca94ac9 6316 for (iblk = interval_block; iblk; iblk = *iprev)
d5e35230
JA
6317 {
6318 register int i;
6ca94ac9 6319 int this_free = 0;
d5e35230
JA
6320
6321 for (i = 0; i < lim; i++)
6322 {
2336fe58 6323 if (!iblk->intervals[i].gcmarkbit)
d5e35230 6324 {
0c94c8d6 6325 set_interval_parent (&iblk->intervals[i], interval_free_list);
d5e35230 6326 interval_free_list = &iblk->intervals[i];
6ca94ac9 6327 this_free++;
d5e35230
JA
6328 }
6329 else
6330 {
6331 num_used++;
2336fe58 6332 iblk->intervals[i].gcmarkbit = 0;
d5e35230
JA
6333 }
6334 }
6335 lim = INTERVAL_BLOCK_SIZE;
6ca94ac9
KH
6336 /* If this block contains only free intervals and we have already
6337 seen more than two blocks worth of free intervals then
6338 deallocate this block. */
6feef451 6339 if (this_free == INTERVAL_BLOCK_SIZE && num_free > INTERVAL_BLOCK_SIZE)
6ca94ac9 6340 {
6ca94ac9
KH
6341 *iprev = iblk->next;
6342 /* Unhook from the free list. */
439d5cb4 6343 interval_free_list = INTERVAL_PARENT (&iblk->intervals[0]);
c8099634 6344 lisp_free (iblk);
6ca94ac9
KH
6345 }
6346 else
6feef451
AS
6347 {
6348 num_free += this_free;
6349 iprev = &iblk->next;
6350 }
d5e35230
JA
6351 }
6352 total_intervals = num_used;
6353 total_free_intervals = num_free;
6354 }
d5e35230 6355
7146af97
JB
6356 /* Put all unmarked symbols on free list */
6357 {
6358 register struct symbol_block *sblk;
6ca94ac9 6359 struct symbol_block **sprev = &symbol_block;
7146af97 6360 register int lim = symbol_block_index;
c0c5c8ae 6361 EMACS_INT num_free = 0, num_used = 0;
7146af97 6362
d285b373 6363 symbol_free_list = NULL;
177c0ea7 6364
6ca94ac9 6365 for (sblk = symbol_block; sblk; sblk = *sprev)
7146af97 6366 {
6ca94ac9 6367 int this_free = 0;
d55c12ed
AS
6368 union aligned_Lisp_Symbol *sym = sblk->symbols;
6369 union aligned_Lisp_Symbol *end = sym + lim;
d285b373
GM
6370
6371 for (; sym < end; ++sym)
6372 {
20035321
SM
6373 /* Check if the symbol was created during loadup. In such a case
6374 it might be pointed to by pure bytecode which we don't trace,
6375 so we conservatively assume that it is live. */
fce31d69 6376 bool pure_p = PURE_POINTER_P (XSTRING (sym->s.name));
177c0ea7 6377
d55c12ed 6378 if (!sym->s.gcmarkbit && !pure_p)
d285b373 6379 {
d55c12ed
AS
6380 if (sym->s.redirect == SYMBOL_LOCALIZED)
6381 xfree (SYMBOL_BLV (&sym->s));
6382 sym->s.next = symbol_free_list;
6383 symbol_free_list = &sym->s;
34400008 6384#if GC_MARK_STACK
c644523b 6385 symbol_free_list->function = Vdead;
34400008 6386#endif
d285b373
GM
6387 ++this_free;
6388 }
6389 else
6390 {
6391 ++num_used;
6392 if (!pure_p)
c644523b 6393 UNMARK_STRING (XSTRING (sym->s.name));
d55c12ed 6394 sym->s.gcmarkbit = 0;
d285b373
GM
6395 }
6396 }
177c0ea7 6397
7146af97 6398 lim = SYMBOL_BLOCK_SIZE;
6ca94ac9
KH
6399 /* If this block contains only free symbols and we have already
6400 seen more than two blocks worth of free symbols then deallocate
6401 this block. */
6feef451 6402 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)
6ca94ac9 6403 {
6ca94ac9
KH
6404 *sprev = sblk->next;
6405 /* Unhook from the free list. */
d55c12ed 6406 symbol_free_list = sblk->symbols[0].s.next;
c8099634 6407 lisp_free (sblk);
6ca94ac9
KH
6408 }
6409 else
6feef451
AS
6410 {
6411 num_free += this_free;
6412 sprev = &sblk->next;
6413 }
7146af97
JB
6414 }
6415 total_symbols = num_used;
6416 total_free_symbols = num_free;
6417 }
6418
a9faeabe
RS
6419 /* Put all unmarked misc's on free list.
6420 For a marker, first unchain it from the buffer it points into. */
7146af97
JB
6421 {
6422 register struct marker_block *mblk;
6ca94ac9 6423 struct marker_block **mprev = &marker_block;
7146af97 6424 register int lim = marker_block_index;
c0c5c8ae 6425 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
6426
6427 marker_free_list = 0;
177c0ea7 6428
6ca94ac9 6429 for (mblk = marker_block; mblk; mblk = *mprev)
7146af97
JB
6430 {
6431 register int i;
6ca94ac9 6432 int this_free = 0;
fa05e253 6433
7146af97 6434 for (i = 0; i < lim; i++)
465edf35 6435 {
d55c12ed 6436 if (!mblk->markers[i].m.u_any.gcmarkbit)
465edf35 6437 {
d55c12ed
AS
6438 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker)
6439 unchain_marker (&mblk->markers[i].m.u_marker);
fa05e253
RS
6440 /* Set the type of the freed object to Lisp_Misc_Free.
6441 We could leave the type alone, since nobody checks it,
465edf35 6442 but this might catch bugs faster. */
d55c12ed
AS
6443 mblk->markers[i].m.u_marker.type = Lisp_Misc_Free;
6444 mblk->markers[i].m.u_free.chain = marker_free_list;
6445 marker_free_list = &mblk->markers[i].m;
6ca94ac9 6446 this_free++;
465edf35
KH
6447 }
6448 else
6449 {
6450 num_used++;
d55c12ed 6451 mblk->markers[i].m.u_any.gcmarkbit = 0;
465edf35
KH
6452 }
6453 }
7146af97 6454 lim = MARKER_BLOCK_SIZE;
6ca94ac9
KH
6455 /* If this block contains only free markers and we have already
6456 seen more than two blocks worth of free markers then deallocate
6457 this block. */
6feef451 6458 if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE)
6ca94ac9 6459 {
6ca94ac9
KH
6460 *mprev = mblk->next;
6461 /* Unhook from the free list. */
d55c12ed 6462 marker_free_list = mblk->markers[0].m.u_free.chain;
c8099634 6463 lisp_free (mblk);
6ca94ac9
KH
6464 }
6465 else
6feef451
AS
6466 {
6467 num_free += this_free;
6468 mprev = &mblk->next;
6469 }
7146af97
JB
6470 }
6471
6472 total_markers = num_used;
6473 total_free_markers = num_free;
6474 }
6475
6476 /* Free all unmarked buffers */
6477 {
3e98c68e 6478 register struct buffer *buffer, **bprev = &all_buffers;
7146af97 6479
3ab6e069 6480 total_buffers = 0;
3e98c68e 6481 for (buffer = all_buffers; buffer; buffer = *bprev)
3ef06d12 6482 if (!VECTOR_MARKED_P (buffer))
7146af97 6483 {
914adc42 6484 *bprev = buffer->next;
34400008 6485 lisp_free (buffer);
7146af97
JB
6486 }
6487 else
6488 {
3ef06d12 6489 VECTOR_UNMARK (buffer);
8707c1e5
DA
6490 /* Do not use buffer_(set|get)_intervals here. */
6491 buffer->text->intervals = balance_intervals (buffer->text->intervals);
3ab6e069 6492 total_buffers++;
914adc42 6493 bprev = &buffer->next;
7146af97
JB
6494 }
6495 }
6496
f3372c87 6497 sweep_vectors ();
e499d0ee 6498 check_string_bytes (!noninteractive);
7146af97 6499}
7146af97 6500
7146af97 6501
7146af97 6502
7146af97 6503\f
20d24714
JB
6504/* Debugging aids. */
6505
31ce1c91 6506DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
a6266d23 6507 doc: /* Return the address of the last byte Emacs has allocated, divided by 1024.
228299fa 6508This may be helpful in debugging Emacs's memory usage.
7ee72033 6509We divide the value by 1024 to make sure it fits in a Lisp integer. */)
5842a27b 6510 (void)
20d24714
JB
6511{
6512 Lisp_Object end;
6513
d01a7826 6514 XSETINT (end, (intptr_t) (char *) sbrk (0) / 1024);
20d24714
JB
6515
6516 return end;
6517}
6518
310ea200 6519DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
a6266d23 6520 doc: /* Return a list of counters that measure how much consing there has been.
228299fa
GM
6521Each of these counters increments for a certain kind of object.
6522The counters wrap around from the largest positive integer to zero.
6523Garbage collection does not decrease them.
6524The elements of the value are as follows:
6525 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS STRINGS)
6526All are in units of 1 = one object consed
6527except for VECTOR-CELLS and STRING-CHARS, which count the total length of
6528objects consed.
6529MISCS include overlays, markers, and some internal types.
6530Frames, windows, buffers, and subprocesses count as vectors
7ee72033 6531 (but the contents of a buffer's text do not count here). */)
5842a27b 6532 (void)
310ea200 6533{
3438fe21 6534 return listn (CONSTYPE_HEAP, 8,
694b6c97
DA
6535 bounded_number (cons_cells_consed),
6536 bounded_number (floats_consed),
6537 bounded_number (vector_cells_consed),
6538 bounded_number (symbols_consed),
6539 bounded_number (string_chars_consed),
6540 bounded_number (misc_objects_consed),
6541 bounded_number (intervals_consed),
6542 bounded_number (strings_consed));
310ea200 6543}
e0b8c689 6544
8b058d44
EZ
6545/* Find at most FIND_MAX symbols which have OBJ as their value or
6546 function. This is used in gdbinit's `xwhichsymbols' command. */
6547
6548Lisp_Object
196e41e4 6549which_symbols (Lisp_Object obj, EMACS_INT find_max)
8b058d44
EZ
6550{
6551 struct symbol_block *sblk;
8d0eb4c2 6552 ptrdiff_t gc_count = inhibit_garbage_collection ();
8b058d44
EZ
6553 Lisp_Object found = Qnil;
6554
ca78dc43 6555 if (! DEADP (obj))
8b058d44
EZ
6556 {
6557 for (sblk = symbol_block; sblk; sblk = sblk->next)
6558 {
9426aba4 6559 union aligned_Lisp_Symbol *aligned_sym = sblk->symbols;
8b058d44
EZ
6560 int bn;
6561
9426aba4 6562 for (bn = 0; bn < SYMBOL_BLOCK_SIZE; bn++, aligned_sym++)
8b058d44 6563 {
9426aba4 6564 struct Lisp_Symbol *sym = &aligned_sym->s;
8b058d44
EZ
6565 Lisp_Object val;
6566 Lisp_Object tem;
6567
6568 if (sblk == symbol_block && bn >= symbol_block_index)
6569 break;
6570
6571 XSETSYMBOL (tem, sym);
6572 val = find_symbol_value (tem);
6573 if (EQ (val, obj)
c644523b
DA
6574 || EQ (sym->function, obj)
6575 || (!NILP (sym->function)
6576 && COMPILEDP (sym->function)
6577 && EQ (AREF (sym->function, COMPILED_BYTECODE), obj))
8b058d44
EZ
6578 || (!NILP (val)
6579 && COMPILEDP (val)
6580 && EQ (AREF (val, COMPILED_BYTECODE), obj)))
6581 {
6582 found = Fcons (tem, found);
6583 if (--find_max == 0)
6584 goto out;
6585 }
6586 }
6587 }
6588 }
6589
6590 out:
6591 unbind_to (gc_count, Qnil);
6592 return found;
6593}
6594
244ed907 6595#ifdef ENABLE_CHECKING
f4a681b0 6596
fce31d69 6597bool suppress_checking;
d3d47262 6598
e0b8c689 6599void
971de7fb 6600die (const char *msg, const char *file, int line)
e0b8c689 6601{
5013fc08 6602 fprintf (stderr, "\r\n%s:%d: Emacs fatal error: assertion failed: %s\r\n",
e0b8c689 6603 file, line, msg);
4d7e6e51 6604 terminate_due_to_signal (SIGABRT, INT_MAX);
e0b8c689 6605}
244ed907 6606#endif
20d24714 6607\f
b09cca6a 6608/* Initialization. */
7146af97 6609
dfcf069d 6610void
971de7fb 6611init_alloc_once (void)
7146af97
JB
6612{
6613 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
9e713715
GM
6614 purebeg = PUREBEG;
6615 pure_size = PURESIZE;
ab6780cd 6616
877935b1 6617#if GC_MARK_STACK || defined GC_MALLOC_CHECK
34400008
GM
6618 mem_init ();
6619 Vdead = make_pure_string ("DEAD", 4, 4, 0);
6620#endif
9e713715 6621
d1658221 6622#ifdef DOUG_LEA_MALLOC
b09cca6a
SM
6623 mallopt (M_TRIM_THRESHOLD, 128 * 1024); /* Trim threshold. */
6624 mallopt (M_MMAP_THRESHOLD, 64 * 1024); /* Mmap threshold. */
6625 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); /* Max. number of mmap'ed areas. */
d1658221 6626#endif
7146af97 6627 init_strings ();
f3372c87 6628 init_vectors ();
d5e35230 6629
24d8a105 6630 refill_memory_reserve ();
0dd6d66d 6631 gc_cons_threshold = GC_DEFAULT_THRESHOLD;
7146af97
JB
6632}
6633
dfcf069d 6634void
971de7fb 6635init_alloc (void)
7146af97
JB
6636{
6637 gcprolist = 0;
630686c8 6638 byte_stack_list = 0;
182ff242
GM
6639#if GC_MARK_STACK
6640#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
6641 setjmp_tested_p = longjmps_done = 0;
6642#endif
6643#endif
2c5bd608
DL
6644 Vgc_elapsed = make_float (0.0);
6645 gcs_done = 0;
7146af97
JB
6646}
6647
6648void
971de7fb 6649syms_of_alloc (void)
7146af97 6650{
29208e82 6651 DEFVAR_INT ("gc-cons-threshold", gc_cons_threshold,
fb7ada5f 6652 doc: /* Number of bytes of consing between garbage collections.
228299fa
GM
6653Garbage collection can happen automatically once this many bytes have been
6654allocated since the last garbage collection. All data types count.
7146af97 6655
228299fa 6656Garbage collection happens automatically only when `eval' is called.
7146af97 6657
228299fa 6658By binding this temporarily to a large number, you can effectively
96f077ad
SM
6659prevent garbage collection during a part of the program.
6660See also `gc-cons-percentage'. */);
6661
29208e82 6662 DEFVAR_LISP ("gc-cons-percentage", Vgc_cons_percentage,
fb7ada5f 6663 doc: /* Portion of the heap used for allocation.
96f077ad
SM
6664Garbage collection can happen automatically once this portion of the heap
6665has been allocated since the last garbage collection.
6666If this portion is smaller than `gc-cons-threshold', this is ignored. */);
6667 Vgc_cons_percentage = make_float (0.1);
0819585c 6668
29208e82 6669 DEFVAR_INT ("pure-bytes-used", pure_bytes_used,
333f9019 6670 doc: /* Number of bytes of shareable Lisp data allocated so far. */);
0819585c 6671
29208e82 6672 DEFVAR_INT ("cons-cells-consed", cons_cells_consed,
a6266d23 6673 doc: /* Number of cons cells that have been consed so far. */);
0819585c 6674
29208e82 6675 DEFVAR_INT ("floats-consed", floats_consed,
a6266d23 6676 doc: /* Number of floats that have been consed so far. */);
0819585c 6677
29208e82 6678 DEFVAR_INT ("vector-cells-consed", vector_cells_consed,
a6266d23 6679 doc: /* Number of vector cells that have been consed so far. */);
0819585c 6680
29208e82 6681 DEFVAR_INT ("symbols-consed", symbols_consed,
a6266d23 6682 doc: /* Number of symbols that have been consed so far. */);
0819585c 6683
29208e82 6684 DEFVAR_INT ("string-chars-consed", string_chars_consed,
a6266d23 6685 doc: /* Number of string characters that have been consed so far. */);
0819585c 6686
29208e82 6687 DEFVAR_INT ("misc-objects-consed", misc_objects_consed,
01a6dcc8
GM
6688 doc: /* Number of miscellaneous objects that have been consed so far.
6689These include markers and overlays, plus certain objects not visible
6690to users. */);
2e471eb5 6691
29208e82 6692 DEFVAR_INT ("intervals-consed", intervals_consed,
a6266d23 6693 doc: /* Number of intervals that have been consed so far. */);
7146af97 6694
29208e82 6695 DEFVAR_INT ("strings-consed", strings_consed,
a6266d23 6696 doc: /* Number of strings that have been consed so far. */);
228299fa 6697
29208e82 6698 DEFVAR_LISP ("purify-flag", Vpurify_flag,
a6266d23 6699 doc: /* Non-nil means loading Lisp code in order to dump an executable.
e9515805
SM
6700This means that certain objects should be allocated in shared (pure) space.
6701It can also be set to a hash-table, in which case this table is used to
6702do hash-consing of the objects allocated to pure space. */);
228299fa 6703
29208e82 6704 DEFVAR_BOOL ("garbage-collection-messages", garbage_collection_messages,
a6266d23 6705 doc: /* Non-nil means display messages at start and end of garbage collection. */);
299585ee
RS
6706 garbage_collection_messages = 0;
6707
29208e82 6708 DEFVAR_LISP ("post-gc-hook", Vpost_gc_hook,
a6266d23 6709 doc: /* Hook run after garbage collection has finished. */);
9e713715 6710 Vpost_gc_hook = Qnil;
cd3520a4 6711 DEFSYM (Qpost_gc_hook, "post-gc-hook");
9e713715 6712
29208e82 6713 DEFVAR_LISP ("memory-signal-data", Vmemory_signal_data,
74a54b04 6714 doc: /* Precomputed `signal' argument for memory-full error. */);
bcb61d60
KH
6715 /* We build this in advance because if we wait until we need it, we might
6716 not be able to allocate the memory to hold it. */
74a54b04 6717 Vmemory_signal_data
3438fe21 6718 = listn (CONSTYPE_PURE, 2, Qerror,
694b6c97 6719 build_pure_c_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs"));
74a54b04 6720
29208e82 6721 DEFVAR_LISP ("memory-full", Vmemory_full,
24d8a105 6722 doc: /* Non-nil means Emacs cannot get much more Lisp memory. */);
74a54b04 6723 Vmemory_full = Qnil;
bcb61d60 6724
fecbd8ff
SM
6725 DEFSYM (Qconses, "conses");
6726 DEFSYM (Qsymbols, "symbols");
6727 DEFSYM (Qmiscs, "miscs");
6728 DEFSYM (Qstrings, "strings");
6729 DEFSYM (Qvectors, "vectors");
6730 DEFSYM (Qfloats, "floats");
6731 DEFSYM (Qintervals, "intervals");
6732 DEFSYM (Qbuffers, "buffers");
5b835e1d
DA
6733 DEFSYM (Qstring_bytes, "string-bytes");
6734 DEFSYM (Qvector_slots, "vector-slots");
f8643a6b 6735 DEFSYM (Qheap, "heap");
3d80c99f 6736 DEFSYM (Qautomatic_gc, "Automatic GC");
5b835e1d 6737
cd3520a4
JB
6738 DEFSYM (Qgc_cons_threshold, "gc-cons-threshold");
6739 DEFSYM (Qchar_table_extra_slots, "char-table-extra-slots");
a59de17b 6740
29208e82 6741 DEFVAR_LISP ("gc-elapsed", Vgc_elapsed,
2c5bd608 6742 doc: /* Accumulated time elapsed in garbage collections.
e7415487 6743The time is in seconds as a floating point value. */);
29208e82 6744 DEFVAR_INT ("gcs-done", gcs_done,
e7415487 6745 doc: /* Accumulated number of garbage collections done. */);
2c5bd608 6746
7146af97
JB
6747 defsubr (&Scons);
6748 defsubr (&Slist);
6749 defsubr (&Svector);
6750 defsubr (&Smake_byte_code);
6751 defsubr (&Smake_list);
6752 defsubr (&Smake_vector);
6753 defsubr (&Smake_string);
7b07587b 6754 defsubr (&Smake_bool_vector);
7146af97
JB
6755 defsubr (&Smake_symbol);
6756 defsubr (&Smake_marker);
6757 defsubr (&Spurecopy);
6758 defsubr (&Sgarbage_collect);
20d24714 6759 defsubr (&Smemory_limit);
310ea200 6760 defsubr (&Smemory_use_counts);
34400008
GM
6761
6762#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
6763 defsubr (&Sgc_status);
6764#endif
7146af97 6765}
5eceb8fb 6766
4706125e
PE
6767/* When compiled with GCC, GDB might say "No enum type named
6768 pvec_type" if we don't have at least one symbol with that type, and
6769 then xbacktrace could fail. Similarly for the other enums and
62aba0d4
FP
6770 their values. Some non-GCC compilers don't like these constructs. */
6771#ifdef __GNUC__
4706125e
PE
6772union
6773{
03a660a6
PE
6774 enum CHARTAB_SIZE_BITS CHARTAB_SIZE_BITS;
6775 enum CHAR_TABLE_STANDARD_SLOTS CHAR_TABLE_STANDARD_SLOTS;
6776 enum char_bits char_bits;
4706125e 6777 enum CHECK_LISP_OBJECT_TYPE CHECK_LISP_OBJECT_TYPE;
03a660a6 6778 enum DEFAULT_HASH_SIZE DEFAULT_HASH_SIZE;
4706125e 6779 enum enum_USE_LSB_TAG enum_USE_LSB_TAG;
03a660a6 6780 enum FLOAT_TO_STRING_BUFSIZE FLOAT_TO_STRING_BUFSIZE;
4706125e 6781 enum Lisp_Bits Lisp_Bits;
03a660a6
PE
6782 enum Lisp_Compiled Lisp_Compiled;
6783 enum maxargs maxargs;
6784 enum MAX_ALLOCA MAX_ALLOCA;
4706125e
PE
6785 enum More_Lisp_Bits More_Lisp_Bits;
6786 enum pvec_type pvec_type;
6787} const EXTERNALLY_VISIBLE gdb_make_enums_visible = {0};
62aba0d4 6788#endif /* __GNUC__ */