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