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