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