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