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