Merge from emacs-24; up to 2014-05-12T06:15:47Z!rgm@gnu.org
[bpt/emacs.git] / src / alloc.c
CommitLineData
7146af97 1/* Storage allocation and gc for GNU Emacs Lisp interpreter.
999dd333 2
ba318903 3Copyright (C) 1985-1986, 1988, 1993-1995, 1997-2014 Free Software
ab422c4d 4Foundation, Inc.
7146af97
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
7146af97 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
7146af97
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
7146af97 20
18160b98 21#include <config.h>
f162bcc3 22
e9b309ac 23#include <stdio.h>
ab6780cd 24#include <limits.h> /* For CHAR_BIT. */
92939d31 25
bc8000ff 26#ifdef ENABLE_CHECKING
b09cca6a 27#include <signal.h> /* For SIGABRT. */
bc8000ff
EZ
28#endif
29
ae9e757a 30#ifdef HAVE_PTHREAD
aa477689
JD
31#include <pthread.h>
32#endif
33
7146af97 34#include "lisp.h"
ece93c02 35#include "process.h"
d5e35230 36#include "intervals.h"
4c0be5f4 37#include "puresize.h"
e5560ff7 38#include "character.h"
7146af97
JB
39#include "buffer.h"
40#include "window.h"
2538fae4 41#include "keyboard.h"
502b9b64 42#include "frame.h"
9ac0d9e0 43#include "blockinput.h"
4a729fd8 44#include "termhooks.h" /* For struct terminal. */
d141d701
DA
45#ifdef HAVE_WINDOW_SYSTEM
46#include TERM_HEADER
47#endif /* HAVE_WINDOW_SYSTEM */
0328b6de 48
0065d054 49#include <verify.h>
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);
6ab1b16c 2134 int last_mask = ~ (~0u << ((nbits - 1) % BOOL_VECTOR_BITS_PER_CHAR + 1));
df5b4930
PE
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. */ \
9c23779a 2335 - (sizeof (struct Lisp_Float) - sizeof (bits_word))) * CHAR_BIT) \
ab6780cd
SM
2336 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
2337
2338#define GETMARKBIT(block,n) \
9c23779a
PE
2339 (((block)->gcmarkbits[(n) / BITS_PER_BITS_WORD] \
2340 >> ((n) % BITS_PER_BITS_WORD)) \
ab6780cd
SM
2341 & 1)
2342
2343#define SETMARKBIT(block,n) \
9c23779a
PE
2344 ((block)->gcmarkbits[(n) / BITS_PER_BITS_WORD] \
2345 |= (bits_word) 1 << ((n) % BITS_PER_BITS_WORD))
ab6780cd
SM
2346
2347#define UNSETMARKBIT(block,n) \
9c23779a
PE
2348 ((block)->gcmarkbits[(n) / BITS_PER_BITS_WORD] \
2349 &= ~((bits_word) 1 << ((n) % BITS_PER_BITS_WORD)))
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];
9c23779a 2361 bits_word gcmarkbits[1 + FLOAT_BLOCK_SIZE / BITS_PER_BITS_WORD];
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. */ \
9c23779a 2442 - (sizeof (struct Lisp_Cons) - sizeof (bits_word))) * 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];
9c23779a 2455 bits_word gcmarkbits[1 + CONS_BLOCK_SIZE / BITS_PER_BITS_WORD];
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 2687/* Sometimes a vector's contents are merely a pointer internally used
13a5993b
PE
2688 in vector allocation code. On the rare platforms where a null
2689 pointer cannot be tagged, represent it with a Lisp 0.
2690 Usually you don't want to touch this. */
91f2d272
PE
2691
2692static struct Lisp_Vector *
2693next_vector (struct Lisp_Vector *v)
2694{
2695 return XUNTAG (v->contents[0], 0);
2696}
2697
2698static void
2699set_next_vector (struct Lisp_Vector *v, struct Lisp_Vector *p)
2700{
2701 v->contents[0] = make_lisp_ptr (p, 0);
2702}
2703
f3372c87
DA
2704/* This value is balanced well enough to avoid too much internal overhead
2705 for the most common cases; it's not required to be a power of two, but
2706 it's expected to be a mult-of-ROUNDUP_SIZE (see below). */
34400008 2707
f3372c87 2708#define VECTOR_BLOCK_SIZE 4096
7146af97 2709
dd0b0efb
PE
2710enum
2711 {
91f2d272
PE
2712 /* Alignment of struct Lisp_Vector objects. */
2713 vector_alignment = COMMON_MULTIPLE (ALIGNOF_STRUCT_LISP_VECTOR,
2714 USE_LSB_TAG ? GCALIGNMENT : 1),
2715
2716 /* Vector size requests are a multiple of this. */
2717 roundup_size = COMMON_MULTIPLE (vector_alignment, word_size)
dd0b0efb 2718 };
34400008 2719
ca95b3eb
DA
2720/* Verify assumptions described above. */
2721verify ((VECTOR_BLOCK_SIZE % roundup_size) == 0);
ee28be33 2722verify (VECTOR_BLOCK_SIZE <= (1 << PSEUDOVECTOR_SIZE_BITS));
ca95b3eb 2723
3e0b94e7 2724/* Round up X to nearest mult-of-ROUNDUP_SIZE --- use at compile time. */
df5b4930 2725#define vroundup_ct(x) ROUNDUP (x, roundup_size)
3e0b94e7 2726/* Round up X to nearest mult-of-ROUNDUP_SIZE --- use at runtime. */
b9ff995e 2727#define vroundup(x) (eassume ((x) >= 0), vroundup_ct (x))
f3372c87
DA
2728
2729/* Rounding helps to maintain alignment constraints if USE_LSB_TAG. */
2730
3e0b94e7 2731#define VECTOR_BLOCK_BYTES (VECTOR_BLOCK_SIZE - vroundup_ct (sizeof (void *)))
f3372c87
DA
2732
2733/* Size of the minimal vector allocated from block. */
2734
3e0b94e7 2735#define VBLOCK_BYTES_MIN vroundup_ct (header_size + sizeof (Lisp_Object))
f3372c87
DA
2736
2737/* Size of the largest vector allocated from block. */
2738
2739#define VBLOCK_BYTES_MAX \
d06714cb 2740 vroundup ((VECTOR_BLOCK_BYTES / 2) - word_size)
f3372c87
DA
2741
2742/* We maintain one free list for each possible block-allocated
2743 vector size, and this is the number of free lists we have. */
2744
2745#define VECTOR_MAX_FREE_LIST_INDEX \
2746 ((VECTOR_BLOCK_BYTES - VBLOCK_BYTES_MIN) / roundup_size + 1)
2747
f3372c87
DA
2748/* Common shortcut to advance vector pointer over a block data. */
2749
2750#define ADVANCE(v, nbytes) ((struct Lisp_Vector *) ((char *) (v) + (nbytes)))
2751
2752/* Common shortcut to calculate NBYTES-vector index in VECTOR_FREE_LISTS. */
2753
2754#define VINDEX(nbytes) (((nbytes) - VBLOCK_BYTES_MIN) / roundup_size)
2755
2756/* Common shortcut to setup vector on a free list. */
2757
914adc42
DA
2758#define SETUP_ON_FREE_LIST(v, nbytes, tmp) \
2759 do { \
2760 (tmp) = ((nbytes - header_size) / word_size); \
2761 XSETPVECTYPESIZE (v, PVEC_FREE, 0, (tmp)); \
2762 eassert ((nbytes) % roundup_size == 0); \
2763 (tmp) = VINDEX (nbytes); \
2764 eassert ((tmp) < VECTOR_MAX_FREE_LIST_INDEX); \
91f2d272 2765 set_next_vector (v, vector_free_lists[tmp]); \
914adc42
DA
2766 vector_free_lists[tmp] = (v); \
2767 total_free_vector_slots += (nbytes) / word_size; \
f3372c87
DA
2768 } while (0)
2769
914adc42 2770/* This internal type is used to maintain the list of large vectors
91f2d272
PE
2771 which are allocated at their own, e.g. outside of vector blocks.
2772
2773 struct large_vector itself cannot contain a struct Lisp_Vector, as
2774 the latter contains a flexible array member and C99 does not allow
2775 such structs to be nested. Instead, each struct large_vector
2776 object LV is followed by a struct Lisp_Vector, which is at offset
2777 large_vector_offset from LV, and whose address is therefore
2778 large_vector_vec (&LV). */
914adc42
DA
2779
2780struct large_vector
2781{
91f2d272 2782 struct large_vector *next;
914adc42
DA
2783};
2784
91f2d272
PE
2785enum
2786{
2787 large_vector_offset = ROUNDUP (sizeof (struct large_vector), vector_alignment)
2788};
2789
2790static struct Lisp_Vector *
2791large_vector_vec (struct large_vector *p)
2792{
2793 return (struct Lisp_Vector *) ((char *) p + large_vector_offset);
2794}
2795
914adc42
DA
2796/* This internal type is used to maintain an underlying storage
2797 for small vectors. */
2798
f3372c87
DA
2799struct vector_block
2800{
2801 char data[VECTOR_BLOCK_BYTES];
2802 struct vector_block *next;
2803};
2804
2805/* Chain of vector blocks. */
2806
2807static struct vector_block *vector_blocks;
2808
2809/* Vector free lists, where NTH item points to a chain of free
2810 vectors of the same NBYTES size, so NTH == VINDEX (NBYTES). */
2811
2812static struct Lisp_Vector *vector_free_lists[VECTOR_MAX_FREE_LIST_INDEX];
2813
2814/* Singly-linked list of large vectors. */
2815
914adc42 2816static struct large_vector *large_vectors;
f3372c87
DA
2817
2818/* The only vector with 0 slots, allocated from pure space. */
2819
9730daca 2820Lisp_Object zero_vector;
f3372c87 2821
3ab6e069
DA
2822/* Number of live vectors. */
2823
2824static EMACS_INT total_vectors;
2825
5b835e1d 2826/* Total size of live and free vectors, in Lisp_Object units. */
3ab6e069 2827
5b835e1d 2828static EMACS_INT total_vector_slots, total_free_vector_slots;
3ab6e069 2829
f3372c87
DA
2830/* Get a new vector block. */
2831
2832static struct vector_block *
2833allocate_vector_block (void)
2834{
38182d90 2835 struct vector_block *block = xmalloc (sizeof *block);
f3372c87
DA
2836
2837#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
2838 mem_insert (block->data, block->data + VECTOR_BLOCK_BYTES,
2839 MEM_TYPE_VECTOR_BLOCK);
2840#endif
2841
2842 block->next = vector_blocks;
2843 vector_blocks = block;
2844 return block;
2845}
2846
2847/* Called once to initialize vector allocation. */
2848
2849static void
2850init_vectors (void)
2851{
9730daca 2852 zero_vector = make_pure_vector (0);
f3372c87
DA
2853}
2854
2855/* Allocate vector from a vector block. */
2856
2857static struct Lisp_Vector *
2858allocate_vector_from_block (size_t nbytes)
2859{
914adc42 2860 struct Lisp_Vector *vector;
f3372c87
DA
2861 struct vector_block *block;
2862 size_t index, restbytes;
2863
2864 eassert (VBLOCK_BYTES_MIN <= nbytes && nbytes <= VBLOCK_BYTES_MAX);
2865 eassert (nbytes % roundup_size == 0);
2866
2867 /* First, try to allocate from a free list
2868 containing vectors of the requested size. */
2869 index = VINDEX (nbytes);
2870 if (vector_free_lists[index])
2871 {
2872 vector = vector_free_lists[index];
91f2d272 2873 vector_free_lists[index] = next_vector (vector);
5b835e1d 2874 total_free_vector_slots -= nbytes / word_size;
f3372c87
DA
2875 return vector;
2876 }
2877
2878 /* Next, check free lists containing larger vectors. Since
2879 we will split the result, we should have remaining space
2880 large enough to use for one-slot vector at least. */
2881 for (index = VINDEX (nbytes + VBLOCK_BYTES_MIN);
2882 index < VECTOR_MAX_FREE_LIST_INDEX; index++)
2883 if (vector_free_lists[index])
2884 {
2885 /* This vector is larger than requested. */
2886 vector = vector_free_lists[index];
91f2d272 2887 vector_free_lists[index] = next_vector (vector);
5b835e1d 2888 total_free_vector_slots -= nbytes / word_size;
f3372c87
DA
2889
2890 /* Excess bytes are used for the smaller vector,
2891 which should be set on an appropriate free list. */
2892 restbytes = index * roundup_size + VBLOCK_BYTES_MIN - nbytes;
2893 eassert (restbytes % roundup_size == 0);
914adc42 2894 SETUP_ON_FREE_LIST (ADVANCE (vector, nbytes), restbytes, index);
f3372c87
DA
2895 return vector;
2896 }
2897
2898 /* Finally, need a new vector block. */
2899 block = allocate_vector_block ();
2900
2901 /* New vector will be at the beginning of this block. */
2902 vector = (struct Lisp_Vector *) block->data;
f3372c87
DA
2903
2904 /* If the rest of space from this block is large enough
2905 for one-slot vector at least, set up it on a free list. */
2906 restbytes = VECTOR_BLOCK_BYTES - nbytes;
2907 if (restbytes >= VBLOCK_BYTES_MIN)
2908 {
2909 eassert (restbytes % roundup_size == 0);
914adc42 2910 SETUP_ON_FREE_LIST (ADVANCE (vector, nbytes), restbytes, index);
f3372c87
DA
2911 }
2912 return vector;
914adc42 2913}
f3372c87 2914
f3372c87
DA
2915/* Nonzero if VECTOR pointer is valid pointer inside BLOCK. */
2916
2917#define VECTOR_IN_BLOCK(vector, block) \
2918 ((char *) (vector) <= (block)->data \
2919 + VECTOR_BLOCK_BYTES - VBLOCK_BYTES_MIN)
2920
914adc42 2921/* Return the memory footprint of V in bytes. */
ee28be33 2922
914adc42
DA
2923static ptrdiff_t
2924vector_nbytes (struct Lisp_Vector *v)
2925{
2926 ptrdiff_t size = v->header.size & ~ARRAY_MARK_FLAG;
2cf00efc 2927 ptrdiff_t nwords;
914adc42
DA
2928
2929 if (size & PSEUDOVECTOR_FLAG)
2930 {
2931 if (PSEUDOVECTOR_TYPEP (&v->header, PVEC_BOOL_VECTOR))
3e0b94e7
DC
2932 {
2933 struct Lisp_Bool_Vector *bv = (struct Lisp_Bool_Vector *) v;
2cf00efc
PE
2934 ptrdiff_t word_bytes = (bool_vector_words (bv->size)
2935 * sizeof (bits_word));
2936 ptrdiff_t boolvec_bytes = bool_header_size + word_bytes;
2937 verify (header_size <= bool_header_size);
2938 nwords = (boolvec_bytes - header_size + word_size - 1) / word_size;
3e0b94e7 2939 }
914adc42 2940 else
2cf00efc
PE
2941 nwords = ((size & PSEUDOVECTOR_SIZE_MASK)
2942 + ((size & PSEUDOVECTOR_REST_MASK)
2943 >> PSEUDOVECTOR_SIZE_BITS));
914adc42
DA
2944 }
2945 else
2cf00efc
PE
2946 nwords = size;
2947 return vroundup (header_size + word_size * nwords);
914adc42 2948}
ee28be33 2949
86bd985e
DA
2950/* Release extra resources still in use by VECTOR, which may be any
2951 vector-like object. For now, this is used just to free data in
2952 font objects. */
2953
2954static void
2955cleanup_vector (struct Lisp_Vector *vector)
2956{
01ae0fbf 2957 detect_suspicious_free (vector);
5035fbc1
DA
2958 if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FONT)
2959 && ((vector->header.size & PSEUDOVECTOR_SIZE_MASK)
2960 == FONT_OBJECT_MAX))
5ae356d9
DA
2961 {
2962 /* Attempt to catch subtle bugs like Bug#16140. */
2963 eassert (valid_font_driver (((struct font *) vector)->driver));
2964 ((struct font *) vector)->driver->close ((struct font *) vector);
2965 }
86bd985e
DA
2966}
2967
f3372c87
DA
2968/* Reclaim space used by unmarked vectors. */
2969
b029599f 2970NO_INLINE /* For better stack traces */
f3372c87
DA
2971static void
2972sweep_vectors (void)
2973{
1570ae92 2974 struct vector_block *block, **bprev = &vector_blocks;
914adc42
DA
2975 struct large_vector *lv, **lvprev = &large_vectors;
2976 struct Lisp_Vector *vector, *next;
f3372c87 2977
5b835e1d 2978 total_vectors = total_vector_slots = total_free_vector_slots = 0;
f3372c87
DA
2979 memset (vector_free_lists, 0, sizeof (vector_free_lists));
2980
2981 /* Looking through vector blocks. */
2982
2983 for (block = vector_blocks; block; block = *bprev)
2984 {
fce31d69 2985 bool free_this_block = 0;
914adc42 2986 ptrdiff_t nbytes;
f3372c87
DA
2987
2988 for (vector = (struct Lisp_Vector *) block->data;
2989 VECTOR_IN_BLOCK (vector, block); vector = next)
2990 {
2991 if (VECTOR_MARKED_P (vector))
2992 {
2993 VECTOR_UNMARK (vector);
3ab6e069 2994 total_vectors++;
914adc42
DA
2995 nbytes = vector_nbytes (vector);
2996 total_vector_slots += nbytes / word_size;
2997 next = ADVANCE (vector, nbytes);
f3372c87
DA
2998 }
2999 else
3000 {
914adc42 3001 ptrdiff_t total_bytes;
f3372c87 3002
86bd985e 3003 cleanup_vector (vector);
914adc42
DA
3004 nbytes = vector_nbytes (vector);
3005 total_bytes = nbytes;
ee28be33 3006 next = ADVANCE (vector, nbytes);
f3372c87
DA
3007
3008 /* While NEXT is not marked, try to coalesce with VECTOR,
3009 thus making VECTOR of the largest possible size. */
3010
3011 while (VECTOR_IN_BLOCK (next, block))
3012 {
3013 if (VECTOR_MARKED_P (next))
3014 break;
86bd985e 3015 cleanup_vector (next);
914adc42 3016 nbytes = vector_nbytes (next);
ee28be33 3017 total_bytes += nbytes;
f3372c87
DA
3018 next = ADVANCE (next, nbytes);
3019 }
bfe3e0a2 3020
ee28be33 3021 eassert (total_bytes % roundup_size == 0);
f3372c87
DA
3022
3023 if (vector == (struct Lisp_Vector *) block->data
3024 && !VECTOR_IN_BLOCK (next, block))
b029599f 3025 /* This block should be freed because all of its
f3372c87
DA
3026 space was coalesced into the only free vector. */
3027 free_this_block = 1;
3028 else
ee28be33 3029 {
ba355de0 3030 size_t tmp;
ee28be33
SM
3031 SETUP_ON_FREE_LIST (vector, total_bytes, tmp);
3032 }
f3372c87
DA
3033 }
3034 }
3035
3036 if (free_this_block)
3037 {
3038 *bprev = block->next;
3039#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
3040 mem_delete (mem_find (block->data));
3041#endif
3042 xfree (block);
3043 }
3044 else
3045 bprev = &block->next;
3046 }
3047
3048 /* Sweep large vectors. */
3049
914adc42 3050 for (lv = large_vectors; lv; lv = *lvprev)
f3372c87 3051 {
91f2d272 3052 vector = large_vector_vec (lv);
f3372c87
DA
3053 if (VECTOR_MARKED_P (vector))
3054 {
3055 VECTOR_UNMARK (vector);
3ab6e069 3056 total_vectors++;
169925ec
DA
3057 if (vector->header.size & PSEUDOVECTOR_FLAG)
3058 {
d06714cb
PE
3059 /* All non-bool pseudovectors are small enough to be allocated
3060 from vector blocks. This code should be redesigned if some
3061 pseudovector type grows beyond VBLOCK_BYTES_MAX. */
3062 eassert (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_BOOL_VECTOR));
3e0b94e7 3063 total_vector_slots += vector_nbytes (vector) / word_size;
169925ec
DA
3064 }
3065 else
5b835e1d
DA
3066 total_vector_slots
3067 += header_size / word_size + vector->header.size;
91f2d272 3068 lvprev = &lv->next;
f3372c87
DA
3069 }
3070 else
3071 {
91f2d272 3072 *lvprev = lv->next;
914adc42 3073 lisp_free (lv);
f3372c87
DA
3074 }
3075 }
3076}
3077
34400008
GM
3078/* Value is a pointer to a newly allocated Lisp_Vector structure
3079 with room for LEN Lisp_Objects. */
3080
ece93c02 3081static struct Lisp_Vector *
d311d28c 3082allocate_vectorlike (ptrdiff_t len)
1825c68d
KH
3083{
3084 struct Lisp_Vector *p;
3085
dafc79fa
SM
3086 MALLOC_BLOCK_INPUT;
3087
f3372c87 3088 if (len == 0)
9730daca 3089 p = XVECTOR (zero_vector);
d12e8f5a 3090 else
8bbbc977 3091 {
d12e8f5a 3092 size_t nbytes = header_size + len * word_size;
f3372c87 3093
d12e8f5a 3094#ifdef DOUG_LEA_MALLOC
f20b8315
DC
3095 if (!mmap_lisp_allowed_p ())
3096 mallopt (M_MMAP_MAX, 0);
d12e8f5a 3097#endif
f3372c87 3098
d12e8f5a
DA
3099 if (nbytes <= VBLOCK_BYTES_MAX)
3100 p = allocate_vector_from_block (vroundup (nbytes));
3101 else
3102 {
914adc42 3103 struct large_vector *lv
91f2d272 3104 = lisp_malloc ((large_vector_offset + header_size
fbe9e0b9 3105 + len * word_size),
914adc42 3106 MEM_TYPE_VECTORLIKE);
91f2d272 3107 lv->next = large_vectors;
914adc42 3108 large_vectors = lv;
91f2d272 3109 p = large_vector_vec (lv);
d12e8f5a 3110 }
177c0ea7 3111
d1658221 3112#ifdef DOUG_LEA_MALLOC
f20b8315
DC
3113 if (!mmap_lisp_allowed_p ())
3114 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
d1658221 3115#endif
177c0ea7 3116
faa52174 3117 if (find_suspicious_object_in_range (p, (char *) p + nbytes))
01ae0fbf
DC
3118 emacs_abort ();
3119
d12e8f5a
DA
3120 consing_since_gc += nbytes;
3121 vector_cells_consed += len;
3122 }
1825c68d 3123
dafc79fa 3124 MALLOC_UNBLOCK_INPUT;
e2984df0 3125
1825c68d
KH
3126 return p;
3127}
3128
34400008 3129
dd0b0efb 3130/* Allocate a vector with LEN slots. */
ece93c02
GM
3131
3132struct Lisp_Vector *
dd0b0efb 3133allocate_vector (EMACS_INT len)
ece93c02 3134{
dd0b0efb
PE
3135 struct Lisp_Vector *v;
3136 ptrdiff_t nbytes_max = min (PTRDIFF_MAX, SIZE_MAX);
3137
3138 if (min ((nbytes_max - header_size) / word_size, MOST_POSITIVE_FIXNUM) < len)
3139 memory_full (SIZE_MAX);
3140 v = allocate_vectorlike (len);
3141 v->header.size = len;
ece93c02
GM
3142 return v;
3143}
3144
3145
3146/* Allocate other vector-like structures. */
3147
30f95089 3148struct Lisp_Vector *
914adc42 3149allocate_pseudovector (int memlen, int lisplen, enum pvec_type tag)
ece93c02 3150{
d2029e5b 3151 struct Lisp_Vector *v = allocate_vectorlike (memlen);
e46bb31a 3152 int i;
177c0ea7 3153
914adc42
DA
3154 /* Catch bogus values. */
3155 eassert (tag <= PVEC_FONT);
3156 eassert (memlen - lisplen <= (1 << PSEUDOVECTOR_REST_BITS) - 1);
3157 eassert (lisplen <= (1 << PSEUDOVECTOR_SIZE_BITS) - 1);
3158
d2029e5b 3159 /* Only the first lisplen slots will be traced normally by the GC. */
d2029e5b 3160 for (i = 0; i < lisplen; ++i)
91f2d272 3161 v->contents[i] = Qnil;
177c0ea7 3162
914adc42 3163 XSETPVECTYPESIZE (v, tag, lisplen, memlen - lisplen);
d2029e5b
SM
3164 return v;
3165}
d2029e5b 3166
36429c89
DA
3167struct buffer *
3168allocate_buffer (void)
3169{
38182d90 3170 struct buffer *b = lisp_malloc (sizeof *b, MEM_TYPE_BUFFER);
36429c89 3171
914adc42 3172 BUFFER_PVEC_INIT (b);
c752cfa9 3173 /* Put B on the chain of all buffers including killed ones. */
914adc42 3174 b->next = all_buffers;
c752cfa9
DA
3175 all_buffers = b;
3176 /* Note that the rest fields of B are not initialized. */
36429c89
DA
3177 return b;
3178}
3179
ece93c02 3180struct Lisp_Hash_Table *
878f97ff 3181allocate_hash_table (void)
ece93c02 3182{
878f97ff 3183 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table, count, PVEC_HASH_TABLE);
ece93c02
GM
3184}
3185
ece93c02 3186struct window *
971de7fb 3187allocate_window (void)
ece93c02 3188{
62efea5e 3189 struct window *w;
177c0ea7 3190
62efea5e
DA
3191 w = ALLOCATE_PSEUDOVECTOR (struct window, current_matrix, PVEC_WINDOW);
3192 /* Users assumes that non-Lisp data is zeroed. */
3193 memset (&w->current_matrix, 0,
3194 sizeof (*w) - offsetof (struct window, current_matrix));
3195 return w;
3196}
177c0ea7 3197
4a729fd8 3198struct terminal *
971de7fb 3199allocate_terminal (void)
4a729fd8 3200{
62efea5e 3201 struct terminal *t;
ece93c02 3202
62efea5e
DA
3203 t = ALLOCATE_PSEUDOVECTOR (struct terminal, next_terminal, PVEC_TERMINAL);
3204 /* Users assumes that non-Lisp data is zeroed. */
3205 memset (&t->next_terminal, 0,
3206 sizeof (*t) - offsetof (struct terminal, next_terminal));
d2029e5b 3207 return t;
4a729fd8 3208}
ece93c02
GM
3209
3210struct frame *
971de7fb 3211allocate_frame (void)
ece93c02 3212{
62efea5e
DA
3213 struct frame *f;
3214
3215 f = ALLOCATE_PSEUDOVECTOR (struct frame, face_cache, PVEC_FRAME);
3216 /* Users assumes that non-Lisp data is zeroed. */
72af86bd 3217 memset (&f->face_cache, 0,
62efea5e 3218 sizeof (*f) - offsetof (struct frame, face_cache));
d2029e5b 3219 return f;
ece93c02
GM
3220}
3221
ece93c02 3222struct Lisp_Process *
971de7fb 3223allocate_process (void)
ece93c02 3224{
62efea5e 3225 struct Lisp_Process *p;
ece93c02 3226
62efea5e
DA
3227 p = ALLOCATE_PSEUDOVECTOR (struct Lisp_Process, pid, PVEC_PROCESS);
3228 /* Users assumes that non-Lisp data is zeroed. */
3229 memset (&p->pid, 0,
3230 sizeof (*p) - offsetof (struct Lisp_Process, pid));
3231 return p;
3232}
ece93c02 3233
a7ca3326 3234DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
a6266d23 3235 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
7ee72033 3236See also the function `vector'. */)
5842a27b 3237 (register Lisp_Object length, Lisp_Object init)
7146af97 3238{
1825c68d 3239 Lisp_Object vector;
d311d28c
PE
3240 register ptrdiff_t sizei;
3241 register ptrdiff_t i;
7146af97
JB
3242 register struct Lisp_Vector *p;
3243
b7826503 3244 CHECK_NATNUM (length);
7146af97 3245
d311d28c
PE
3246 p = allocate_vector (XFASTINT (length));
3247 sizei = XFASTINT (length);
ae35e756 3248 for (i = 0; i < sizei; i++)
91f2d272 3249 p->contents[i] = init;
7146af97 3250
1825c68d 3251 XSETVECTOR (vector, p);
7146af97
JB
3252 return vector;
3253}
3254
34400008 3255
a7ca3326 3256DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
eae936e2 3257 doc: /* Return a newly created vector with specified arguments as elements.
ae8e8122
MB
3258Any number of arguments, even zero arguments, are allowed.
3259usage: (vector &rest OBJECTS) */)
f66c7cf8 3260 (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3261{
f66c7cf8 3262 ptrdiff_t i;
25721f5b
DA
3263 register Lisp_Object val = make_uninit_vector (nargs);
3264 register struct Lisp_Vector *p = XVECTOR (val);
7146af97 3265
ae35e756 3266 for (i = 0; i < nargs; i++)
91f2d272 3267 p->contents[i] = args[i];
7146af97
JB
3268 return val;
3269}
3270
3017f87f
SM
3271void
3272make_byte_code (struct Lisp_Vector *v)
3273{
ed0ca4a5
PE
3274 /* Don't allow the global zero_vector to become a byte code object. */
3275 eassert (0 < v->header.size);
3276
91f2d272
PE
3277 if (v->header.size > 1 && STRINGP (v->contents[1])
3278 && STRING_MULTIBYTE (v->contents[1]))
3017f87f
SM
3279 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
3280 earlier because they produced a raw 8-bit string for byte-code
3281 and now such a byte-code string is loaded as multibyte while
3282 raw 8-bit characters converted to multibyte form. Thus, now we
3283 must convert them back to the original unibyte form. */
91f2d272 3284 v->contents[1] = Fstring_as_unibyte (v->contents[1]);
3017f87f
SM
3285 XSETPVECTYPE (v, PVEC_COMPILED);
3286}
34400008 3287
a7ca3326 3288DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
a6266d23 3289 doc: /* Create a byte-code object with specified arguments as elements.
e2abe5a1
SM
3290The arguments should be the ARGLIST, bytecode-string BYTE-CODE, constant
3291vector CONSTANTS, maximum stack size DEPTH, (optional) DOCSTRING,
3292and (optional) INTERACTIVE-SPEC.
228299fa 3293The first four arguments are required; at most six have any
ae8e8122 3294significance.
e2abe5a1
SM
3295The ARGLIST can be either like the one of `lambda', in which case the arguments
3296will be dynamically bound before executing the byte code, or it can be an
3297integer of the form NNNNNNNRMMMMMMM where the 7bit MMMMMMM specifies the
3298minimum number of arguments, the 7-bit NNNNNNN specifies the maximum number
3299of arguments (ignoring &rest) and the R bit specifies whether there is a &rest
3300argument to catch the left-over arguments. If such an integer is used, the
3301arguments will not be dynamically bound but will be instead pushed on the
3302stack before executing the byte-code.
92cc28b2 3303usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
f66c7cf8 3304 (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3305{
f66c7cf8 3306 ptrdiff_t i;
25721f5b
DA
3307 register Lisp_Object val = make_uninit_vector (nargs);
3308 register struct Lisp_Vector *p = XVECTOR (val);
7146af97 3309
12fbe755 3310 /* We used to purecopy everything here, if purify-flag was set. This worked
3017f87f
SM
3311 OK for Emacs-23, but with Emacs-24's lexical binding code, it can be
3312 dangerous, since make-byte-code is used during execution to build
3313 closures, so any closure built during the preload phase would end up
3314 copied into pure space, including its free variables, which is sometimes
3315 just wasteful and other times plainly wrong (e.g. those free vars may want
3316 to be setcar'd). */
9eac9d59 3317
ae35e756 3318 for (i = 0; i < nargs; i++)
91f2d272 3319 p->contents[i] = args[i];
3017f87f 3320 make_byte_code (p);
876c194c 3321 XSETCOMPILED (val, p);
7146af97
JB
3322 return val;
3323}
2e471eb5 3324
34400008 3325
7146af97 3326\f
2e471eb5
GM
3327/***********************************************************************
3328 Symbol Allocation
3329 ***********************************************************************/
7146af97 3330
d55c12ed
AS
3331/* Like struct Lisp_Symbol, but padded so that the size is a multiple
3332 of the required alignment if LSB tags are used. */
3333
3334union aligned_Lisp_Symbol
3335{
3336 struct Lisp_Symbol s;
bfe3e0a2 3337#if USE_LSB_TAG
2b90362b
DA
3338 unsigned char c[(sizeof (struct Lisp_Symbol) + GCALIGNMENT - 1)
3339 & -GCALIGNMENT];
d55c12ed
AS
3340#endif
3341};
3342
2e471eb5
GM
3343/* Each symbol_block is just under 1020 bytes long, since malloc
3344 really allocates in units of powers of two and uses 4 bytes for its
3017f87f 3345 own overhead. */
7146af97
JB
3346
3347#define SYMBOL_BLOCK_SIZE \
d55c12ed 3348 ((1020 - sizeof (struct symbol_block *)) / sizeof (union aligned_Lisp_Symbol))
7146af97
JB
3349
3350struct symbol_block
2e471eb5 3351{
6b61353c 3352 /* Place `symbols' first, to preserve alignment. */
d55c12ed 3353 union aligned_Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
6b61353c 3354 struct symbol_block *next;
2e471eb5 3355};
7146af97 3356
34400008
GM
3357/* Current symbol block and index of first unused Lisp_Symbol
3358 structure in it. */
3359
d3d47262 3360static struct symbol_block *symbol_block;
fff62aa9 3361static int symbol_block_index = SYMBOL_BLOCK_SIZE;
e3b83880
SM
3362/* Pointer to the first symbol_block that contains pinned symbols.
3363 Tests for 24.4 showed that at dump-time, Emacs contains about 15K symbols,
3364 10K of which are pinned (and all but 250 of them are interned in obarray),
3365 whereas a "typical session" has in the order of 30K symbols.
3366 `symbol_block_pinned' lets mark_pinned_symbols scan only 15K symbols rather
3367 than 30K to find the 10K symbols we need to mark. */
3368static struct symbol_block *symbol_block_pinned;
7146af97 3369
34400008
GM
3370/* List of free symbols. */
3371
d3d47262 3372static struct Lisp_Symbol *symbol_free_list;
7146af97 3373
84575e67
PE
3374static void
3375set_symbol_name (Lisp_Object sym, Lisp_Object name)
3376{
3377 XSYMBOL (sym)->name = name;
3378}
3379
a7ca3326 3380DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
a6266d23 3381 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
eadf1faa 3382Its value is void, and its function definition and property list are nil. */)
5842a27b 3383 (Lisp_Object name)
7146af97
JB
3384{
3385 register Lisp_Object val;
3386 register struct Lisp_Symbol *p;
3387
b7826503 3388 CHECK_STRING (name);
7146af97 3389
dafc79fa 3390 MALLOC_BLOCK_INPUT;
e2984df0 3391
7146af97
JB
3392 if (symbol_free_list)
3393 {
45d12a89 3394 XSETSYMBOL (val, symbol_free_list);
28a099a4 3395 symbol_free_list = symbol_free_list->next;
7146af97
JB
3396 }
3397 else
3398 {
3399 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
3400 {
38182d90
PE
3401 struct symbol_block *new
3402 = lisp_malloc (sizeof *new, MEM_TYPE_SYMBOL);
7146af97
JB
3403 new->next = symbol_block;
3404 symbol_block = new;
3405 symbol_block_index = 0;
3900d5de 3406 total_free_symbols += SYMBOL_BLOCK_SIZE;
7146af97 3407 }
d55c12ed 3408 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index].s);
6b61353c 3409 symbol_block_index++;
7146af97 3410 }
177c0ea7 3411
dafc79fa 3412 MALLOC_UNBLOCK_INPUT;
e2984df0 3413
7146af97 3414 p = XSYMBOL (val);
c644523b
DA
3415 set_symbol_name (val, name);
3416 set_symbol_plist (val, Qnil);
ce5b453a
SM
3417 p->redirect = SYMBOL_PLAINVAL;
3418 SET_SYMBOL_VAL (p, Qunbound);
eadf1faa 3419 set_symbol_function (val, Qnil);
c644523b 3420 set_symbol_next (val, NULL);
e3b83880 3421 p->gcmarkbit = false;
9e713715
GM
3422 p->interned = SYMBOL_UNINTERNED;
3423 p->constant = 0;
e3b83880
SM
3424 p->declared_special = false;
3425 p->pinned = false;
2e471eb5
GM
3426 consing_since_gc += sizeof (struct Lisp_Symbol);
3427 symbols_consed++;
3900d5de 3428 total_free_symbols--;
7146af97
JB
3429 return val;
3430}
3431
3f25e183 3432
2e471eb5
GM
3433\f
3434/***********************************************************************
34400008 3435 Marker (Misc) Allocation
2e471eb5 3436 ***********************************************************************/
3f25e183 3437
d55c12ed
AS
3438/* Like union Lisp_Misc, but padded so that its size is a multiple of
3439 the required alignment when LSB tags are used. */
3440
3441union aligned_Lisp_Misc
3442{
3443 union Lisp_Misc m;
bfe3e0a2 3444#if USE_LSB_TAG
2b90362b
DA
3445 unsigned char c[(sizeof (union Lisp_Misc) + GCALIGNMENT - 1)
3446 & -GCALIGNMENT];
d55c12ed
AS
3447#endif
3448};
3449
2e471eb5
GM
3450/* Allocation of markers and other objects that share that structure.
3451 Works like allocation of conses. */
c0696668 3452
2e471eb5 3453#define MARKER_BLOCK_SIZE \
d55c12ed 3454 ((1020 - sizeof (struct marker_block *)) / sizeof (union aligned_Lisp_Misc))
2e471eb5
GM
3455
3456struct marker_block
c0696668 3457{
6b61353c 3458 /* Place `markers' first, to preserve alignment. */
d55c12ed 3459 union aligned_Lisp_Misc markers[MARKER_BLOCK_SIZE];
6b61353c 3460 struct marker_block *next;
2e471eb5 3461};
c0696668 3462
d3d47262 3463static struct marker_block *marker_block;
fff62aa9 3464static int marker_block_index = MARKER_BLOCK_SIZE;
c0696668 3465
d3d47262 3466static union Lisp_Misc *marker_free_list;
c0696668 3467
d7a7fda3 3468/* Return a newly allocated Lisp_Misc object of specified TYPE. */
2e471eb5 3469
1b971ac1 3470static Lisp_Object
d7a7fda3 3471allocate_misc (enum Lisp_Misc_Type type)
7146af97 3472{
2e471eb5 3473 Lisp_Object val;
7146af97 3474
dafc79fa 3475 MALLOC_BLOCK_INPUT;
cfb2f32e 3476
2e471eb5 3477 if (marker_free_list)
7146af97 3478 {
2e471eb5
GM
3479 XSETMISC (val, marker_free_list);
3480 marker_free_list = marker_free_list->u_free.chain;
7146af97
JB
3481 }
3482 else
7146af97 3483 {
2e471eb5
GM
3484 if (marker_block_index == MARKER_BLOCK_SIZE)
3485 {
38182d90 3486 struct marker_block *new = lisp_malloc (sizeof *new, MEM_TYPE_MISC);
2e471eb5
GM
3487 new->next = marker_block;
3488 marker_block = new;
3489 marker_block_index = 0;
7b7990cc 3490 total_free_markers += MARKER_BLOCK_SIZE;
2e471eb5 3491 }
d55c12ed 3492 XSETMISC (val, &marker_block->markers[marker_block_index].m);
6b61353c 3493 marker_block_index++;
7146af97 3494 }
177c0ea7 3495
dafc79fa 3496 MALLOC_UNBLOCK_INPUT;
e2984df0 3497
7b7990cc 3498 --total_free_markers;
2e471eb5
GM
3499 consing_since_gc += sizeof (union Lisp_Misc);
3500 misc_objects_consed++;
84575e67 3501 XMISCANY (val)->type = type;
67ee9f6e 3502 XMISCANY (val)->gcmarkbit = 0;
2e471eb5
GM
3503 return val;
3504}
3505
73ebd38f 3506/* Free a Lisp_Misc object. */
7b7990cc 3507
73ebd38f 3508void
971de7fb 3509free_misc (Lisp_Object misc)
7b7990cc 3510{
84575e67 3511 XMISCANY (misc)->type = Lisp_Misc_Free;
7b7990cc
KS
3512 XMISC (misc)->u_free.chain = marker_free_list;
3513 marker_free_list = XMISC (misc);
0dd6d66d 3514 consing_since_gc -= sizeof (union Lisp_Misc);
7b7990cc
KS
3515 total_free_markers++;
3516}
3517
7b1123d8
PE
3518/* Verify properties of Lisp_Save_Value's representation
3519 that are assumed here and elsewhere. */
3520
3521verify (SAVE_UNUSED == 0);
52a9bcae
PE
3522verify (((SAVE_INTEGER | SAVE_POINTER | SAVE_FUNCPOINTER | SAVE_OBJECT)
3523 >> SAVE_SLOT_BITS)
3524 == 0);
7b1123d8 3525
1396ac86
PE
3526/* Return Lisp_Save_Value objects for the various combinations
3527 that callers need. */
1b971ac1
DA
3528
3529Lisp_Object
1396ac86 3530make_save_int_int_int (ptrdiff_t a, ptrdiff_t b, ptrdiff_t c)
1b971ac1 3531{
1b971ac1
DA
3532 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3533 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1396ac86
PE
3534 p->save_type = SAVE_TYPE_INT_INT_INT;
3535 p->data[0].integer = a;
3536 p->data[1].integer = b;
3537 p->data[2].integer = c;
3538 return val;
3539}
1b971ac1 3540
1396ac86
PE
3541Lisp_Object
3542make_save_obj_obj_obj_obj (Lisp_Object a, Lisp_Object b, Lisp_Object c,
3543 Lisp_Object d)
3544{
3545 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3546 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3547 p->save_type = SAVE_TYPE_OBJ_OBJ_OBJ_OBJ;
3548 p->data[0].object = a;
3549 p->data[1].object = b;
3550 p->data[2].object = c;
3551 p->data[3].object = d;
3552 return val;
3553}
1b971ac1 3554
1396ac86
PE
3555Lisp_Object
3556make_save_ptr (void *a)
3557{
3558 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3559 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3560 p->save_type = SAVE_POINTER;
3561 p->data[0].pointer = a;
3562 return val;
3563}
7b1123d8 3564
1396ac86
PE
3565Lisp_Object
3566make_save_ptr_int (void *a, ptrdiff_t b)
3567{
3568 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3569 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3570 p->save_type = SAVE_TYPE_PTR_INT;
3571 p->data[0].pointer = a;
3572 p->data[1].integer = b;
3573 return val;
3574}
1b971ac1 3575
7cdf484b 3576#if ! (defined USE_X_TOOLKIT || defined USE_GTK)
f4e891b5
PE
3577Lisp_Object
3578make_save_ptr_ptr (void *a, void *b)
3579{
3580 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3581 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3582 p->save_type = SAVE_TYPE_PTR_PTR;
3583 p->data[0].pointer = a;
3584 p->data[1].pointer = b;
3585 return val;
3586}
3587#endif
3588
1396ac86
PE
3589Lisp_Object
3590make_save_funcptr_ptr_obj (void (*a) (void), void *b, Lisp_Object c)
3591{
3592 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3593 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3594 p->save_type = SAVE_TYPE_FUNCPTR_PTR_OBJ;
3595 p->data[0].funcpointer = a;
3596 p->data[1].pointer = b;
3597 p->data[2].object = c;
1b971ac1
DA
3598 return val;
3599}
3600
1396ac86
PE
3601/* Return a Lisp_Save_Value object that represents an array A
3602 of N Lisp objects. */
42172a6b
RS
3603
3604Lisp_Object
1396ac86 3605make_save_memory (Lisp_Object *a, ptrdiff_t n)
42172a6b 3606{
468afbac
DA
3607 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3608 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1396ac86
PE
3609 p->save_type = SAVE_TYPE_MEMORY;
3610 p->data[0].pointer = a;
3611 p->data[1].integer = n;
468afbac 3612 return val;
42172a6b
RS
3613}
3614
73ebd38f
DA
3615/* Free a Lisp_Save_Value object. Do not use this function
3616 if SAVE contains pointer other than returned by xmalloc. */
62c2e5ed 3617
27e498e6 3618void
62c2e5ed
DA
3619free_save_value (Lisp_Object save)
3620{
2b30549c 3621 xfree (XSAVE_POINTER (save, 0));
62c2e5ed
DA
3622 free_misc (save);
3623}
3624
d7a7fda3
DA
3625/* Return a Lisp_Misc_Overlay object with specified START, END and PLIST. */
3626
3627Lisp_Object
3628build_overlay (Lisp_Object start, Lisp_Object end, Lisp_Object plist)
3629{
3630 register Lisp_Object overlay;
3631
3632 overlay = allocate_misc (Lisp_Misc_Overlay);
3633 OVERLAY_START (overlay) = start;
3634 OVERLAY_END (overlay) = end;
c644523b 3635 set_overlay_plist (overlay, plist);
d7a7fda3
DA
3636 XOVERLAY (overlay)->next = NULL;
3637 return overlay;
3638}
3639
a7ca3326 3640DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
a6266d23 3641 doc: /* Return a newly allocated marker which does not point at any place. */)
5842a27b 3642 (void)
2e471eb5 3643{
eeaea515
DA
3644 register Lisp_Object val;
3645 register struct Lisp_Marker *p;
7146af97 3646
eeaea515
DA
3647 val = allocate_misc (Lisp_Misc_Marker);
3648 p = XMARKER (val);
3649 p->buffer = 0;
3650 p->bytepos = 0;
3651 p->charpos = 0;
3652 p->next = NULL;
3653 p->insertion_type = 0;
101ed2bb 3654 p->need_adjustment = 0;
eeaea515 3655 return val;
7146af97 3656}
2e471eb5 3657
657924ff
DA
3658/* Return a newly allocated marker which points into BUF
3659 at character position CHARPOS and byte position BYTEPOS. */
3660
3661Lisp_Object
3662build_marker (struct buffer *buf, ptrdiff_t charpos, ptrdiff_t bytepos)
3663{
eeaea515
DA
3664 Lisp_Object obj;
3665 struct Lisp_Marker *m;
657924ff
DA
3666
3667 /* No dead buffers here. */
e578f381 3668 eassert (BUFFER_LIVE_P (buf));
657924ff 3669
eeaea515
DA
3670 /* Every character is at least one byte. */
3671 eassert (charpos <= bytepos);
3672
3673 obj = allocate_misc (Lisp_Misc_Marker);
3674 m = XMARKER (obj);
3675 m->buffer = buf;
3676 m->charpos = charpos;
3677 m->bytepos = bytepos;
3678 m->insertion_type = 0;
101ed2bb 3679 m->need_adjustment = 0;
eeaea515
DA
3680 m->next = BUF_MARKERS (buf);
3681 BUF_MARKERS (buf) = m;
3682 return obj;
657924ff
DA
3683}
3684
2e471eb5
GM
3685/* Put MARKER back on the free list after using it temporarily. */
3686
3687void
971de7fb 3688free_marker (Lisp_Object marker)
2e471eb5 3689{
ef89c2ce 3690 unchain_marker (XMARKER (marker));
7b7990cc 3691 free_misc (marker);
2e471eb5
GM
3692}
3693
c0696668 3694\f
7146af97 3695/* Return a newly created vector or string with specified arguments as
736471d1
RS
3696 elements. If all the arguments are characters that can fit
3697 in a string of events, make a string; otherwise, make a vector.
3698
3699 Any number of arguments, even zero arguments, are allowed. */
7146af97
JB
3700
3701Lisp_Object
0c90b9ee 3702make_event_array (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3703{
0c90b9ee 3704 ptrdiff_t i;
7146af97
JB
3705
3706 for (i = 0; i < nargs; i++)
736471d1 3707 /* The things that fit in a string
c9ca4659
RS
3708 are characters that are in 0...127,
3709 after discarding the meta bit and all the bits above it. */
e687453f 3710 if (!INTEGERP (args[i])
c11285dc 3711 || (XINT (args[i]) & ~(-CHAR_META)) >= 0200)
7146af97
JB
3712 return Fvector (nargs, args);
3713
3714 /* Since the loop exited, we know that all the things in it are
3715 characters, so we can make a string. */
3716 {
c13ccad2 3717 Lisp_Object result;
177c0ea7 3718
50aee051 3719 result = Fmake_string (make_number (nargs), make_number (0));
7146af97 3720 for (i = 0; i < nargs; i++)
736471d1 3721 {
46e7e6b0 3722 SSET (result, i, XINT (args[i]));
736471d1
RS
3723 /* Move the meta bit to the right place for a string char. */
3724 if (XINT (args[i]) & CHAR_META)
46e7e6b0 3725 SSET (result, i, SREF (result, i) | 0x80);
736471d1 3726 }
177c0ea7 3727
7146af97
JB
3728 return result;
3729 }
3730}
2e471eb5
GM
3731
3732
7146af97 3733\f
24d8a105
RS
3734/************************************************************************
3735 Memory Full Handling
3736 ************************************************************************/
3737
3738
531b0165
PE
3739/* Called if malloc (NBYTES) returns zero. If NBYTES == SIZE_MAX,
3740 there may have been size_t overflow so that malloc was never
3741 called, or perhaps malloc was invoked successfully but the
3742 resulting pointer had problems fitting into a tagged EMACS_INT. In
3743 either case this counts as memory being full even though malloc did
3744 not fail. */
24d8a105
RS
3745
3746void
531b0165 3747memory_full (size_t nbytes)
24d8a105 3748{
531b0165 3749 /* Do not go into hysterics merely because a large request failed. */
fce31d69 3750 bool enough_free_memory = 0;
2b6148e4 3751 if (SPARE_MEMORY < nbytes)
531b0165 3752 {
66606eea
PE
3753 void *p;
3754
3755 MALLOC_BLOCK_INPUT;
3756 p = malloc (SPARE_MEMORY);
531b0165
PE
3757 if (p)
3758 {
4d09bcf6 3759 free (p);
531b0165
PE
3760 enough_free_memory = 1;
3761 }
66606eea 3762 MALLOC_UNBLOCK_INPUT;
531b0165 3763 }
24d8a105 3764
531b0165
PE
3765 if (! enough_free_memory)
3766 {
3767 int i;
24d8a105 3768
531b0165
PE
3769 Vmemory_full = Qt;
3770
3771 memory_full_cons_threshold = sizeof (struct cons_block);
3772
3773 /* The first time we get here, free the spare memory. */
faa52174 3774 for (i = 0; i < ARRAYELTS (spare_memory); i++)
531b0165
PE
3775 if (spare_memory[i])
3776 {
3777 if (i == 0)
3778 free (spare_memory[i]);
3779 else if (i >= 1 && i <= 4)
3780 lisp_align_free (spare_memory[i]);
3781 else
3782 lisp_free (spare_memory[i]);
3783 spare_memory[i] = 0;
3784 }
531b0165 3785 }
24d8a105
RS
3786
3787 /* This used to call error, but if we've run out of memory, we could
3788 get infinite recursion trying to build the string. */
9b306d37 3789 xsignal (Qnil, Vmemory_signal_data);
24d8a105
RS
3790}
3791
3792/* If we released our reserve (due to running out of memory),
3793 and we have a fair amount free once again,
3794 try to set aside another reserve in case we run out once more.
3795
3796 This is called when a relocatable block is freed in ralloc.c,
3797 and also directly from this file, in case we're not using ralloc.c. */
3798
3799void
971de7fb 3800refill_memory_reserve (void)
24d8a105
RS
3801{
3802#ifndef SYSTEM_MALLOC
3803 if (spare_memory[0] == 0)
38182d90 3804 spare_memory[0] = malloc (SPARE_MEMORY);
24d8a105 3805 if (spare_memory[1] == 0)
38182d90 3806 spare_memory[1] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3807 MEM_TYPE_SPARE);
24d8a105 3808 if (spare_memory[2] == 0)
38182d90 3809 spare_memory[2] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3810 MEM_TYPE_SPARE);
24d8a105 3811 if (spare_memory[3] == 0)
38182d90 3812 spare_memory[3] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3813 MEM_TYPE_SPARE);
24d8a105 3814 if (spare_memory[4] == 0)
38182d90 3815 spare_memory[4] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3816 MEM_TYPE_SPARE);
24d8a105 3817 if (spare_memory[5] == 0)
38182d90 3818 spare_memory[5] = lisp_malloc (sizeof (struct string_block),
35aaa1ea 3819 MEM_TYPE_SPARE);
24d8a105 3820 if (spare_memory[6] == 0)
38182d90 3821 spare_memory[6] = lisp_malloc (sizeof (struct string_block),
35aaa1ea 3822 MEM_TYPE_SPARE);
24d8a105
RS
3823 if (spare_memory[0] && spare_memory[1] && spare_memory[5])
3824 Vmemory_full = Qnil;
3825#endif
3826}
3827\f
34400008
GM
3828/************************************************************************
3829 C Stack Marking
3830 ************************************************************************/
3831
13c844fb
GM
3832#if GC_MARK_STACK || defined GC_MALLOC_CHECK
3833
71cf5fa0
GM
3834/* Conservative C stack marking requires a method to identify possibly
3835 live Lisp objects given a pointer value. We do this by keeping
3836 track of blocks of Lisp data that are allocated in a red-black tree
3837 (see also the comment of mem_node which is the type of nodes in
3838 that tree). Function lisp_malloc adds information for an allocated
3839 block to the red-black tree with calls to mem_insert, and function
3840 lisp_free removes it with mem_delete. Functions live_string_p etc
3841 call mem_find to lookup information about a given pointer in the
3842 tree, and use that to determine if the pointer points to a Lisp
3843 object or not. */
3844
34400008
GM
3845/* Initialize this part of alloc.c. */
3846
3847static void
971de7fb 3848mem_init (void)
34400008
GM
3849{
3850 mem_z.left = mem_z.right = MEM_NIL;
3851 mem_z.parent = NULL;
3852 mem_z.color = MEM_BLACK;
3853 mem_z.start = mem_z.end = NULL;
3854 mem_root = MEM_NIL;
3855}
3856
3857
3858/* Value is a pointer to the mem_node containing START. Value is
3859 MEM_NIL if there is no node in the tree containing START. */
3860
b0ab8123 3861static struct mem_node *
971de7fb 3862mem_find (void *start)
34400008
GM
3863{
3864 struct mem_node *p;
3865
ece93c02
GM
3866 if (start < min_heap_address || start > max_heap_address)
3867 return MEM_NIL;
3868
34400008
GM
3869 /* Make the search always successful to speed up the loop below. */
3870 mem_z.start = start;
3871 mem_z.end = (char *) start + 1;
3872
3873 p = mem_root;
3874 while (start < p->start || start >= p->end)
3875 p = start < p->start ? p->left : p->right;
3876 return p;
3877}
3878
3879
3880/* Insert a new node into the tree for a block of memory with start
3881 address START, end address END, and type TYPE. Value is a
3882 pointer to the node that was inserted. */
3883
3884static struct mem_node *
971de7fb 3885mem_insert (void *start, void *end, enum mem_type type)
34400008
GM
3886{
3887 struct mem_node *c, *parent, *x;
3888
add3c3ea 3889 if (min_heap_address == NULL || start < min_heap_address)
ece93c02 3890 min_heap_address = start;
add3c3ea 3891 if (max_heap_address == NULL || end > max_heap_address)
ece93c02
GM
3892 max_heap_address = end;
3893
34400008
GM
3894 /* See where in the tree a node for START belongs. In this
3895 particular application, it shouldn't happen that a node is already
3896 present. For debugging purposes, let's check that. */
3897 c = mem_root;
3898 parent = NULL;
3899
3900#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
177c0ea7 3901
34400008
GM
3902 while (c != MEM_NIL)
3903 {
3904 if (start >= c->start && start < c->end)
1088b922 3905 emacs_abort ();
34400008
GM
3906 parent = c;
3907 c = start < c->start ? c->left : c->right;
3908 }
177c0ea7 3909
34400008 3910#else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
177c0ea7 3911
34400008
GM
3912 while (c != MEM_NIL)
3913 {
3914 parent = c;
3915 c = start < c->start ? c->left : c->right;
3916 }
177c0ea7 3917
34400008
GM
3918#endif /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
3919
3920 /* Create a new node. */
877935b1 3921#ifdef GC_MALLOC_CHECK
0caaedb1 3922 x = malloc (sizeof *x);
877935b1 3923 if (x == NULL)
1088b922 3924 emacs_abort ();
877935b1 3925#else
23f86fce 3926 x = xmalloc (sizeof *x);
877935b1 3927#endif
34400008
GM
3928 x->start = start;
3929 x->end = end;
3930 x->type = type;
3931 x->parent = parent;
3932 x->left = x->right = MEM_NIL;
3933 x->color = MEM_RED;
3934
3935 /* Insert it as child of PARENT or install it as root. */
3936 if (parent)
3937 {
3938 if (start < parent->start)
3939 parent->left = x;
3940 else
3941 parent->right = x;
3942 }
177c0ea7 3943 else
34400008
GM
3944 mem_root = x;
3945
3946 /* Re-establish red-black tree properties. */
3947 mem_insert_fixup (x);
877935b1 3948
34400008
GM
3949 return x;
3950}
3951
3952
3953/* Re-establish the red-black properties of the tree, and thereby
3954 balance the tree, after node X has been inserted; X is always red. */
3955
3956static void
971de7fb 3957mem_insert_fixup (struct mem_node *x)
34400008
GM
3958{
3959 while (x != mem_root && x->parent->color == MEM_RED)
3960 {
3961 /* X is red and its parent is red. This is a violation of
3962 red-black tree property #3. */
177c0ea7 3963
34400008
GM
3964 if (x->parent == x->parent->parent->left)
3965 {
3966 /* We're on the left side of our grandparent, and Y is our
3967 "uncle". */
3968 struct mem_node *y = x->parent->parent->right;
177c0ea7 3969
34400008
GM
3970 if (y->color == MEM_RED)
3971 {
3972 /* Uncle and parent are red but should be black because
3973 X is red. Change the colors accordingly and proceed
3974 with the grandparent. */
3975 x->parent->color = MEM_BLACK;
3976 y->color = MEM_BLACK;
3977 x->parent->parent->color = MEM_RED;
3978 x = x->parent->parent;
3979 }
3980 else
3981 {
3982 /* Parent and uncle have different colors; parent is
3983 red, uncle is black. */
3984 if (x == x->parent->right)
3985 {
3986 x = x->parent;
3987 mem_rotate_left (x);
3988 }
3989
3990 x->parent->color = MEM_BLACK;
3991 x->parent->parent->color = MEM_RED;
3992 mem_rotate_right (x->parent->parent);
3993 }
3994 }
3995 else
3996 {
3997 /* This is the symmetrical case of above. */
3998 struct mem_node *y = x->parent->parent->left;
177c0ea7 3999
34400008
GM
4000 if (y->color == MEM_RED)
4001 {
4002 x->parent->color = MEM_BLACK;
4003 y->color = MEM_BLACK;
4004 x->parent->parent->color = MEM_RED;
4005 x = x->parent->parent;
4006 }
4007 else
4008 {
4009 if (x == x->parent->left)
4010 {
4011 x = x->parent;
4012 mem_rotate_right (x);
4013 }
177c0ea7 4014
34400008
GM
4015 x->parent->color = MEM_BLACK;
4016 x->parent->parent->color = MEM_RED;
4017 mem_rotate_left (x->parent->parent);
4018 }
4019 }
4020 }
4021
4022 /* The root may have been changed to red due to the algorithm. Set
4023 it to black so that property #5 is satisfied. */
4024 mem_root->color = MEM_BLACK;
4025}
4026
4027
177c0ea7
JB
4028/* (x) (y)
4029 / \ / \
34400008
GM
4030 a (y) ===> (x) c
4031 / \ / \
4032 b c a b */
4033
4034static void
971de7fb 4035mem_rotate_left (struct mem_node *x)
34400008
GM
4036{
4037 struct mem_node *y;
4038
4039 /* Turn y's left sub-tree into x's right sub-tree. */
4040 y = x->right;
4041 x->right = y->left;
4042 if (y->left != MEM_NIL)
4043 y->left->parent = x;
4044
4045 /* Y's parent was x's parent. */
4046 if (y != MEM_NIL)
4047 y->parent = x->parent;
4048
4049 /* Get the parent to point to y instead of x. */
4050 if (x->parent)
4051 {
4052 if (x == x->parent->left)
4053 x->parent->left = y;
4054 else
4055 x->parent->right = y;
4056 }
4057 else
4058 mem_root = y;
4059
4060 /* Put x on y's left. */
4061 y->left = x;
4062 if (x != MEM_NIL)
4063 x->parent = y;
4064}
4065
4066
177c0ea7
JB
4067/* (x) (Y)
4068 / \ / \
4069 (y) c ===> a (x)
4070 / \ / \
34400008
GM
4071 a b b c */
4072
4073static void
971de7fb 4074mem_rotate_right (struct mem_node *x)
34400008
GM
4075{
4076 struct mem_node *y = x->left;
4077
4078 x->left = y->right;
4079 if (y->right != MEM_NIL)
4080 y->right->parent = x;
177c0ea7 4081
34400008
GM
4082 if (y != MEM_NIL)
4083 y->parent = x->parent;
4084 if (x->parent)
4085 {
4086 if (x == x->parent->right)
4087 x->parent->right = y;
4088 else
4089 x->parent->left = y;
4090 }
4091 else
4092 mem_root = y;
177c0ea7 4093
34400008
GM
4094 y->right = x;
4095 if (x != MEM_NIL)
4096 x->parent = y;
4097}
4098
4099
4100/* Delete node Z from the tree. If Z is null or MEM_NIL, do nothing. */
4101
4102static void
971de7fb 4103mem_delete (struct mem_node *z)
34400008
GM
4104{
4105 struct mem_node *x, *y;
4106
4107 if (!z || z == MEM_NIL)
4108 return;
4109
4110 if (z->left == MEM_NIL || z->right == MEM_NIL)
4111 y = z;
4112 else
4113 {
4114 y = z->right;
4115 while (y->left != MEM_NIL)
4116 y = y->left;
4117 }
4118
4119 if (y->left != MEM_NIL)
4120 x = y->left;
4121 else
4122 x = y->right;
4123
4124 x->parent = y->parent;
4125 if (y->parent)
4126 {
4127 if (y == y->parent->left)
4128 y->parent->left = x;
4129 else
4130 y->parent->right = x;
4131 }
4132 else
4133 mem_root = x;
4134
4135 if (y != z)
4136 {
4137 z->start = y->start;
4138 z->end = y->end;
4139 z->type = y->type;
4140 }
177c0ea7 4141
34400008
GM
4142 if (y->color == MEM_BLACK)
4143 mem_delete_fixup (x);
877935b1
GM
4144
4145#ifdef GC_MALLOC_CHECK
0caaedb1 4146 free (y);
877935b1 4147#else
34400008 4148 xfree (y);
877935b1 4149#endif
34400008
GM
4150}
4151
4152
4153/* Re-establish the red-black properties of the tree, after a
4154 deletion. */
4155
4156static void
971de7fb 4157mem_delete_fixup (struct mem_node *x)
34400008
GM
4158{
4159 while (x != mem_root && x->color == MEM_BLACK)
4160 {
4161 if (x == x->parent->left)
4162 {
4163 struct mem_node *w = x->parent->right;
177c0ea7 4164
34400008
GM
4165 if (w->color == MEM_RED)
4166 {
4167 w->color = MEM_BLACK;
4168 x->parent->color = MEM_RED;
4169 mem_rotate_left (x->parent);
4170 w = x->parent->right;
4171 }
177c0ea7 4172
34400008
GM
4173 if (w->left->color == MEM_BLACK && w->right->color == MEM_BLACK)
4174 {
4175 w->color = MEM_RED;
4176 x = x->parent;
4177 }
4178 else
4179 {
4180 if (w->right->color == MEM_BLACK)
4181 {
4182 w->left->color = MEM_BLACK;
4183 w->color = MEM_RED;
4184 mem_rotate_right (w);
4185 w = x->parent->right;
4186 }
4187 w->color = x->parent->color;
4188 x->parent->color = MEM_BLACK;
4189 w->right->color = MEM_BLACK;
4190 mem_rotate_left (x->parent);
4191 x = mem_root;
4192 }
4193 }
4194 else
4195 {
4196 struct mem_node *w = x->parent->left;
177c0ea7 4197
34400008
GM
4198 if (w->color == MEM_RED)
4199 {
4200 w->color = MEM_BLACK;
4201 x->parent->color = MEM_RED;
4202 mem_rotate_right (x->parent);
4203 w = x->parent->left;
4204 }
177c0ea7 4205
34400008
GM
4206 if (w->right->color == MEM_BLACK && w->left->color == MEM_BLACK)
4207 {
4208 w->color = MEM_RED;
4209 x = x->parent;
4210 }
4211 else
4212 {
4213 if (w->left->color == MEM_BLACK)
4214 {
4215 w->right->color = MEM_BLACK;
4216 w->color = MEM_RED;
4217 mem_rotate_left (w);
4218 w = x->parent->left;
4219 }
177c0ea7 4220
34400008
GM
4221 w->color = x->parent->color;
4222 x->parent->color = MEM_BLACK;
4223 w->left->color = MEM_BLACK;
4224 mem_rotate_right (x->parent);
4225 x = mem_root;
4226 }
4227 }
4228 }
177c0ea7 4229
34400008
GM
4230 x->color = MEM_BLACK;
4231}
4232
4233
4234/* Value is non-zero if P is a pointer to a live Lisp string on
4235 the heap. M is a pointer to the mem_block for P. */
4236
b0ab8123 4237static bool
971de7fb 4238live_string_p (struct mem_node *m, void *p)
34400008
GM
4239{
4240 if (m->type == MEM_TYPE_STRING)
4241 {
7d652d97 4242 struct string_block *b = m->start;
14162469 4243 ptrdiff_t offset = (char *) p - (char *) &b->strings[0];
34400008
GM
4244
4245 /* P must point to the start of a Lisp_String structure, and it
4246 must not be on the free-list. */
176bc847
GM
4247 return (offset >= 0
4248 && offset % sizeof b->strings[0] == 0
6b61353c 4249 && offset < (STRING_BLOCK_SIZE * sizeof b->strings[0])
34400008
GM
4250 && ((struct Lisp_String *) p)->data != NULL);
4251 }
4252 else
4253 return 0;
4254}
4255
4256
4257/* Value is non-zero if P is a pointer to a live Lisp cons on
4258 the heap. M is a pointer to the mem_block for P. */
4259
b0ab8123 4260static bool
971de7fb 4261live_cons_p (struct mem_node *m, void *p)
34400008
GM
4262{
4263 if (m->type == MEM_TYPE_CONS)
4264 {
7d652d97 4265 struct cons_block *b = m->start;
14162469 4266 ptrdiff_t offset = (char *) p - (char *) &b->conses[0];
34400008
GM
4267
4268 /* P must point to the start of a Lisp_Cons, not be
4269 one of the unused cells in the current cons block,
4270 and not be on the free-list. */
176bc847
GM
4271 return (offset >= 0
4272 && offset % sizeof b->conses[0] == 0
6b61353c 4273 && offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
34400008
GM
4274 && (b != cons_block
4275 || offset / sizeof b->conses[0] < cons_block_index)
c644523b 4276 && !EQ (((struct Lisp_Cons *) p)->car, Vdead));
34400008
GM
4277 }
4278 else
4279 return 0;
4280}
4281
4282
4283/* Value is non-zero if P is a pointer to a live Lisp symbol on
4284 the heap. M is a pointer to the mem_block for P. */
4285
b0ab8123 4286static bool
971de7fb 4287live_symbol_p (struct mem_node *m, void *p)
34400008
GM
4288{
4289 if (m->type == MEM_TYPE_SYMBOL)
4290 {
7d652d97 4291 struct symbol_block *b = m->start;
14162469 4292 ptrdiff_t offset = (char *) p - (char *) &b->symbols[0];
177c0ea7 4293
34400008
GM
4294 /* P must point to the start of a Lisp_Symbol, not be
4295 one of the unused cells in the current symbol block,
4296 and not be on the free-list. */
176bc847
GM
4297 return (offset >= 0
4298 && offset % sizeof b->symbols[0] == 0
6b61353c 4299 && offset < (SYMBOL_BLOCK_SIZE * sizeof b->symbols[0])
34400008
GM
4300 && (b != symbol_block
4301 || offset / sizeof b->symbols[0] < symbol_block_index)
c644523b 4302 && !EQ (((struct Lisp_Symbol *)p)->function, Vdead));
34400008
GM
4303 }
4304 else
4305 return 0;
4306}
4307
4308
4309/* Value is non-zero if P is a pointer to a live Lisp float on
4310 the heap. M is a pointer to the mem_block for P. */
4311
b0ab8123 4312static bool
971de7fb 4313live_float_p (struct mem_node *m, void *p)
34400008
GM
4314{
4315 if (m->type == MEM_TYPE_FLOAT)
4316 {
7d652d97 4317 struct float_block *b = m->start;
14162469 4318 ptrdiff_t offset = (char *) p - (char *) &b->floats[0];
177c0ea7 4319
ab6780cd
SM
4320 /* P must point to the start of a Lisp_Float and not be
4321 one of the unused cells in the current float block. */
176bc847
GM
4322 return (offset >= 0
4323 && offset % sizeof b->floats[0] == 0
6b61353c 4324 && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
34400008 4325 && (b != float_block
ab6780cd 4326 || offset / sizeof b->floats[0] < float_block_index));
34400008
GM
4327 }
4328 else
4329 return 0;
4330}
4331
4332
4333/* Value is non-zero if P is a pointer to a live Lisp Misc on
4334 the heap. M is a pointer to the mem_block for P. */
4335
b0ab8123 4336static bool
971de7fb 4337live_misc_p (struct mem_node *m, void *p)
34400008
GM
4338{
4339 if (m->type == MEM_TYPE_MISC)
4340 {
7d652d97 4341 struct marker_block *b = m->start;
14162469 4342 ptrdiff_t offset = (char *) p - (char *) &b->markers[0];
177c0ea7 4343
34400008
GM
4344 /* P must point to the start of a Lisp_Misc, not be
4345 one of the unused cells in the current misc block,
4346 and not be on the free-list. */
176bc847
GM
4347 return (offset >= 0
4348 && offset % sizeof b->markers[0] == 0
6b61353c 4349 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0])
34400008
GM
4350 && (b != marker_block
4351 || offset / sizeof b->markers[0] < marker_block_index)
d314756e 4352 && ((union Lisp_Misc *) p)->u_any.type != Lisp_Misc_Free);
34400008
GM
4353 }
4354 else
4355 return 0;
4356}
4357
4358
4359/* Value is non-zero if P is a pointer to a live vector-like object.
4360 M is a pointer to the mem_block for P. */
4361
b0ab8123 4362static bool
971de7fb 4363live_vector_p (struct mem_node *m, void *p)
34400008 4364{
f3372c87
DA
4365 if (m->type == MEM_TYPE_VECTOR_BLOCK)
4366 {
4367 /* This memory node corresponds to a vector block. */
7d652d97 4368 struct vector_block *block = m->start;
f3372c87
DA
4369 struct Lisp_Vector *vector = (struct Lisp_Vector *) block->data;
4370
4371 /* P is in the block's allocation range. Scan the block
4372 up to P and see whether P points to the start of some
4373 vector which is not on a free list. FIXME: check whether
4374 some allocation patterns (probably a lot of short vectors)
4375 may cause a substantial overhead of this loop. */
4376 while (VECTOR_IN_BLOCK (vector, block)
4377 && vector <= (struct Lisp_Vector *) p)
4378 {
914adc42 4379 if (!PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FREE) && vector == p)
f3372c87
DA
4380 return 1;
4381 else
914adc42 4382 vector = ADVANCE (vector, vector_nbytes (vector));
f3372c87
DA
4383 }
4384 }
91f2d272 4385 else if (m->type == MEM_TYPE_VECTORLIKE && p == large_vector_vec (m->start))
f3372c87
DA
4386 /* This memory node corresponds to a large vector. */
4387 return 1;
4388 return 0;
34400008
GM
4389}
4390
4391
2336fe58 4392/* Value is non-zero if P is a pointer to a live buffer. M is a
34400008
GM
4393 pointer to the mem_block for P. */
4394
b0ab8123 4395static bool
971de7fb 4396live_buffer_p (struct mem_node *m, void *p)
34400008
GM
4397{
4398 /* P must point to the start of the block, and the buffer
4399 must not have been killed. */
4400 return (m->type == MEM_TYPE_BUFFER
4401 && p == m->start
e34f7f79 4402 && !NILP (((struct buffer *) p)->INTERNAL_FIELD (name)));
34400008
GM
4403}
4404
13c844fb
GM
4405#endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */
4406
4407#if GC_MARK_STACK
4408
34400008
GM
4409#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4410
0c5307b0
DA
4411/* Currently not used, but may be called from gdb. */
4412
4413void dump_zombies (void) EXTERNALLY_VISIBLE;
4414
34400008 4415/* Array of objects that are kept alive because the C stack contains
f224e500 4416 a pattern that looks like a reference to them. */
34400008
GM
4417
4418#define MAX_ZOMBIES 10
4419static Lisp_Object zombies[MAX_ZOMBIES];
4420
4421/* Number of zombie objects. */
4422
211a0b2a 4423static EMACS_INT nzombies;
34400008
GM
4424
4425/* Number of garbage collections. */
4426
211a0b2a 4427static EMACS_INT ngcs;
34400008
GM
4428
4429/* Average percentage of zombies per collection. */
4430
4431static double avg_zombies;
4432
4433/* Max. number of live and zombie objects. */
4434
211a0b2a 4435static EMACS_INT max_live, max_zombies;
34400008
GM
4436
4437/* Average number of live objects per GC. */
4438
4439static double avg_live;
4440
a7ca3326 4441DEFUN ("gc-status", Fgc_status, Sgc_status, 0, 0, "",
7ee72033 4442 doc: /* Show information about live and zombie objects. */)
5842a27b 4443 (void)
34400008 4444{
83fc9c63 4445 Lisp_Object args[8], zombie_list = Qnil;
211a0b2a 4446 EMACS_INT i;
6e4b3fbe 4447 for (i = 0; i < min (MAX_ZOMBIES, nzombies); i++)
83fc9c63
DL
4448 zombie_list = Fcons (zombies[i], zombie_list);
4449 args[0] = build_string ("%d GCs, avg live/zombies = %.2f/%.2f (%f%%), max %d/%d\nzombies: %S");
34400008
GM
4450 args[1] = make_number (ngcs);
4451 args[2] = make_float (avg_live);
4452 args[3] = make_float (avg_zombies);
4453 args[4] = make_float (avg_zombies / avg_live / 100);
4454 args[5] = make_number (max_live);
4455 args[6] = make_number (max_zombies);
83fc9c63
DL
4456 args[7] = zombie_list;
4457 return Fmessage (8, args);
34400008
GM
4458}
4459
4460#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
4461
4462
182ff242
GM
4463/* Mark OBJ if we can prove it's a Lisp_Object. */
4464
b0ab8123 4465static void
971de7fb 4466mark_maybe_object (Lisp_Object obj)
182ff242 4467{
b609f591
YM
4468 void *po;
4469 struct mem_node *m;
4470
a84683fd
DC
4471#if USE_VALGRIND
4472 if (valgrind_p)
4473 VALGRIND_MAKE_MEM_DEFINED (&obj, sizeof (obj));
4474#endif
4475
b609f591
YM
4476 if (INTEGERP (obj))
4477 return;
4478
4479 po = (void *) XPNTR (obj);
4480 m = mem_find (po);
177c0ea7 4481
182ff242
GM
4482 if (m != MEM_NIL)
4483 {
fce31d69 4484 bool mark_p = 0;
182ff242 4485
8e50cc2d 4486 switch (XTYPE (obj))
182ff242
GM
4487 {
4488 case Lisp_String:
4489 mark_p = (live_string_p (m, po)
4490 && !STRING_MARKED_P ((struct Lisp_String *) po));
4491 break;
4492
4493 case Lisp_Cons:
08b7c2cb 4494 mark_p = (live_cons_p (m, po) && !CONS_MARKED_P (XCONS (obj)));
182ff242
GM
4495 break;
4496
4497 case Lisp_Symbol:
2336fe58 4498 mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit);
182ff242
GM
4499 break;
4500
4501 case Lisp_Float:
ab6780cd 4502 mark_p = (live_float_p (m, po) && !FLOAT_MARKED_P (XFLOAT (obj)));
182ff242
GM
4503 break;
4504
4505 case Lisp_Vectorlike:
8e50cc2d 4506 /* Note: can't check BUFFERP before we know it's a
182ff242
GM
4507 buffer because checking that dereferences the pointer
4508 PO which might point anywhere. */
4509 if (live_vector_p (m, po))
8e50cc2d 4510 mark_p = !SUBRP (obj) && !VECTOR_MARKED_P (XVECTOR (obj));
182ff242 4511 else if (live_buffer_p (m, po))
8e50cc2d 4512 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj));
182ff242
GM
4513 break;
4514
4515 case Lisp_Misc:
67ee9f6e 4516 mark_p = (live_misc_p (m, po) && !XMISCANY (obj)->gcmarkbit);
182ff242 4517 break;
6bbd7a29 4518
2de9f71c 4519 default:
6bbd7a29 4520 break;
182ff242
GM
4521 }
4522
4523 if (mark_p)
4524 {
4525#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4526 if (nzombies < MAX_ZOMBIES)
83fc9c63 4527 zombies[nzombies] = obj;
182ff242
GM
4528 ++nzombies;
4529#endif
49723c04 4530 mark_object (obj);
182ff242
GM
4531 }
4532 }
4533}
ece93c02
GM
4534
4535
4536/* If P points to Lisp data, mark that as live if it isn't already
4537 marked. */
4538
b0ab8123 4539static void
971de7fb 4540mark_maybe_pointer (void *p)
ece93c02
GM
4541{
4542 struct mem_node *m;
4543
a84683fd
DC
4544#if USE_VALGRIND
4545 if (valgrind_p)
4546 VALGRIND_MAKE_MEM_DEFINED (&p, sizeof (p));
4547#endif
4548
bfe3e0a2 4549 /* Quickly rule out some values which can't point to Lisp data.
2b90362b 4550 USE_LSB_TAG needs Lisp data to be aligned on multiples of GCALIGNMENT.
bfe3e0a2 4551 Otherwise, assume that Lisp data is aligned on even addresses. */
2b90362b 4552 if ((intptr_t) p % (USE_LSB_TAG ? GCALIGNMENT : 2))
ece93c02 4553 return;
177c0ea7 4554
ece93c02
GM
4555 m = mem_find (p);
4556 if (m != MEM_NIL)
4557 {
4558 Lisp_Object obj = Qnil;
177c0ea7 4559
ece93c02
GM
4560 switch (m->type)
4561 {
4562 case MEM_TYPE_NON_LISP:
5474c384 4563 case MEM_TYPE_SPARE:
2fe50224 4564 /* Nothing to do; not a pointer to Lisp memory. */
ece93c02 4565 break;
177c0ea7 4566
ece93c02 4567 case MEM_TYPE_BUFFER:
5e617bc2 4568 if (live_buffer_p (m, p) && !VECTOR_MARKED_P ((struct buffer *)p))
ece93c02
GM
4569 XSETVECTOR (obj, p);
4570 break;
177c0ea7 4571
ece93c02 4572 case MEM_TYPE_CONS:
08b7c2cb 4573 if (live_cons_p (m, p) && !CONS_MARKED_P ((struct Lisp_Cons *) p))
ece93c02
GM
4574 XSETCONS (obj, p);
4575 break;
177c0ea7 4576
ece93c02
GM
4577 case MEM_TYPE_STRING:
4578 if (live_string_p (m, p)
4579 && !STRING_MARKED_P ((struct Lisp_String *) p))
4580 XSETSTRING (obj, p);
4581 break;
4582
4583 case MEM_TYPE_MISC:
2336fe58
SM
4584 if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit)
4585 XSETMISC (obj, p);
ece93c02 4586 break;
177c0ea7 4587
ece93c02 4588 case MEM_TYPE_SYMBOL:
2336fe58 4589 if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit)
ece93c02
GM
4590 XSETSYMBOL (obj, p);
4591 break;
177c0ea7 4592
ece93c02 4593 case MEM_TYPE_FLOAT:
ab6780cd 4594 if (live_float_p (m, p) && !FLOAT_MARKED_P (p))
ece93c02
GM
4595 XSETFLOAT (obj, p);
4596 break;
177c0ea7 4597
9c545a55 4598 case MEM_TYPE_VECTORLIKE:
f3372c87 4599 case MEM_TYPE_VECTOR_BLOCK:
ece93c02
GM
4600 if (live_vector_p (m, p))
4601 {
4602 Lisp_Object tem;
4603 XSETVECTOR (tem, p);
8e50cc2d 4604 if (!SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem)))
ece93c02
GM
4605 obj = tem;
4606 }
4607 break;
4608
4609 default:
1088b922 4610 emacs_abort ();
ece93c02
GM
4611 }
4612
8e50cc2d 4613 if (!NILP (obj))
49723c04 4614 mark_object (obj);
ece93c02
GM
4615 }
4616}
4617
4618
e32a5799 4619/* Alignment of pointer values. Use alignof, as it sometimes returns
e3fb2efb
PE
4620 a smaller alignment than GCC's __alignof__ and mark_memory might
4621 miss objects if __alignof__ were used. */
e32a5799 4622#define GC_POINTER_ALIGNMENT alignof (void *)
3164aeac 4623
e3fb2efb
PE
4624/* Define POINTERS_MIGHT_HIDE_IN_OBJECTS to 1 if marking via C pointers does
4625 not suffice, which is the typical case. A host where a Lisp_Object is
4626 wider than a pointer might allocate a Lisp_Object in non-adjacent halves.
4627 If USE_LSB_TAG, the bottom half is not a valid pointer, but it should
4628 suffice to widen it to to a Lisp_Object and check it that way. */
bfe3e0a2
PE
4629#if USE_LSB_TAG || VAL_MAX < UINTPTR_MAX
4630# if !USE_LSB_TAG && VAL_MAX < UINTPTR_MAX >> GCTYPEBITS
e3fb2efb
PE
4631 /* If tag bits straddle pointer-word boundaries, neither mark_maybe_pointer
4632 nor mark_maybe_object can follow the pointers. This should not occur on
4633 any practical porting target. */
4634# error "MSB type bits straddle pointer-word boundaries"
4635# endif
4636 /* Marking via C pointers does not suffice, because Lisp_Objects contain
4637 pointer words that hold pointers ORed with type bits. */
4638# define POINTERS_MIGHT_HIDE_IN_OBJECTS 1
4639#else
4640 /* Marking via C pointers suffices, because Lisp_Objects contain pointer
4641 words that hold unmodified pointers. */
4642# define POINTERS_MIGHT_HIDE_IN_OBJECTS 0
4643#endif
4644
55a314a5
YM
4645/* Mark Lisp objects referenced from the address range START+OFFSET..END
4646 or END+OFFSET..START. */
34400008 4647
e76119d7 4648static void ATTRIBUTE_NO_SANITIZE_ADDRESS
3164aeac 4649mark_memory (void *start, void *end)
34400008 4650{
ece93c02 4651 void **pp;
3164aeac 4652 int i;
34400008
GM
4653
4654#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4655 nzombies = 0;
4656#endif
4657
4658 /* Make START the pointer to the start of the memory region,
4659 if it isn't already. */
4660 if (end < start)
4661 {
4662 void *tem = start;
4663 start = end;
4664 end = tem;
4665 }
ece93c02 4666
ece93c02
GM
4667 /* Mark Lisp data pointed to. This is necessary because, in some
4668 situations, the C compiler optimizes Lisp objects away, so that
4669 only a pointer to them remains. Example:
4670
4671 DEFUN ("testme", Ftestme, Stestme, 0, 0, 0, "")
7ee72033 4672 ()
ece93c02
GM
4673 {
4674 Lisp_Object obj = build_string ("test");
4675 struct Lisp_String *s = XSTRING (obj);
4676 Fgarbage_collect ();
4677 fprintf (stderr, "test `%s'\n", s->data);
4678 return Qnil;
4679 }
4680
4681 Here, `obj' isn't really used, and the compiler optimizes it
4682 away. The only reference to the life string is through the
4683 pointer `s'. */
177c0ea7 4684
3164aeac
PE
4685 for (pp = start; (void *) pp < end; pp++)
4686 for (i = 0; i < sizeof *pp; i += GC_POINTER_ALIGNMENT)
27f3c637 4687 {
e3fb2efb
PE
4688 void *p = *(void **) ((char *) pp + i);
4689 mark_maybe_pointer (p);
4690 if (POINTERS_MIGHT_HIDE_IN_OBJECTS)
646b5f55 4691 mark_maybe_object (XIL ((intptr_t) p));
27f3c637 4692 }
182ff242
GM
4693}
4694
182ff242
GM
4695#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
4696
fce31d69
PE
4697static bool setjmp_tested_p;
4698static int longjmps_done;
182ff242
GM
4699
4700#define SETJMP_WILL_LIKELY_WORK "\
4701\n\
4702Emacs garbage collector has been changed to use conservative stack\n\
4703marking. Emacs has determined that the method it uses to do the\n\
4704marking will likely work on your system, but this isn't sure.\n\
4705\n\
4706If you are a system-programmer, or can get the help of a local wizard\n\
4707who is, please take a look at the function mark_stack in alloc.c, and\n\
4708verify that the methods used are appropriate for your system.\n\
4709\n\
d191623b 4710Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4711"
4712
4713#define SETJMP_WILL_NOT_WORK "\
4714\n\
4715Emacs garbage collector has been changed to use conservative stack\n\
4716marking. Emacs has determined that the default method it uses to do the\n\
4717marking will not work on your system. We will need a system-dependent\n\
4718solution for your system.\n\
4719\n\
4720Please take a look at the function mark_stack in alloc.c, and\n\
4721try to find a way to make it work on your system.\n\
30f637f8
DL
4722\n\
4723Note that you may get false negatives, depending on the compiler.\n\
4724In particular, you need to use -O with GCC for this test.\n\
4725\n\
d191623b 4726Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4727"
4728
4729
4730/* Perform a quick check if it looks like setjmp saves registers in a
4731 jmp_buf. Print a message to stderr saying so. When this test
4732 succeeds, this is _not_ a proof that setjmp is sufficient for
4733 conservative stack marking. Only the sources or a disassembly
4734 can prove that. */
4735
4736static void
2018939f 4737test_setjmp (void)
182ff242
GM
4738{
4739 char buf[10];
4740 register int x;
0328b6de 4741 sys_jmp_buf jbuf;
182ff242
GM
4742
4743 /* Arrange for X to be put in a register. */
4744 sprintf (buf, "1");
4745 x = strlen (buf);
4746 x = 2 * x - 1;
4747
0328b6de 4748 sys_setjmp (jbuf);
182ff242 4749 if (longjmps_done == 1)
34400008 4750 {
182ff242 4751 /* Came here after the longjmp at the end of the function.
34400008 4752
182ff242
GM
4753 If x == 1, the longjmp has restored the register to its
4754 value before the setjmp, and we can hope that setjmp
4755 saves all such registers in the jmp_buf, although that
4756 isn't sure.
34400008 4757
182ff242
GM
4758 For other values of X, either something really strange is
4759 taking place, or the setjmp just didn't save the register. */
4760
4761 if (x == 1)
4762 fprintf (stderr, SETJMP_WILL_LIKELY_WORK);
4763 else
4764 {
4765 fprintf (stderr, SETJMP_WILL_NOT_WORK);
4766 exit (1);
34400008
GM
4767 }
4768 }
182ff242
GM
4769
4770 ++longjmps_done;
4771 x = 2;
4772 if (longjmps_done == 1)
0328b6de 4773 sys_longjmp (jbuf, 1);
34400008
GM
4774}
4775
182ff242
GM
4776#endif /* not GC_SAVE_REGISTERS_ON_STACK && not GC_SETJMP_WORKS */
4777
34400008
GM
4778
4779#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4780
4781/* Abort if anything GCPRO'd doesn't survive the GC. */
4782
4783static void
2018939f 4784check_gcpros (void)
34400008
GM
4785{
4786 struct gcpro *p;
f66c7cf8 4787 ptrdiff_t i;
34400008
GM
4788
4789 for (p = gcprolist; p; p = p->next)
4790 for (i = 0; i < p->nvars; ++i)
4791 if (!survives_gc_p (p->var[i]))
92cc28b2
SM
4792 /* FIXME: It's not necessarily a bug. It might just be that the
4793 GCPRO is unnecessary or should release the object sooner. */
1088b922 4794 emacs_abort ();
34400008
GM
4795}
4796
4797#elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4798
0c5307b0 4799void
2018939f 4800dump_zombies (void)
34400008
GM
4801{
4802 int i;
4803
6e4b3fbe 4804 fprintf (stderr, "\nZombies kept alive = %"pI"d:\n", nzombies);
34400008
GM
4805 for (i = 0; i < min (MAX_ZOMBIES, nzombies); ++i)
4806 {
4807 fprintf (stderr, " %d = ", i);
4808 debug_print (zombies[i]);
4809 }
4810}
4811
4812#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
4813
4814
182ff242
GM
4815/* Mark live Lisp objects on the C stack.
4816
4817 There are several system-dependent problems to consider when
4818 porting this to new architectures:
4819
4820 Processor Registers
4821
4822 We have to mark Lisp objects in CPU registers that can hold local
4823 variables or are used to pass parameters.
4824
4825 If GC_SAVE_REGISTERS_ON_STACK is defined, it should expand to
4826 something that either saves relevant registers on the stack, or
4827 calls mark_maybe_object passing it each register's contents.
4828
4829 If GC_SAVE_REGISTERS_ON_STACK is not defined, the current
4830 implementation assumes that calling setjmp saves registers we need
4831 to see in a jmp_buf which itself lies on the stack. This doesn't
4832 have to be true! It must be verified for each system, possibly
4833 by taking a look at the source code of setjmp.
4834
2018939f
AS
4835 If __builtin_unwind_init is available (defined by GCC >= 2.8) we
4836 can use it as a machine independent method to store all registers
4837 to the stack. In this case the macros described in the previous
4838 two paragraphs are not used.
4839
182ff242
GM
4840 Stack Layout
4841
4842 Architectures differ in the way their processor stack is organized.
4843 For example, the stack might look like this
4844
4845 +----------------+
4846 | Lisp_Object | size = 4
4847 +----------------+
4848 | something else | size = 2
4849 +----------------+
4850 | Lisp_Object | size = 4
4851 +----------------+
4852 | ... |
4853
4854 In such a case, not every Lisp_Object will be aligned equally. To
4855 find all Lisp_Object on the stack it won't be sufficient to walk
4856 the stack in steps of 4 bytes. Instead, two passes will be
4857 necessary, one starting at the start of the stack, and a second
4858 pass starting at the start of the stack + 2. Likewise, if the
4859 minimal alignment of Lisp_Objects on the stack is 1, four passes
4860 would be necessary, each one starting with one byte more offset
c9af454e 4861 from the stack start. */
34400008
GM
4862
4863static void
971de7fb 4864mark_stack (void)
34400008 4865{
34400008
GM
4866 void *end;
4867
2018939f
AS
4868#ifdef HAVE___BUILTIN_UNWIND_INIT
4869 /* Force callee-saved registers and register windows onto the stack.
4870 This is the preferred method if available, obviating the need for
4871 machine dependent methods. */
4872 __builtin_unwind_init ();
4873 end = &end;
4874#else /* not HAVE___BUILTIN_UNWIND_INIT */
dff45157
PE
4875#ifndef GC_SAVE_REGISTERS_ON_STACK
4876 /* jmp_buf may not be aligned enough on darwin-ppc64 */
4877 union aligned_jmpbuf {
4878 Lisp_Object o;
0328b6de 4879 sys_jmp_buf j;
dff45157 4880 } j;
fce31d69 4881 volatile bool stack_grows_down_p = (char *) &j > (char *) stack_base;
dff45157 4882#endif
34400008
GM
4883 /* This trick flushes the register windows so that all the state of
4884 the process is contained in the stack. */
ab6780cd 4885 /* Fixme: Code in the Boehm GC suggests flushing (with `flushrs') is
422eec7e
DL
4886 needed on ia64 too. See mach_dep.c, where it also says inline
4887 assembler doesn't work with relevant proprietary compilers. */
4a00783e 4888#ifdef __sparc__
4d18a7a2
DN
4889#if defined (__sparc64__) && defined (__FreeBSD__)
4890 /* FreeBSD does not have a ta 3 handler. */
4c1616be
CY
4891 asm ("flushw");
4892#else
34400008 4893 asm ("ta 3");
4c1616be 4894#endif
34400008 4895#endif
177c0ea7 4896
34400008
GM
4897 /* Save registers that we need to see on the stack. We need to see
4898 registers used to hold register variables and registers used to
4899 pass parameters. */
4900#ifdef GC_SAVE_REGISTERS_ON_STACK
4901 GC_SAVE_REGISTERS_ON_STACK (end);
182ff242 4902#else /* not GC_SAVE_REGISTERS_ON_STACK */
177c0ea7 4903
182ff242
GM
4904#ifndef GC_SETJMP_WORKS /* If it hasn't been checked yet that
4905 setjmp will definitely work, test it
4906 and print a message with the result
4907 of the test. */
4908 if (!setjmp_tested_p)
4909 {
4910 setjmp_tested_p = 1;
4911 test_setjmp ();
4912 }
4913#endif /* GC_SETJMP_WORKS */
177c0ea7 4914
0328b6de 4915 sys_setjmp (j.j);
34400008 4916 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
182ff242 4917#endif /* not GC_SAVE_REGISTERS_ON_STACK */
2018939f 4918#endif /* not HAVE___BUILTIN_UNWIND_INIT */
34400008
GM
4919
4920 /* This assumes that the stack is a contiguous region in memory. If
182ff242
GM
4921 that's not the case, something has to be done here to iterate
4922 over the stack segments. */
3164aeac
PE
4923 mark_memory (stack_base, end);
4924
4dec23ff
AS
4925 /* Allow for marking a secondary stack, like the register stack on the
4926 ia64. */
4927#ifdef GC_MARK_SECONDARY_STACK
4928 GC_MARK_SECONDARY_STACK ();
4929#endif
34400008
GM
4930
4931#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4932 check_gcpros ();
4933#endif
4934}
4935
0c5307b0
DA
4936#else /* GC_MARK_STACK == 0 */
4937
4938#define mark_maybe_object(obj) emacs_abort ()
4939
34400008
GM
4940#endif /* GC_MARK_STACK != 0 */
4941
4942
7ffb6955 4943/* Determine whether it is safe to access memory at address P. */
d3d47262 4944static int
971de7fb 4945valid_pointer_p (void *p)
7ffb6955 4946{
f892cf9c
EZ
4947#ifdef WINDOWSNT
4948 return w32_valid_pointer_p (p, 16);
4949#else
41bed37d 4950 int fd[2];
7ffb6955
KS
4951
4952 /* Obviously, we cannot just access it (we would SEGV trying), so we
4953 trick the o/s to tell us whether p is a valid pointer.
4954 Unfortunately, we cannot use NULL_DEVICE here, as emacs_write may
4955 not validate p in that case. */
4956
c7ddc792 4957 if (emacs_pipe (fd) == 0)
7ffb6955 4958 {
223752d7 4959 bool valid = emacs_write (fd[1], p, 16) == 16;
41bed37d
PE
4960 emacs_close (fd[1]);
4961 emacs_close (fd[0]);
7ffb6955
KS
4962 return valid;
4963 }
4964
4965 return -1;
f892cf9c 4966#endif
7ffb6955 4967}
3cd55735 4968
6cda572a
DA
4969/* Return 2 if OBJ is a killed or special buffer object, 1 if OBJ is a
4970 valid lisp object, 0 if OBJ is NOT a valid lisp object, or -1 if we
4971 cannot validate OBJ. This function can be quite slow, so its primary
4972 use is the manual debugging. The only exception is print_object, where
4973 we use it to check whether the memory referenced by the pointer of
4974 Lisp_Save_Value object contains valid objects. */
3cd55735
KS
4975
4976int
971de7fb 4977valid_lisp_object_p (Lisp_Object obj)
3cd55735 4978{
de7124a7 4979 void *p;
7ffb6955 4980#if GC_MARK_STACK
3cd55735 4981 struct mem_node *m;
de7124a7 4982#endif
3cd55735
KS
4983
4984 if (INTEGERP (obj))
4985 return 1;
4986
4987 p = (void *) XPNTR (obj);
3cd55735
KS
4988 if (PURE_POINTER_P (p))
4989 return 1;
4990
c1ca42ca
DA
4991 if (p == &buffer_defaults || p == &buffer_local_symbols)
4992 return 2;
4993
de7124a7 4994#if !GC_MARK_STACK
7ffb6955 4995 return valid_pointer_p (p);
de7124a7
KS
4996#else
4997
3cd55735
KS
4998 m = mem_find (p);
4999
5000 if (m == MEM_NIL)
7ffb6955
KS
5001 {
5002 int valid = valid_pointer_p (p);
5003 if (valid <= 0)
5004 return valid;
5005
5006 if (SUBRP (obj))
5007 return 1;
5008
5009 return 0;
5010 }
3cd55735
KS
5011
5012 switch (m->type)
5013 {
5014 case MEM_TYPE_NON_LISP:
5474c384 5015 case MEM_TYPE_SPARE:
3cd55735
KS
5016 return 0;
5017
5018 case MEM_TYPE_BUFFER:
c1ca42ca 5019 return live_buffer_p (m, p) ? 1 : 2;
3cd55735
KS
5020
5021 case MEM_TYPE_CONS:
5022 return live_cons_p (m, p);
5023
5024 case MEM_TYPE_STRING:
5025 return live_string_p (m, p);
5026
5027 case MEM_TYPE_MISC:
5028 return live_misc_p (m, p);
5029
5030 case MEM_TYPE_SYMBOL:
5031 return live_symbol_p (m, p);
5032
5033 case MEM_TYPE_FLOAT:
5034 return live_float_p (m, p);
5035
9c545a55 5036 case MEM_TYPE_VECTORLIKE:
f3372c87 5037 case MEM_TYPE_VECTOR_BLOCK:
3cd55735
KS
5038 return live_vector_p (m, p);
5039
5040 default:
5041 break;
5042 }
5043
5044 return 0;
5045#endif
5046}
5047
5048
5049
34400008 5050\f
2e471eb5
GM
5051/***********************************************************************
5052 Pure Storage Management
5053 ***********************************************************************/
5054
1f0b3fd2
GM
5055/* Allocate room for SIZE bytes from pure Lisp storage and return a
5056 pointer to it. TYPE is the Lisp type for which the memory is
e5bc14d4 5057 allocated. TYPE < 0 means it's not used for a Lisp object. */
1f0b3fd2 5058
261cb4bb 5059static void *
971de7fb 5060pure_alloc (size_t size, int type)
1f0b3fd2 5061{
261cb4bb 5062 void *result;
bfe3e0a2 5063#if USE_LSB_TAG
2b90362b 5064 size_t alignment = GCALIGNMENT;
6b61353c 5065#else
e32a5799 5066 size_t alignment = alignof (EMACS_INT);
1f0b3fd2
GM
5067
5068 /* Give Lisp_Floats an extra alignment. */
5069 if (type == Lisp_Float)
e32a5799 5070 alignment = alignof (struct Lisp_Float);
6b61353c 5071#endif
1f0b3fd2 5072
44117420 5073 again:
e5bc14d4
YM
5074 if (type >= 0)
5075 {
5076 /* Allocate space for a Lisp object from the beginning of the free
5077 space with taking account of alignment. */
5078 result = ALIGN (purebeg + pure_bytes_used_lisp, alignment);
5079 pure_bytes_used_lisp = ((char *)result - (char *)purebeg) + size;
5080 }
5081 else
5082 {
5083 /* Allocate space for a non-Lisp object from the end of the free
5084 space. */
5085 pure_bytes_used_non_lisp += size;
5086 result = purebeg + pure_size - pure_bytes_used_non_lisp;
5087 }
5088 pure_bytes_used = pure_bytes_used_lisp + pure_bytes_used_non_lisp;
44117420
KS
5089
5090 if (pure_bytes_used <= pure_size)
5091 return result;
5092
5093 /* Don't allocate a large amount here,
5094 because it might get mmap'd and then its address
5095 might not be usable. */
23f86fce 5096 purebeg = xmalloc (10000);
44117420
KS
5097 pure_size = 10000;
5098 pure_bytes_used_before_overflow += pure_bytes_used - size;
5099 pure_bytes_used = 0;
e5bc14d4 5100 pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;
44117420 5101 goto again;
1f0b3fd2
GM
5102}
5103
5104
852f8cdc 5105/* Print a warning if PURESIZE is too small. */
9e713715
GM
5106
5107void
971de7fb 5108check_pure_size (void)
9e713715
GM
5109{
5110 if (pure_bytes_used_before_overflow)
c2982e87
PE
5111 message (("emacs:0:Pure Lisp storage overflow (approx. %"pI"d"
5112 " bytes needed)"),
5113 pure_bytes_used + pure_bytes_used_before_overflow);
9e713715
GM
5114}
5115
5116
79fd0489
YM
5117/* Find the byte sequence {DATA[0], ..., DATA[NBYTES-1], '\0'} from
5118 the non-Lisp data pool of the pure storage, and return its start
5119 address. Return NULL if not found. */
5120
5121static char *
d311d28c 5122find_string_data_in_pure (const char *data, ptrdiff_t nbytes)
79fd0489 5123{
14162469 5124 int i;
d311d28c 5125 ptrdiff_t skip, bm_skip[256], last_char_skip, infinity, start, start_max;
2aff7c53 5126 const unsigned char *p;
79fd0489
YM
5127 char *non_lisp_beg;
5128
d311d28c 5129 if (pure_bytes_used_non_lisp <= nbytes)
79fd0489
YM
5130 return NULL;
5131
5132 /* Set up the Boyer-Moore table. */
5133 skip = nbytes + 1;
5134 for (i = 0; i < 256; i++)
5135 bm_skip[i] = skip;
5136
2aff7c53 5137 p = (const unsigned char *) data;
79fd0489
YM
5138 while (--skip > 0)
5139 bm_skip[*p++] = skip;
5140
5141 last_char_skip = bm_skip['\0'];
5142
5143 non_lisp_beg = purebeg + pure_size - pure_bytes_used_non_lisp;
5144 start_max = pure_bytes_used_non_lisp - (nbytes + 1);
5145
5146 /* See the comments in the function `boyer_moore' (search.c) for the
5147 use of `infinity'. */
5148 infinity = pure_bytes_used_non_lisp + 1;
5149 bm_skip['\0'] = infinity;
5150
2aff7c53 5151 p = (const unsigned char *) non_lisp_beg + nbytes;
79fd0489
YM
5152 start = 0;
5153 do
5154 {
5155 /* Check the last character (== '\0'). */
5156 do
5157 {
5158 start += bm_skip[*(p + start)];
5159 }
5160 while (start <= start_max);
5161
5162 if (start < infinity)
5163 /* Couldn't find the last character. */
5164 return NULL;
5165
5166 /* No less than `infinity' means we could find the last
5167 character at `p[start - infinity]'. */
5168 start -= infinity;
5169
5170 /* Check the remaining characters. */
5171 if (memcmp (data, non_lisp_beg + start, nbytes) == 0)
5172 /* Found. */
5173 return non_lisp_beg + start;
5174
5175 start += last_char_skip;
5176 }
5177 while (start <= start_max);
5178
5179 return NULL;
5180}
5181
5182
2e471eb5
GM
5183/* Return a string allocated in pure space. DATA is a buffer holding
5184 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
fce31d69 5185 means make the result string multibyte.
1a4f1e2c 5186
2e471eb5
GM
5187 Must get an error if pure storage is full, since if it cannot hold
5188 a large string it may be able to hold conses that point to that
5189 string; then the string is not protected from gc. */
7146af97
JB
5190
5191Lisp_Object
14162469 5192make_pure_string (const char *data,
fce31d69 5193 ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
7146af97 5194{
2e471eb5 5195 Lisp_Object string;
98c6f1e3 5196 struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
90256841 5197 s->data = (unsigned char *) find_string_data_in_pure (data, nbytes);
79fd0489
YM
5198 if (s->data == NULL)
5199 {
98c6f1e3 5200 s->data = pure_alloc (nbytes + 1, -1);
72af86bd 5201 memcpy (s->data, data, nbytes);
79fd0489
YM
5202 s->data[nbytes] = '\0';
5203 }
2e471eb5
GM
5204 s->size = nchars;
5205 s->size_byte = multibyte ? nbytes : -1;
77c7bcb1 5206 s->intervals = NULL;
2e471eb5
GM
5207 XSETSTRING (string, s);
5208 return string;
7146af97
JB
5209}
5210
2a0213a6
DA
5211/* Return a string allocated in pure space. Do not
5212 allocate the string data, just point to DATA. */
a56eaaef
DN
5213
5214Lisp_Object
2a0213a6 5215make_pure_c_string (const char *data, ptrdiff_t nchars)
a56eaaef
DN
5216{
5217 Lisp_Object string;
98c6f1e3 5218 struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
a56eaaef
DN
5219 s->size = nchars;
5220 s->size_byte = -1;
323637a2 5221 s->data = (unsigned char *) data;
77c7bcb1 5222 s->intervals = NULL;
a56eaaef
DN
5223 XSETSTRING (string, s);
5224 return string;
5225}
2e471eb5 5226
e3b83880
SM
5227static Lisp_Object purecopy (Lisp_Object obj);
5228
34400008
GM
5229/* Return a cons allocated from pure space. Give it pure copies
5230 of CAR as car and CDR as cdr. */
5231
7146af97 5232Lisp_Object
971de7fb 5233pure_cons (Lisp_Object car, Lisp_Object cdr)
7146af97 5234{
98c6f1e3
PE
5235 Lisp_Object new;
5236 struct Lisp_Cons *p = pure_alloc (sizeof *p, Lisp_Cons);
1f0b3fd2 5237 XSETCONS (new, p);
e3b83880
SM
5238 XSETCAR (new, purecopy (car));
5239 XSETCDR (new, purecopy (cdr));
7146af97
JB
5240 return new;
5241}
5242
7146af97 5243
34400008
GM
5244/* Value is a float object with value NUM allocated from pure space. */
5245
d3d47262 5246static Lisp_Object
971de7fb 5247make_pure_float (double num)
7146af97 5248{
98c6f1e3
PE
5249 Lisp_Object new;
5250 struct Lisp_Float *p = pure_alloc (sizeof *p, Lisp_Float);
1f0b3fd2 5251 XSETFLOAT (new, p);
f601cdf3 5252 XFLOAT_INIT (new, num);
7146af97
JB
5253 return new;
5254}
5255
34400008
GM
5256
5257/* Return a vector with room for LEN Lisp_Objects allocated from
5258 pure space. */
5259
72cb32cf 5260static Lisp_Object
d311d28c 5261make_pure_vector (ptrdiff_t len)
7146af97 5262{
1f0b3fd2 5263 Lisp_Object new;
d06714cb 5264 size_t size = header_size + len * word_size;
98c6f1e3 5265 struct Lisp_Vector *p = pure_alloc (size, Lisp_Vectorlike);
1f0b3fd2 5266 XSETVECTOR (new, p);
eab3844f 5267 XVECTOR (new)->header.size = len;
7146af97
JB
5268 return new;
5269}
5270
34400008 5271
a7ca3326 5272DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
909e3b33 5273 doc: /* Make a copy of object OBJ in pure storage.
228299fa 5274Recursively copies contents of vectors and cons cells.
7ee72033 5275Does not copy symbols. Copies strings without text properties. */)
5842a27b 5276 (register Lisp_Object obj)
7146af97 5277{
265a9e55 5278 if (NILP (Vpurify_flag))
7146af97 5279 return obj;
e3b83880
SM
5280 else if (MARKERP (obj) || OVERLAYP (obj)
5281 || HASH_TABLE_P (obj) || SYMBOLP (obj))
5282 /* Can't purify those. */
7146af97 5283 return obj;
e3b83880
SM
5284 else
5285 return purecopy (obj);
5286}
5287
5288static Lisp_Object
5289purecopy (Lisp_Object obj)
5290{
5291 if (PURE_POINTER_P (XPNTR (obj)) || INTEGERP (obj) || SUBRP (obj))
5292 return obj; /* Already pure. */
7146af97 5293
e9515805
SM
5294 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
5295 {
5296 Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil);
5297 if (!NILP (tmp))
5298 return tmp;
5299 }
5300
d6dd74bb 5301 if (CONSP (obj))
e9515805 5302 obj = pure_cons (XCAR (obj), XCDR (obj));
d6dd74bb 5303 else if (FLOATP (obj))
e9515805 5304 obj = make_pure_float (XFLOAT_DATA (obj));
d6dd74bb 5305 else if (STRINGP (obj))
42a5b22f 5306 obj = make_pure_string (SSDATA (obj), SCHARS (obj),
e9515805
SM
5307 SBYTES (obj),
5308 STRING_MULTIBYTE (obj));
876c194c 5309 else if (COMPILEDP (obj) || VECTORP (obj))
d6dd74bb
KH
5310 {
5311 register struct Lisp_Vector *vec;
d311d28c
PE
5312 register ptrdiff_t i;
5313 ptrdiff_t size;
d6dd74bb 5314
77b37c05 5315 size = ASIZE (obj);
7d535c68
KH
5316 if (size & PSEUDOVECTOR_FLAG)
5317 size &= PSEUDOVECTOR_SIZE_MASK;
6b61353c 5318 vec = XVECTOR (make_pure_vector (size));
d6dd74bb 5319 for (i = 0; i < size; i++)
e3b83880 5320 vec->contents[i] = purecopy (AREF (obj, i));
876c194c 5321 if (COMPILEDP (obj))
985773c9 5322 {
876c194c
SM
5323 XSETPVECTYPE (vec, PVEC_COMPILED);
5324 XSETCOMPILED (obj, vec);
985773c9 5325 }
d6dd74bb
KH
5326 else
5327 XSETVECTOR (obj, vec);
7146af97 5328 }
e3b83880
SM
5329 else if (SYMBOLP (obj))
5330 {
5331 if (!XSYMBOL (obj)->pinned)
5332 { /* We can't purify them, but they appear in many pure objects.
5333 Mark them as `pinned' so we know to mark them at every GC cycle. */
5334 XSYMBOL (obj)->pinned = true;
5335 symbol_block_pinned = symbol_block;
5336 }
5337 return obj;
5338 }
e9515805 5339 else
e3b83880
SM
5340 {
5341 Lisp_Object args[2];
5342 args[0] = build_pure_c_string ("Don't know how to purify: %S");
5343 args[1] = obj;
5344 Fsignal (Qerror, (Fcons (Fformat (2, args), Qnil)));
5345 }
e9515805
SM
5346
5347 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
5348 Fputhash (obj, obj, Vpurify_flag);
6bbd7a29
GM
5349
5350 return obj;
7146af97 5351}
2e471eb5 5352
34400008 5353
7146af97 5354\f
34400008
GM
5355/***********************************************************************
5356 Protection from GC
5357 ***********************************************************************/
5358
2e471eb5
GM
5359/* Put an entry in staticvec, pointing at the variable with address
5360 VARADDRESS. */
7146af97
JB
5361
5362void
971de7fb 5363staticpro (Lisp_Object *varaddress)
7146af97 5364{
7146af97 5365 if (staticidx >= NSTATICS)
afb8aa24 5366 fatal ("NSTATICS too small; try increasing and recompiling Emacs.");
4195afc3 5367 staticvec[staticidx++] = varaddress;
7146af97
JB
5368}
5369
7146af97 5370\f
34400008
GM
5371/***********************************************************************
5372 Protection from GC
5373 ***********************************************************************/
1a4f1e2c 5374
e8197642
RS
5375/* Temporarily prevent garbage collection. */
5376
d311d28c 5377ptrdiff_t
971de7fb 5378inhibit_garbage_collection (void)
e8197642 5379{
d311d28c 5380 ptrdiff_t count = SPECPDL_INDEX ();
54defd0d 5381
6349ae4d 5382 specbind (Qgc_cons_threshold, make_number (MOST_POSITIVE_FIXNUM));
e8197642
RS
5383 return count;
5384}
5385
3ab6e069
DA
5386/* Used to avoid possible overflows when
5387 converting from C to Lisp integers. */
5388
b0ab8123 5389static Lisp_Object
3ab6e069
DA
5390bounded_number (EMACS_INT number)
5391{
5392 return make_number (min (MOST_POSITIVE_FIXNUM, number));
5393}
34400008 5394
12b3895d
TM
5395/* Calculate total bytes of live objects. */
5396
5397static size_t
5398total_bytes_of_live_objects (void)
5399{
5400 size_t tot = 0;
5401 tot += total_conses * sizeof (struct Lisp_Cons);
5402 tot += total_symbols * sizeof (struct Lisp_Symbol);
5403 tot += total_markers * sizeof (union Lisp_Misc);
5404 tot += total_string_bytes;
5405 tot += total_vector_slots * word_size;
5406 tot += total_floats * sizeof (struct Lisp_Float);
5407 tot += total_intervals * sizeof (struct interval);
5408 tot += total_strings * sizeof (struct Lisp_String);
5409 return tot;
5410}
5411
fc54bdd5
DA
5412#ifdef HAVE_WINDOW_SYSTEM
5413
5ae356d9
DA
5414/* This code has a few issues on MS-Windows, see Bug#15876 and Bug#16140. */
5415
5416#if !defined (HAVE_NTGUI)
5417
fc54bdd5
DA
5418/* Remove unmarked font-spec and font-entity objects from ENTRY, which is
5419 (DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...), and return changed entry. */
5420
5421static Lisp_Object
5422compact_font_cache_entry (Lisp_Object entry)
5423{
5424 Lisp_Object tail, *prev = &entry;
5425
5426 for (tail = entry; CONSP (tail); tail = XCDR (tail))
5427 {
5428 bool drop = 0;
5429 Lisp_Object obj = XCAR (tail);
5430
5431 /* Consider OBJ if it is (font-spec . [font-entity font-entity ...]). */
5432 if (CONSP (obj) && FONT_SPEC_P (XCAR (obj))
5433 && !VECTOR_MARKED_P (XFONT_SPEC (XCAR (obj)))
5434 && VECTORP (XCDR (obj)))
5435 {
5436 ptrdiff_t i, size = ASIZE (XCDR (obj)) & ~ARRAY_MARK_FLAG;
5437
5438 /* If font-spec is not marked, most likely all font-entities
5439 are not marked too. But we must be sure that nothing is
5440 marked within OBJ before we really drop it. */
5441 for (i = 0; i < size; i++)
5442 if (VECTOR_MARKED_P (XFONT_ENTITY (AREF (XCDR (obj), i))))
5443 break;
5444
5445 if (i == size)
5446 drop = 1;
5447 }
5448 if (drop)
5449 *prev = XCDR (tail);
5450 else
5451 prev = xcdr_addr (tail);
5452 }
5453 return entry;
5454}
5455
5ae356d9
DA
5456#endif /* not HAVE_NTGUI */
5457
fc54bdd5
DA
5458/* Compact font caches on all terminals and mark
5459 everything which is still here after compaction. */
5460
5461static void
5462compact_font_caches (void)
5463{
5464 struct terminal *t;
5465
5466 for (t = terminal_list; t; t = t->next_terminal)
5467 {
5468 Lisp_Object cache = TERMINAL_FONT_CACHE (t);
5ae356d9 5469#if !defined (HAVE_NTGUI)
fc54bdd5
DA
5470 if (CONSP (cache))
5471 {
5472 Lisp_Object entry;
5473
5474 for (entry = XCDR (cache); CONSP (entry); entry = XCDR (entry))
5475 XSETCAR (entry, compact_font_cache_entry (XCAR (entry)));
5476 }
5ae356d9 5477#endif /* not HAVE_NTGUI */
fc54bdd5
DA
5478 mark_object (cache);
5479 }
5480}
5481
5482#else /* not HAVE_WINDOW_SYSTEM */
5483
5484#define compact_font_caches() (void)(0)
5485
5486#endif /* HAVE_WINDOW_SYSTEM */
5487
5488/* Remove (MARKER . DATA) entries with unmarked MARKER
5489 from buffer undo LIST and return changed list. */
5490
5491static Lisp_Object
5492compact_undo_list (Lisp_Object list)
5493{
5494 Lisp_Object tail, *prev = &list;
5495
5496 for (tail = list; CONSP (tail); tail = XCDR (tail))
5497 {
5498 if (CONSP (XCAR (tail))
5499 && MARKERP (XCAR (XCAR (tail)))
5500 && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
5501 *prev = XCDR (tail);
5502 else
5503 prev = xcdr_addr (tail);
5504 }
5505 return list;
5506}
5507
e3b83880
SM
5508static void
5509mark_pinned_symbols (void)
5510{
5511 struct symbol_block *sblk;
5512 int lim = (symbol_block_pinned == symbol_block
5513 ? symbol_block_index : SYMBOL_BLOCK_SIZE);
5514
5515 for (sblk = symbol_block_pinned; sblk; sblk = sblk->next)
5516 {
5517 union aligned_Lisp_Symbol *sym = sblk->symbols, *end = sym + lim;
5518 for (; sym < end; ++sym)
5519 if (sym->s.pinned)
5520 mark_object (make_lisp_ptr (&sym->s, Lisp_Symbol));
5521
5522 lim = SYMBOL_BLOCK_SIZE;
5523 }
5524}
5525
a7ca3326 5526DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
7ee72033 5527 doc: /* Reclaim storage for Lisp objects no longer needed.
e1e37596
RS
5528Garbage collection happens automatically if you cons more than
5529`gc-cons-threshold' bytes of Lisp data since previous garbage collection.
5db81e33
SM
5530`garbage-collect' normally returns a list with info on amount of space in use,
5531where each entry has the form (NAME SIZE USED FREE), where:
5532- NAME is a symbol describing the kind of objects this entry represents,
5533- SIZE is the number of bytes used by each one,
5534- USED is the number of those objects that were found live in the heap,
5535- FREE is the number of those objects that are not live but that Emacs
5536 keeps around for future allocations (maybe because it does not know how
5537 to return them to the OS).
e1e37596 5538However, if there was overflow in pure space, `garbage-collect'
999dd333
GM
5539returns nil, because real GC can't be done.
5540See Info node `(elisp)Garbage Collection'. */)
5842a27b 5541 (void)
7146af97 5542{
fce31d69 5543 struct buffer *nextb;
7146af97 5544 char stack_top_variable;
f66c7cf8 5545 ptrdiff_t i;
fce31d69 5546 bool message_p;
d311d28c 5547 ptrdiff_t count = SPECPDL_INDEX ();
43aac990 5548 struct timespec start;
fecbd8ff 5549 Lisp_Object retval = Qnil;
12b3895d 5550 size_t tot_before = 0;
2c5bd608 5551
3de0effb 5552 if (abort_on_gc)
1088b922 5553 emacs_abort ();
3de0effb 5554
9e713715
GM
5555 /* Can't GC if pure storage overflowed because we can't determine
5556 if something is a pure object or not. */
5557 if (pure_bytes_used_before_overflow)
5558 return Qnil;
5559
3d80c99f 5560 /* Record this function, so it appears on the profiler's backtraces. */
2f592f95 5561 record_in_backtrace (Qautomatic_gc, &Qnil, 0);
3d80c99f 5562
7e63e0c3 5563 check_cons_list ();
bbc012e0 5564
3c7e66a8
RS
5565 /* Don't keep undo information around forever.
5566 Do this early on, so it is no problem if the user quits. */
52b852c7 5567 FOR_EACH_BUFFER (nextb)
9cd47b72 5568 compact_buffer (nextb);
3c7e66a8 5569
6521894d 5570 if (profiler_memory_running)
12b3895d
TM
5571 tot_before = total_bytes_of_live_objects ();
5572
43aac990 5573 start = current_timespec ();
3c7e66a8 5574
58595309
KH
5575 /* In case user calls debug_print during GC,
5576 don't let that cause a recursive GC. */
5577 consing_since_gc = 0;
5578
6efc7df7
GM
5579 /* Save what's currently displayed in the echo area. */
5580 message_p = push_message ();
27e498e6 5581 record_unwind_protect_void (pop_message_unwind);
41c28a37 5582
7146af97
JB
5583 /* Save a copy of the contents of the stack, for debugging. */
5584#if MAX_SAVE_STACK > 0
265a9e55 5585 if (NILP (Vpurify_flag))
7146af97 5586 {
dd3f25f7 5587 char *stack;
903fe15d 5588 ptrdiff_t stack_size;
dd3f25f7 5589 if (&stack_top_variable < stack_bottom)
7146af97 5590 {
dd3f25f7
PE
5591 stack = &stack_top_variable;
5592 stack_size = stack_bottom - &stack_top_variable;
5593 }
5594 else
5595 {
5596 stack = stack_bottom;
5597 stack_size = &stack_top_variable - stack_bottom;
5598 }
5599 if (stack_size <= MAX_SAVE_STACK)
7146af97 5600 {
dd3f25f7 5601 if (stack_copy_size < stack_size)
7146af97 5602 {
38182d90 5603 stack_copy = xrealloc (stack_copy, stack_size);
dd3f25f7 5604 stack_copy_size = stack_size;
7146af97 5605 }
e76119d7 5606 no_sanitize_memcpy (stack_copy, stack, stack_size);
7146af97
JB
5607 }
5608 }
5609#endif /* MAX_SAVE_STACK > 0 */
5610
299585ee 5611 if (garbage_collection_messages)
691c4285 5612 message1_nolog ("Garbage collecting...");
7146af97 5613
4d7e6e51 5614 block_input ();
6e0fca1d 5615
eec7b73d
RS
5616 shrink_regexp_cache ();
5617
7146af97
JB
5618 gc_in_progress = 1;
5619
005ca5c7 5620 /* Mark all the special slots that serve as the roots of accessibility. */
7146af97 5621
c752cfa9
DA
5622 mark_buffer (&buffer_defaults);
5623 mark_buffer (&buffer_local_symbols);
5624
7146af97 5625 for (i = 0; i < staticidx; i++)
49723c04 5626 mark_object (*staticvec[i]);
34400008 5627
e3b83880 5628 mark_pinned_symbols ();
2f592f95 5629 mark_specpdl ();
6ed8eeff 5630 mark_terminals ();
126f9c02
SM
5631 mark_kboards ();
5632
5633#ifdef USE_GTK
a411ac43 5634 xg_mark_data ();
126f9c02
SM
5635#endif
5636
34400008
GM
5637#if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
5638 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
5639 mark_stack ();
5640#else
acf5f7d3
SM
5641 {
5642 register struct gcpro *tail;
5643 for (tail = gcprolist; tail; tail = tail->next)
5644 for (i = 0; i < tail->nvars; i++)
005ca5c7 5645 mark_object (tail->var[i]);
acf5f7d3 5646 }
3e21b6a7 5647 mark_byte_stack ();
adf2aa61 5648#endif
b286858c 5649 {
b286858c 5650 struct handler *handler;
adf2aa61
SM
5651 for (handler = handlerlist; handler; handler = handler->next)
5652 {
5653 mark_object (handler->tag_or_ch);
5654 mark_object (handler->val);
5655 }
b286858c 5656 }
454d7973
KS
5657#ifdef HAVE_WINDOW_SYSTEM
5658 mark_fringe_data ();
5659#endif
5660
74c35a48
SM
5661#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
5662 mark_stack ();
5663#endif
5664
fc54bdd5
DA
5665 /* Everything is now marked, except for the data in font caches
5666 and undo lists. They're compacted by removing an items which
5667 aren't reachable otherwise. */
5668
5669 compact_font_caches ();
5670
52b852c7 5671 FOR_EACH_BUFFER (nextb)
d17337e5 5672 {
fc54bdd5
DA
5673 if (!EQ (BVAR (nextb, undo_list), Qt))
5674 bset_undo_list (nextb, compact_undo_list (BVAR (nextb, undo_list)));
5675 /* Now that we have stripped the elements that need not be
5676 in the undo_list any more, we can finally mark the list. */
5677 mark_object (BVAR (nextb, undo_list));
d17337e5 5678 }
4c315bda 5679
7146af97
JB
5680 gc_sweep ();
5681
5682 /* Clear the mark bits that we set in certain root slots. */
5683
033a5fa3 5684 unmark_byte_stack ();
3ef06d12
SM
5685 VECTOR_UNMARK (&buffer_defaults);
5686 VECTOR_UNMARK (&buffer_local_symbols);
7146af97 5687
34400008
GM
5688#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
5689 dump_zombies ();
5690#endif
5691
7e63e0c3 5692 check_cons_list ();
bbc012e0 5693
7146af97
JB
5694 gc_in_progress = 0;
5695
5c747675
DA
5696 unblock_input ();
5697
7146af97 5698 consing_since_gc = 0;
0dd6d66d
DA
5699 if (gc_cons_threshold < GC_DEFAULT_THRESHOLD / 10)
5700 gc_cons_threshold = GC_DEFAULT_THRESHOLD / 10;
7146af97 5701
c0c5c8ae 5702 gc_relative_threshold = 0;
96f077ad
SM
5703 if (FLOATP (Vgc_cons_percentage))
5704 { /* Set gc_cons_combined_threshold. */
12b3895d 5705 double tot = total_bytes_of_live_objects ();
ae35e756 5706
c0c5c8ae 5707 tot *= XFLOAT_DATA (Vgc_cons_percentage);
7216e43b 5708 if (0 < tot)
c0c5c8ae
PE
5709 {
5710 if (tot < TYPE_MAXIMUM (EMACS_INT))
5711 gc_relative_threshold = tot;
5712 else
5713 gc_relative_threshold = TYPE_MAXIMUM (EMACS_INT);
5714 }
96f077ad
SM
5715 }
5716
299585ee
RS
5717 if (garbage_collection_messages)
5718 {
6efc7df7
GM
5719 if (message_p || minibuf_level > 0)
5720 restore_message ();
299585ee
RS
5721 else
5722 message1_nolog ("Garbage collecting...done");
5723 }
7146af97 5724
98edb5ff 5725 unbind_to (count, Qnil);
fecbd8ff
SM
5726 {
5727 Lisp_Object total[11];
5728 int total_size = 10;
2e471eb5 5729
fecbd8ff
SM
5730 total[0] = list4 (Qconses, make_number (sizeof (struct Lisp_Cons)),
5731 bounded_number (total_conses),
5732 bounded_number (total_free_conses));
3ab6e069 5733
fecbd8ff
SM
5734 total[1] = list4 (Qsymbols, make_number (sizeof (struct Lisp_Symbol)),
5735 bounded_number (total_symbols),
5736 bounded_number (total_free_symbols));
3ab6e069 5737
fecbd8ff
SM
5738 total[2] = list4 (Qmiscs, make_number (sizeof (union Lisp_Misc)),
5739 bounded_number (total_markers),
5740 bounded_number (total_free_markers));
3ab6e069 5741
fecbd8ff
SM
5742 total[3] = list4 (Qstrings, make_number (sizeof (struct Lisp_String)),
5743 bounded_number (total_strings),
5744 bounded_number (total_free_strings));
3ab6e069 5745
fecbd8ff
SM
5746 total[4] = list3 (Qstring_bytes, make_number (1),
5747 bounded_number (total_string_bytes));
3ab6e069 5748
fbe9e0b9
PE
5749 total[5] = list3 (Qvectors,
5750 make_number (header_size + sizeof (Lisp_Object)),
fecbd8ff 5751 bounded_number (total_vectors));
5b835e1d 5752
fecbd8ff
SM
5753 total[6] = list4 (Qvector_slots, make_number (word_size),
5754 bounded_number (total_vector_slots),
5755 bounded_number (total_free_vector_slots));
5b835e1d 5756
fecbd8ff
SM
5757 total[7] = list4 (Qfloats, make_number (sizeof (struct Lisp_Float)),
5758 bounded_number (total_floats),
5759 bounded_number (total_free_floats));
3ab6e069 5760
fecbd8ff
SM
5761 total[8] = list4 (Qintervals, make_number (sizeof (struct interval)),
5762 bounded_number (total_intervals),
5763 bounded_number (total_free_intervals));
3ab6e069 5764
fecbd8ff
SM
5765 total[9] = list3 (Qbuffers, make_number (sizeof (struct buffer)),
5766 bounded_number (total_buffers));
2e471eb5 5767
f8643a6b 5768#ifdef DOUG_LEA_MALLOC
fecbd8ff
SM
5769 total_size++;
5770 total[10] = list4 (Qheap, make_number (1024),
5771 bounded_number ((mallinfo ().uordblks + 1023) >> 10),
5772 bounded_number ((mallinfo ().fordblks + 1023) >> 10));
f8643a6b 5773#endif
fecbd8ff
SM
5774 retval = Flist (total_size, total);
5775 }
f8643a6b 5776
34400008 5777#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
7146af97 5778 {
34400008 5779 /* Compute average percentage of zombies. */
fecbd8ff
SM
5780 double nlive
5781 = (total_conses + total_symbols + total_markers + total_strings
5782 + total_vectors + total_floats + total_intervals + total_buffers);
34400008
GM
5783
5784 avg_live = (avg_live * ngcs + nlive) / (ngcs + 1);
5785 max_live = max (nlive, max_live);
5786 avg_zombies = (avg_zombies * ngcs + nzombies) / (ngcs + 1);
5787 max_zombies = max (nzombies, max_zombies);
5788 ++ngcs;
dbcf001c 5789 }
34400008 5790#endif
7146af97 5791
9e713715
GM
5792 if (!NILP (Vpost_gc_hook))
5793 {
d311d28c 5794 ptrdiff_t gc_count = inhibit_garbage_collection ();
9e713715 5795 safe_run_hooks (Qpost_gc_hook);
ae35e756 5796 unbind_to (gc_count, Qnil);
9e713715 5797 }
2c5bd608
DL
5798
5799 /* Accumulate statistics. */
2c5bd608 5800 if (FLOATP (Vgc_elapsed))
387d4d92 5801 {
43aac990 5802 struct timespec since_start = timespec_sub (current_timespec (), start);
387d4d92 5803 Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed)
43aac990 5804 + timespectod (since_start));
387d4d92 5805 }
d35af63c 5806
2c5bd608
DL
5807 gcs_done++;
5808
12b3895d 5809 /* Collect profiling data. */
6521894d 5810 if (profiler_memory_running)
12b3895d
TM
5811 {
5812 size_t swept = 0;
6521894d
SM
5813 size_t tot_after = total_bytes_of_live_objects ();
5814 if (tot_before > tot_after)
5815 swept = tot_before - tot_after;
3d80c99f 5816 malloc_probe (swept);
12b3895d
TM
5817 }
5818
fecbd8ff 5819 return retval;
7146af97 5820}
34400008 5821
41c28a37 5822
3770920e
GM
5823/* Mark Lisp objects in glyph matrix MATRIX. Currently the
5824 only interesting objects referenced from glyphs are strings. */
41c28a37
GM
5825
5826static void
971de7fb 5827mark_glyph_matrix (struct glyph_matrix *matrix)
41c28a37
GM
5828{
5829 struct glyph_row *row = matrix->rows;
5830 struct glyph_row *end = row + matrix->nrows;
5831
2e471eb5
GM
5832 for (; row < end; ++row)
5833 if (row->enabled_p)
5834 {
5835 int area;
5836 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
5837 {
5838 struct glyph *glyph = row->glyphs[area];
5839 struct glyph *end_glyph = glyph + row->used[area];
177c0ea7 5840
2e471eb5 5841 for (; glyph < end_glyph; ++glyph)
8e50cc2d 5842 if (STRINGP (glyph->object)
2e471eb5 5843 && !STRING_MARKED_P (XSTRING (glyph->object)))
49723c04 5844 mark_object (glyph->object);
2e471eb5
GM
5845 }
5846 }
41c28a37
GM
5847}
5848
1a4f1e2c 5849/* Mark reference to a Lisp_Object.
2e471eb5
GM
5850 If the object referred to has not been seen yet, recursively mark
5851 all the references contained in it. */
7146af97 5852
785cd37f 5853#define LAST_MARKED_SIZE 500
d3d47262 5854static Lisp_Object last_marked[LAST_MARKED_SIZE];
244ed907 5855static int last_marked_index;
785cd37f 5856
1342fc6f
RS
5857/* For debugging--call abort when we cdr down this many
5858 links of a list, in mark_object. In debugging,
5859 the call to abort will hit a breakpoint.
5860 Normally this is zero and the check never goes off. */
903fe15d 5861ptrdiff_t mark_object_loop_halt EXTERNALLY_VISIBLE;
1342fc6f 5862
8f11f7ec 5863static void
971de7fb 5864mark_vectorlike (struct Lisp_Vector *ptr)
d2029e5b 5865{
d311d28c
PE
5866 ptrdiff_t size = ptr->header.size;
5867 ptrdiff_t i;
d2029e5b 5868
8f11f7ec 5869 eassert (!VECTOR_MARKED_P (ptr));
7555c33f 5870 VECTOR_MARK (ptr); /* Else mark it. */
d2029e5b
SM
5871 if (size & PSEUDOVECTOR_FLAG)
5872 size &= PSEUDOVECTOR_SIZE_MASK;
d3d47262 5873
d2029e5b
SM
5874 /* Note that this size is not the memory-footprint size, but only
5875 the number of Lisp_Object fields that we should trace.
5876 The distinction is used e.g. by Lisp_Process which places extra
7555c33f
SM
5877 non-Lisp_Object fields at the end of the structure... */
5878 for (i = 0; i < size; i++) /* ...and then mark its elements. */
91f2d272 5879 mark_object (ptr->contents[i]);
d2029e5b
SM
5880}
5881
58026347
KH
5882/* Like mark_vectorlike but optimized for char-tables (and
5883 sub-char-tables) assuming that the contents are mostly integers or
5884 symbols. */
5885
5886static void
971de7fb 5887mark_char_table (struct Lisp_Vector *ptr)
58026347 5888{
b6439961
PE
5889 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
5890 int i;
58026347 5891
8f11f7ec 5892 eassert (!VECTOR_MARKED_P (ptr));
58026347
KH
5893 VECTOR_MARK (ptr);
5894 for (i = 0; i < size; i++)
5895 {
91f2d272 5896 Lisp_Object val = ptr->contents[i];
58026347 5897
ef1b0ba7 5898 if (INTEGERP (val) || (SYMBOLP (val) && XSYMBOL (val)->gcmarkbit))
58026347
KH
5899 continue;
5900 if (SUB_CHAR_TABLE_P (val))
5901 {
5902 if (! VECTOR_MARKED_P (XVECTOR (val)))
5903 mark_char_table (XVECTOR (val));
5904 }
5905 else
5906 mark_object (val);
5907 }
5908}
5909
36429c89
DA
5910/* Mark the chain of overlays starting at PTR. */
5911
5912static void
5913mark_overlay (struct Lisp_Overlay *ptr)
5914{
5915 for (; ptr && !ptr->gcmarkbit; ptr = ptr->next)
5916 {
5917 ptr->gcmarkbit = 1;
c644523b
DA
5918 mark_object (ptr->start);
5919 mark_object (ptr->end);
5920 mark_object (ptr->plist);
36429c89
DA
5921 }
5922}
5923
5924/* Mark Lisp_Objects and special pointers in BUFFER. */
cf5c0175
DA
5925
5926static void
5927mark_buffer (struct buffer *buffer)
5928{
b4fa72f2
DA
5929 /* This is handled much like other pseudovectors... */
5930 mark_vectorlike ((struct Lisp_Vector *) buffer);
cf5c0175 5931
b4fa72f2 5932 /* ...but there are some buffer-specific things. */
cf5c0175 5933
b4fa72f2 5934 MARK_INTERVAL_TREE (buffer_intervals (buffer));
cf5c0175 5935
b4fa72f2
DA
5936 /* For now, we just don't mark the undo_list. It's done later in
5937 a special way just before the sweep phase, and after stripping
5938 some of its elements that are not needed any more. */
cf5c0175 5939
b4fa72f2
DA
5940 mark_overlay (buffer->overlays_before);
5941 mark_overlay (buffer->overlays_after);
cf5c0175 5942
b4fa72f2
DA
5943 /* If this is an indirect buffer, mark its base buffer. */
5944 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
5945 mark_buffer (buffer->base_buffer);
cf5c0175
DA
5946}
5947
fc54bdd5
DA
5948/* Mark Lisp faces in the face cache C. */
5949
5950static void
5951mark_face_cache (struct face_cache *c)
5952{
5953 if (c)
5954 {
5955 int i, j;
5956 for (i = 0; i < c->used; ++i)
5957 {
5958 struct face *face = FACE_FROM_ID (c->f, i);
5959
5960 if (face)
5961 {
5962 if (face->font && !VECTOR_MARKED_P (face->font))
5963 mark_vectorlike ((struct Lisp_Vector *) face->font);
5964
5965 for (j = 0; j < LFACE_VECTOR_SIZE; ++j)
5966 mark_object (face->lface[j]);
5967 }
5968 }
5969 }
5970}
5971
d59a1afb 5972/* Remove killed buffers or items whose car is a killed buffer from
e99f70c8 5973 LIST, and mark other items. Return changed LIST, which is marked. */
d73e321c 5974
5779a1dc 5975static Lisp_Object
d59a1afb 5976mark_discard_killed_buffers (Lisp_Object list)
d73e321c 5977{
d59a1afb 5978 Lisp_Object tail, *prev = &list;
d73e321c 5979
d59a1afb
DA
5980 for (tail = list; CONSP (tail) && !CONS_MARKED_P (XCONS (tail));
5981 tail = XCDR (tail))
d73e321c 5982 {
5779a1dc 5983 Lisp_Object tem = XCAR (tail);
d73e321c
DA
5984 if (CONSP (tem))
5985 tem = XCAR (tem);
5986 if (BUFFERP (tem) && !BUFFER_LIVE_P (XBUFFER (tem)))
5779a1dc 5987 *prev = XCDR (tail);
d73e321c 5988 else
d59a1afb
DA
5989 {
5990 CONS_MARK (XCONS (tail));
5991 mark_object (XCAR (tail));
84575e67 5992 prev = xcdr_addr (tail);
d59a1afb 5993 }
d73e321c 5994 }
e99f70c8 5995 mark_object (tail);
d73e321c
DA
5996 return list;
5997}
5998
cf5c0175
DA
5999/* Determine type of generic Lisp_Object and mark it accordingly. */
6000
41c28a37 6001void
971de7fb 6002mark_object (Lisp_Object arg)
7146af97 6003{
49723c04 6004 register Lisp_Object obj = arg;
4f5c1376
GM
6005#ifdef GC_CHECK_MARKED_OBJECTS
6006 void *po;
6007 struct mem_node *m;
6008#endif
903fe15d 6009 ptrdiff_t cdr_count = 0;
7146af97 6010
9149e743 6011 loop:
7146af97 6012
1f0b3fd2 6013 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
6014 return;
6015
49723c04 6016 last_marked[last_marked_index++] = obj;
785cd37f
RS
6017 if (last_marked_index == LAST_MARKED_SIZE)
6018 last_marked_index = 0;
6019
4f5c1376
GM
6020 /* Perform some sanity checks on the objects marked here. Abort if
6021 we encounter an object we know is bogus. This increases GC time
6022 by ~80%, and requires compilation with GC_MARK_STACK != 0. */
6023#ifdef GC_CHECK_MARKED_OBJECTS
6024
6025 po = (void *) XPNTR (obj);
6026
6027 /* Check that the object pointed to by PO is known to be a Lisp
6028 structure allocated from the heap. */
6029#define CHECK_ALLOCATED() \
6030 do { \
6031 m = mem_find (po); \
6032 if (m == MEM_NIL) \
1088b922 6033 emacs_abort (); \
4f5c1376
GM
6034 } while (0)
6035
6036 /* Check that the object pointed to by PO is live, using predicate
6037 function LIVEP. */
6038#define CHECK_LIVE(LIVEP) \
6039 do { \
6040 if (!LIVEP (m, po)) \
1088b922 6041 emacs_abort (); \
4f5c1376
GM
6042 } while (0)
6043
6044 /* Check both of the above conditions. */
6045#define CHECK_ALLOCATED_AND_LIVE(LIVEP) \
6046 do { \
6047 CHECK_ALLOCATED (); \
6048 CHECK_LIVE (LIVEP); \
6049 } while (0) \
177c0ea7 6050
4f5c1376 6051#else /* not GC_CHECK_MARKED_OBJECTS */
177c0ea7 6052
4f5c1376
GM
6053#define CHECK_LIVE(LIVEP) (void) 0
6054#define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
177c0ea7 6055
4f5c1376
GM
6056#endif /* not GC_CHECK_MARKED_OBJECTS */
6057
7393bcbb 6058 switch (XTYPE (obj))
7146af97
JB
6059 {
6060 case Lisp_String:
6061 {
6062 register struct Lisp_String *ptr = XSTRING (obj);
8f11f7ec
SM
6063 if (STRING_MARKED_P (ptr))
6064 break;
4f5c1376 6065 CHECK_ALLOCATED_AND_LIVE (live_string_p);
2e471eb5 6066 MARK_STRING (ptr);
7555c33f 6067 MARK_INTERVAL_TREE (ptr->intervals);
361b097f 6068#ifdef GC_CHECK_STRING_BYTES
676a7251 6069 /* Check that the string size recorded in the string is the
7555c33f 6070 same as the one recorded in the sdata structure. */
e499d0ee 6071 string_bytes (ptr);
361b097f 6072#endif /* GC_CHECK_STRING_BYTES */
7146af97
JB
6073 }
6074 break;
6075
76437631 6076 case Lisp_Vectorlike:
cf5c0175
DA
6077 {
6078 register struct Lisp_Vector *ptr = XVECTOR (obj);
6079 register ptrdiff_t pvectype;
6080
6081 if (VECTOR_MARKED_P (ptr))
6082 break;
6083
4f5c1376 6084#ifdef GC_CHECK_MARKED_OBJECTS
cf5c0175 6085 m = mem_find (po);
c752cfa9 6086 if (m == MEM_NIL && !SUBRP (obj))
1088b922 6087 emacs_abort ();
4f5c1376 6088#endif /* GC_CHECK_MARKED_OBJECTS */
177c0ea7 6089
cf5c0175 6090 if (ptr->header.size & PSEUDOVECTOR_FLAG)
ee28be33 6091 pvectype = ((ptr->header.size & PVEC_TYPE_MASK)
914adc42 6092 >> PSEUDOVECTOR_AREA_BITS);
cf5c0175 6093 else
6aea7528 6094 pvectype = PVEC_NORMAL_VECTOR;
cf5c0175 6095
cf5c0175
DA
6096 if (pvectype != PVEC_SUBR && pvectype != PVEC_BUFFER)
6097 CHECK_LIVE (live_vector_p);
169ee243 6098
ee28be33 6099 switch (pvectype)
cf5c0175 6100 {
ee28be33 6101 case PVEC_BUFFER:
cf5c0175 6102#ifdef GC_CHECK_MARKED_OBJECTS
c752cfa9
DA
6103 {
6104 struct buffer *b;
6105 FOR_EACH_BUFFER (b)
6106 if (b == po)
6107 break;
6108 if (b == NULL)
6109 emacs_abort ();
6110 }
cf5c0175
DA
6111#endif /* GC_CHECK_MARKED_OBJECTS */
6112 mark_buffer ((struct buffer *) ptr);
ee28be33
SM
6113 break;
6114
6115 case PVEC_COMPILED:
6116 { /* We could treat this just like a vector, but it is better
6117 to save the COMPILED_CONSTANTS element for last and avoid
6118 recursion there. */
6119 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
6120 int i;
6121
6122 VECTOR_MARK (ptr);
6123 for (i = 0; i < size; i++)
6124 if (i != COMPILED_CONSTANTS)
91f2d272 6125 mark_object (ptr->contents[i]);
ee28be33
SM
6126 if (size > COMPILED_CONSTANTS)
6127 {
91f2d272 6128 obj = ptr->contents[COMPILED_CONSTANTS];
ee28be33
SM
6129 goto loop;
6130 }
6131 }
6132 break;
cf5c0175 6133
ee28be33 6134 case PVEC_FRAME:
df24a230
DA
6135 {
6136 struct frame *f = (struct frame *) ptr;
6137
6138 mark_vectorlike (ptr);
6139 mark_face_cache (f->face_cache);
6140#ifdef HAVE_WINDOW_SYSTEM
6141 if (FRAME_WINDOW_P (f) && FRAME_X_OUTPUT (f))
6142 {
6143 struct font *font = FRAME_FONT (f);
6144
6145 if (font && !VECTOR_MARKED_P (font))
6146 mark_vectorlike ((struct Lisp_Vector *) font);
6147 }
6148#endif
6149 }
ee28be33 6150 break;
cf5c0175 6151
ee28be33
SM
6152 case PVEC_WINDOW:
6153 {
6154 struct window *w = (struct window *) ptr;
5779a1dc 6155
0699fc18 6156 mark_vectorlike (ptr);
e99f70c8 6157
e74aeda8 6158 /* Mark glyph matrices, if any. Marking window
0699fc18
DA
6159 matrices is sufficient because frame matrices
6160 use the same glyph memory. */
e74aeda8 6161 if (w->current_matrix)
ee28be33 6162 {
0699fc18
DA
6163 mark_glyph_matrix (w->current_matrix);
6164 mark_glyph_matrix (w->desired_matrix);
ee28be33 6165 }
e99f70c8
SM
6166
6167 /* Filter out killed buffers from both buffer lists
6168 in attempt to help GC to reclaim killed buffers faster.
6169 We can do it elsewhere for live windows, but this is the
6170 best place to do it for dead windows. */
6171 wset_prev_buffers
6172 (w, mark_discard_killed_buffers (w->prev_buffers));
6173 wset_next_buffers
6174 (w, mark_discard_killed_buffers (w->next_buffers));
ee28be33
SM
6175 }
6176 break;
cf5c0175 6177
ee28be33
SM
6178 case PVEC_HASH_TABLE:
6179 {
6180 struct Lisp_Hash_Table *h = (struct Lisp_Hash_Table *) ptr;
cf5c0175 6181
ee28be33 6182 mark_vectorlike (ptr);
b7432bb2
SM
6183 mark_object (h->test.name);
6184 mark_object (h->test.user_hash_function);
6185 mark_object (h->test.user_cmp_function);
ee28be33
SM
6186 /* If hash table is not weak, mark all keys and values.
6187 For weak tables, mark only the vector. */
6188 if (NILP (h->weak))
6189 mark_object (h->key_and_value);
6190 else
6191 VECTOR_MARK (XVECTOR (h->key_and_value));
6192 }
6193 break;
cf5c0175 6194
ee28be33
SM
6195 case PVEC_CHAR_TABLE:
6196 mark_char_table (ptr);
6197 break;
cf5c0175 6198
ee28be33
SM
6199 case PVEC_BOOL_VECTOR:
6200 /* No Lisp_Objects to mark in a bool vector. */
6201 VECTOR_MARK (ptr);
6202 break;
cf5c0175 6203
ee28be33
SM
6204 case PVEC_SUBR:
6205 break;
cf5c0175 6206
ee28be33 6207 case PVEC_FREE:
1088b922 6208 emacs_abort ();
cf5c0175 6209
ee28be33
SM
6210 default:
6211 mark_vectorlike (ptr);
6212 }
cf5c0175 6213 }
169ee243 6214 break;
7146af97 6215
7146af97
JB
6216 case Lisp_Symbol:
6217 {
c70bbf06 6218 register struct Lisp_Symbol *ptr = XSYMBOL (obj);
7146af97
JB
6219 struct Lisp_Symbol *ptrx;
6220
8f11f7ec
SM
6221 if (ptr->gcmarkbit)
6222 break;
4f5c1376 6223 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
2336fe58 6224 ptr->gcmarkbit = 1;
e3f04a4a
DC
6225 /* Attempt to catch bogus objects. */
6226 eassert (valid_lisp_object_p (ptr->function) >= 1);
c644523b
DA
6227 mark_object (ptr->function);
6228 mark_object (ptr->plist);
ce5b453a
SM
6229 switch (ptr->redirect)
6230 {
6231 case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
6232 case SYMBOL_VARALIAS:
6233 {
6234 Lisp_Object tem;
6235 XSETSYMBOL (tem, SYMBOL_ALIAS (ptr));
6236 mark_object (tem);
6237 break;
6238 }
6239 case SYMBOL_LOCALIZED:
6240 {
6241 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
d73e321c
DA
6242 Lisp_Object where = blv->where;
6243 /* If the value is set up for a killed buffer or deleted
6244 frame, restore it's global binding. If the value is
6245 forwarded to a C variable, either it's not a Lisp_Object
6246 var, or it's staticpro'd already. */
6247 if ((BUFFERP (where) && !BUFFER_LIVE_P (XBUFFER (where)))
6248 || (FRAMEP (where) && !FRAME_LIVE_P (XFRAME (where))))
6249 swap_in_global_binding (ptr);
ce5b453a
SM
6250 mark_object (blv->where);
6251 mark_object (blv->valcell);
6252 mark_object (blv->defcell);
6253 break;
6254 }
6255 case SYMBOL_FORWARDED:
6256 /* If the value is forwarded to a buffer or keyboard field,
6257 these are marked when we see the corresponding object.
6258 And if it's forwarded to a C variable, either it's not
6259 a Lisp_Object var, or it's staticpro'd already. */
6260 break;
1088b922 6261 default: emacs_abort ();
ce5b453a 6262 }
c644523b
DA
6263 if (!PURE_POINTER_P (XSTRING (ptr->name)))
6264 MARK_STRING (XSTRING (ptr->name));
0c94c8d6 6265 MARK_INTERVAL_TREE (string_intervals (ptr->name));
177c0ea7 6266
7146af97
JB
6267 ptr = ptr->next;
6268 if (ptr)
6269 {
7555c33f 6270 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun. */
7146af97 6271 XSETSYMBOL (obj, ptrx);
49723c04 6272 goto loop;
7146af97
JB
6273 }
6274 }
6275 break;
6276
a0a38eb7 6277 case Lisp_Misc:
4f5c1376 6278 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
b766f870 6279
7555c33f
SM
6280 if (XMISCANY (obj)->gcmarkbit)
6281 break;
6282
6283 switch (XMISCTYPE (obj))
a0a38eb7 6284 {
7555c33f
SM
6285 case Lisp_Misc_Marker:
6286 /* DO NOT mark thru the marker's chain.
6287 The buffer's markers chain does not preserve markers from gc;
6288 instead, markers are removed from the chain when freed by gc. */
36429c89 6289 XMISCANY (obj)->gcmarkbit = 1;
7555c33f 6290 break;
465edf35 6291
7555c33f
SM
6292 case Lisp_Misc_Save_Value:
6293 XMISCANY (obj)->gcmarkbit = 1;
7555c33f 6294 {
7b1123d8
PE
6295 struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj);
6296 /* If `save_type' is zero, `data[0].pointer' is the address
73ebd38f
DA
6297 of a memory area containing `data[1].integer' potential
6298 Lisp_Objects. */
7b1123d8 6299 if (GC_MARK_STACK && ptr->save_type == SAVE_TYPE_MEMORY)
7555c33f 6300 {
c50cf2ea 6301 Lisp_Object *p = ptr->data[0].pointer;
7555c33f 6302 ptrdiff_t nelt;
73ebd38f 6303 for (nelt = ptr->data[1].integer; nelt > 0; nelt--, p++)
7555c33f
SM
6304 mark_maybe_object (*p);
6305 }
73ebd38f 6306 else
73ebd38f
DA
6307 {
6308 /* Find Lisp_Objects in `data[N]' slots and mark them. */
7b1123d8
PE
6309 int i;
6310 for (i = 0; i < SAVE_VALUE_SLOTS; i++)
6311 if (save_type (ptr, i) == SAVE_OBJECT)
6312 mark_object (ptr->data[i].object);
73ebd38f 6313 }
7555c33f 6314 }
7555c33f
SM
6315 break;
6316
6317 case Lisp_Misc_Overlay:
6318 mark_overlay (XOVERLAY (obj));
6319 break;
6320
6321 default:
1088b922 6322 emacs_abort ();
a0a38eb7 6323 }
7146af97
JB
6324 break;
6325
6326 case Lisp_Cons:
7146af97
JB
6327 {
6328 register struct Lisp_Cons *ptr = XCONS (obj);
8f11f7ec
SM
6329 if (CONS_MARKED_P (ptr))
6330 break;
4f5c1376 6331 CHECK_ALLOCATED_AND_LIVE (live_cons_p);
08b7c2cb 6332 CONS_MARK (ptr);
c54ca951 6333 /* If the cdr is nil, avoid recursion for the car. */
c644523b 6334 if (EQ (ptr->u.cdr, Qnil))
c54ca951 6335 {
c644523b 6336 obj = ptr->car;
1342fc6f 6337 cdr_count = 0;
c54ca951
RS
6338 goto loop;
6339 }
c644523b
DA
6340 mark_object (ptr->car);
6341 obj = ptr->u.cdr;
1342fc6f
RS
6342 cdr_count++;
6343 if (cdr_count == mark_object_loop_halt)
1088b922 6344 emacs_abort ();
7146af97
JB
6345 goto loop;
6346 }
6347
7146af97 6348 case Lisp_Float:
4f5c1376 6349 CHECK_ALLOCATED_AND_LIVE (live_float_p);
ab6780cd 6350 FLOAT_MARK (XFLOAT (obj));
7146af97 6351 break;
7146af97 6352
2de9f71c 6353 case_Lisp_Int:
7146af97
JB
6354 break;
6355
6356 default:
1088b922 6357 emacs_abort ();
7146af97 6358 }
4f5c1376
GM
6359
6360#undef CHECK_LIVE
6361#undef CHECK_ALLOCATED
6362#undef CHECK_ALLOCATED_AND_LIVE
7146af97 6363}
4a729fd8 6364/* Mark the Lisp pointers in the terminal objects.
0ba2624f 6365 Called by Fgarbage_collect. */
4a729fd8 6366
4a729fd8
SM
6367static void
6368mark_terminals (void)
6369{
6370 struct terminal *t;
6371 for (t = terminal_list; t; t = t->next_terminal)
6372 {
6373 eassert (t->name != NULL);
354884c4 6374#ifdef HAVE_WINDOW_SYSTEM
96ad0af7
YM
6375 /* If a terminal object is reachable from a stacpro'ed object,
6376 it might have been marked already. Make sure the image cache
6377 gets marked. */
6378 mark_image_cache (t->image_cache);
354884c4 6379#endif /* HAVE_WINDOW_SYSTEM */
96ad0af7
YM
6380 if (!VECTOR_MARKED_P (t))
6381 mark_vectorlike ((struct Lisp_Vector *)t);
4a729fd8
SM
6382 }
6383}
6384
6385
084b1a0c 6386
41c28a37
GM
6387/* Value is non-zero if OBJ will survive the current GC because it's
6388 either marked or does not need to be marked to survive. */
6389
fce31d69 6390bool
971de7fb 6391survives_gc_p (Lisp_Object obj)
41c28a37 6392{
fce31d69 6393 bool survives_p;
177c0ea7 6394
8e50cc2d 6395 switch (XTYPE (obj))
41c28a37 6396 {
2de9f71c 6397 case_Lisp_Int:
41c28a37
GM
6398 survives_p = 1;
6399 break;
6400
6401 case Lisp_Symbol:
2336fe58 6402 survives_p = XSYMBOL (obj)->gcmarkbit;
41c28a37
GM
6403 break;
6404
6405 case Lisp_Misc:
67ee9f6e 6406 survives_p = XMISCANY (obj)->gcmarkbit;
41c28a37
GM
6407 break;
6408
6409 case Lisp_String:
08b7c2cb 6410 survives_p = STRING_MARKED_P (XSTRING (obj));
41c28a37
GM
6411 break;
6412
6413 case Lisp_Vectorlike:
8e50cc2d 6414 survives_p = SUBRP (obj) || VECTOR_MARKED_P (XVECTOR (obj));
41c28a37
GM
6415 break;
6416
6417 case Lisp_Cons:
08b7c2cb 6418 survives_p = CONS_MARKED_P (XCONS (obj));
41c28a37
GM
6419 break;
6420
41c28a37 6421 case Lisp_Float:
ab6780cd 6422 survives_p = FLOAT_MARKED_P (XFLOAT (obj));
41c28a37 6423 break;
41c28a37
GM
6424
6425 default:
1088b922 6426 emacs_abort ();
41c28a37
GM
6427 }
6428
34400008 6429 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj));
41c28a37
GM
6430}
6431
6432
7146af97 6433\f
7146af97 6434
b029599f 6435NO_INLINE /* For better stack traces */
7146af97 6436static void
b029599f 6437sweep_conses (void)
7146af97 6438{
9c23779a 6439 struct cons_block *cblk;
b029599f 6440 struct cons_block **cprev = &cons_block;
9c23779a 6441 int lim = cons_block_index;
b029599f 6442 EMACS_INT num_free = 0, num_used = 0;
7146af97 6443
b029599f 6444 cons_free_list = 0;
177c0ea7 6445
b029599f
DC
6446 for (cblk = cons_block; cblk; cblk = *cprev)
6447 {
9c23779a 6448 int i = 0;
b029599f 6449 int this_free = 0;
9c23779a 6450 int ilim = (lim + BITS_PER_BITS_WORD - 1) / BITS_PER_BITS_WORD;
3ae2e3a3 6451
b029599f
DC
6452 /* Scan the mark bits an int at a time. */
6453 for (i = 0; i < ilim; i++)
6454 {
9c23779a 6455 if (cblk->gcmarkbits[i] == BITS_WORD_MAX)
b029599f
DC
6456 {
6457 /* Fast path - all cons cells for this int are marked. */
6458 cblk->gcmarkbits[i] = 0;
9c23779a 6459 num_used += BITS_PER_BITS_WORD;
b029599f
DC
6460 }
6461 else
6462 {
6463 /* Some cons cells for this int are not marked.
6464 Find which ones, and free them. */
6465 int start, pos, stop;
6466
9c23779a 6467 start = i * BITS_PER_BITS_WORD;
b029599f 6468 stop = lim - start;
9c23779a
PE
6469 if (stop > BITS_PER_BITS_WORD)
6470 stop = BITS_PER_BITS_WORD;
b029599f
DC
6471 stop += start;
6472
6473 for (pos = start; pos < stop; pos++)
6474 {
6475 if (!CONS_MARKED_P (&cblk->conses[pos]))
6476 {
6477 this_free++;
6478 cblk->conses[pos].u.chain = cons_free_list;
6479 cons_free_list = &cblk->conses[pos];
34400008 6480#if GC_MARK_STACK
b029599f 6481 cons_free_list->car = Vdead;
34400008 6482#endif
b029599f
DC
6483 }
6484 else
6485 {
6486 num_used++;
6487 CONS_UNMARK (&cblk->conses[pos]);
6488 }
6489 }
6490 }
6491 }
7146af97 6492
b029599f
DC
6493 lim = CONS_BLOCK_SIZE;
6494 /* If this block contains only free conses and we have already
6495 seen more than two blocks worth of free conses then deallocate
6496 this block. */
6497 if (this_free == CONS_BLOCK_SIZE && num_free > CONS_BLOCK_SIZE)
6498 {
6499 *cprev = cblk->next;
6500 /* Unhook from the free list. */
6501 cons_free_list = cblk->conses[0].u.chain;
6502 lisp_align_free (cblk);
6503 }
6504 else
6505 {
6506 num_free += this_free;
6507 cprev = &cblk->next;
6508 }
6509 }
6510 total_conses = num_used;
6511 total_free_conses = num_free;
6512}
7146af97 6513
b029599f
DC
6514NO_INLINE /* For better stack traces */
6515static void
6516sweep_floats (void)
6517{
6518 register struct float_block *fblk;
6519 struct float_block **fprev = &float_block;
6520 register int lim = float_block_index;
6521 EMACS_INT num_free = 0, num_used = 0;
177c0ea7 6522
b029599f 6523 float_free_list = 0;
7146af97 6524
b029599f
DC
6525 for (fblk = float_block; fblk; fblk = *fprev)
6526 {
6527 register int i;
6528 int this_free = 0;
6529 for (i = 0; i < lim; i++)
6530 if (!FLOAT_MARKED_P (&fblk->floats[i]))
6531 {
6532 this_free++;
6533 fblk->floats[i].u.chain = float_free_list;
6534 float_free_list = &fblk->floats[i];
6535 }
6536 else
6537 {
6538 num_used++;
6539 FLOAT_UNMARK (&fblk->floats[i]);
6540 }
6541 lim = FLOAT_BLOCK_SIZE;
6542 /* If this block contains only free floats and we have already
6543 seen more than two blocks worth of free floats then deallocate
6544 this block. */
6545 if (this_free == FLOAT_BLOCK_SIZE && num_free > FLOAT_BLOCK_SIZE)
6546 {
6547 *fprev = fblk->next;
6548 /* Unhook from the free list. */
6549 float_free_list = fblk->floats[0].u.chain;
6550 lisp_align_free (fblk);
6551 }
6552 else
6553 {
6554 num_free += this_free;
6555 fprev = &fblk->next;
6556 }
6557 }
6558 total_floats = num_used;
6559 total_free_floats = num_free;
6560}
d5e35230 6561
b029599f
DC
6562NO_INLINE /* For better stack traces */
6563static void
6564sweep_intervals (void)
6565{
6566 register struct interval_block *iblk;
6567 struct interval_block **iprev = &interval_block;
6568 register int lim = interval_block_index;
6569 EMACS_INT num_free = 0, num_used = 0;
d5e35230 6570
b029599f 6571 interval_free_list = 0;
d5e35230 6572
b029599f
DC
6573 for (iblk = interval_block; iblk; iblk = *iprev)
6574 {
6575 register int i;
6576 int this_free = 0;
d5e35230 6577
b029599f
DC
6578 for (i = 0; i < lim; i++)
6579 {
6580 if (!iblk->intervals[i].gcmarkbit)
6581 {
6582 set_interval_parent (&iblk->intervals[i], interval_free_list);
6583 interval_free_list = &iblk->intervals[i];
6584 this_free++;
6585 }
6586 else
6587 {
6588 num_used++;
6589 iblk->intervals[i].gcmarkbit = 0;
6590 }
6591 }
6592 lim = INTERVAL_BLOCK_SIZE;
6593 /* If this block contains only free intervals and we have already
6594 seen more than two blocks worth of free intervals then
6595 deallocate this block. */
6596 if (this_free == INTERVAL_BLOCK_SIZE && num_free > INTERVAL_BLOCK_SIZE)
6597 {
6598 *iprev = iblk->next;
6599 /* Unhook from the free list. */
6600 interval_free_list = INTERVAL_PARENT (&iblk->intervals[0]);
6601 lisp_free (iblk);
6602 }
6603 else
6604 {
6605 num_free += this_free;
6606 iprev = &iblk->next;
6607 }
6608 }
6609 total_intervals = num_used;
6610 total_free_intervals = num_free;
6611}
7146af97 6612
b029599f
DC
6613NO_INLINE /* For better stack traces */
6614static void
6615sweep_symbols (void)
6616{
6617 register struct symbol_block *sblk;
6618 struct symbol_block **sprev = &symbol_block;
6619 register int lim = symbol_block_index;
6620 EMACS_INT num_free = 0, num_used = 0;
177c0ea7 6621
b029599f 6622 symbol_free_list = NULL;
d285b373 6623
b029599f
DC
6624 for (sblk = symbol_block; sblk; sblk = *sprev)
6625 {
6626 int this_free = 0;
6627 union aligned_Lisp_Symbol *sym = sblk->symbols;
6628 union aligned_Lisp_Symbol *end = sym + lim;
177c0ea7 6629
b029599f
DC
6630 for (; sym < end; ++sym)
6631 {
7e31acf6 6632 if (!sym->s.gcmarkbit)
b029599f
DC
6633 {
6634 if (sym->s.redirect == SYMBOL_LOCALIZED)
6635 xfree (SYMBOL_BLV (&sym->s));
6636 sym->s.next = symbol_free_list;
6637 symbol_free_list = &sym->s;
34400008 6638#if GC_MARK_STACK
b029599f 6639 symbol_free_list->function = Vdead;
34400008 6640#endif
b029599f
DC
6641 ++this_free;
6642 }
6643 else
6644 {
6645 ++num_used;
b029599f 6646 sym->s.gcmarkbit = 0;
e3f04a4a
DC
6647 /* Attempt to catch bogus objects. */
6648 eassert (valid_lisp_object_p (sym->s.function) >= 1);
b029599f
DC
6649 }
6650 }
177c0ea7 6651
b029599f
DC
6652 lim = SYMBOL_BLOCK_SIZE;
6653 /* If this block contains only free symbols and we have already
6654 seen more than two blocks worth of free symbols then deallocate
6655 this block. */
6656 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)
6657 {
6658 *sprev = sblk->next;
6659 /* Unhook from the free list. */
6660 symbol_free_list = sblk->symbols[0].s.next;
6661 lisp_free (sblk);
6662 }
6663 else
6664 {
6665 num_free += this_free;
6666 sprev = &sblk->next;
6667 }
6668 }
6669 total_symbols = num_used;
6670 total_free_symbols = num_free;
6671}
7146af97 6672
b029599f
DC
6673NO_INLINE /* For better stack traces */
6674static void
6675sweep_misc (void)
6676{
6677 register struct marker_block *mblk;
6678 struct marker_block **mprev = &marker_block;
6679 register int lim = marker_block_index;
6680 EMACS_INT num_free = 0, num_used = 0;
7146af97 6681
b029599f
DC
6682 /* Put all unmarked misc's on free list. For a marker, first
6683 unchain it from the buffer it points into. */
177c0ea7 6684
b029599f 6685 marker_free_list = 0;
fa05e253 6686
b029599f
DC
6687 for (mblk = marker_block; mblk; mblk = *mprev)
6688 {
6689 register int i;
6690 int this_free = 0;
7146af97 6691
b029599f
DC
6692 for (i = 0; i < lim; i++)
6693 {
6694 if (!mblk->markers[i].m.u_any.gcmarkbit)
6695 {
6696 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker)
6697 unchain_marker (&mblk->markers[i].m.u_marker);
6698 /* Set the type of the freed object to Lisp_Misc_Free.
6699 We could leave the type alone, since nobody checks it,
6700 but this might catch bugs faster. */
6701 mblk->markers[i].m.u_marker.type = Lisp_Misc_Free;
6702 mblk->markers[i].m.u_free.chain = marker_free_list;
6703 marker_free_list = &mblk->markers[i].m;
6704 this_free++;
6705 }
6706 else
6707 {
6708 num_used++;
6709 mblk->markers[i].m.u_any.gcmarkbit = 0;
6710 }
6711 }
6712 lim = MARKER_BLOCK_SIZE;
6713 /* If this block contains only free markers and we have already
6714 seen more than two blocks worth of free markers then deallocate
6715 this block. */
6716 if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE)
6717 {
6718 *mprev = mblk->next;
6719 /* Unhook from the free list. */
6720 marker_free_list = mblk->markers[0].m.u_free.chain;
6721 lisp_free (mblk);
6722 }
6723 else
6724 {
6725 num_free += this_free;
6726 mprev = &mblk->next;
6727 }
6728 }
7146af97 6729
b029599f
DC
6730 total_markers = num_used;
6731 total_free_markers = num_free;
6732}
7146af97 6733
b029599f
DC
6734NO_INLINE /* For better stack traces */
6735static void
6736sweep_buffers (void)
6737{
6738 register struct buffer *buffer, **bprev = &all_buffers;
7146af97 6739
b029599f
DC
6740 total_buffers = 0;
6741 for (buffer = all_buffers; buffer; buffer = *bprev)
6742 if (!VECTOR_MARKED_P (buffer))
6743 {
6744 *bprev = buffer->next;
6745 lisp_free (buffer);
6746 }
6747 else
6748 {
6749 VECTOR_UNMARK (buffer);
6750 /* Do not use buffer_(set|get)_intervals here. */
6751 buffer->text->intervals = balance_intervals (buffer->text->intervals);
6752 total_buffers++;
6753 bprev = &buffer->next;
6754 }
7146af97 6755}
7146af97 6756
b029599f
DC
6757/* Sweep: find all structures not marked, and free them. */
6758static void
6759gc_sweep (void)
6760{
6761 /* Remove or mark entries in weak hash tables.
6762 This must be done before any object is unmarked. */
6763 sweep_weak_hash_tables ();
7146af97 6764
b029599f
DC
6765 sweep_strings ();
6766 check_string_bytes (!noninteractive);
6767 sweep_conses ();
6768 sweep_floats ();
6769 sweep_intervals ();
6770 sweep_symbols ();
6771 sweep_misc ();
6772 sweep_buffers ();
6773 sweep_vectors ();
6774 check_string_bytes (!noninteractive);
6775}
7146af97 6776
7146af97 6777\f
20d24714
JB
6778/* Debugging aids. */
6779
31ce1c91 6780DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
a6266d23 6781 doc: /* Return the address of the last byte Emacs has allocated, divided by 1024.
228299fa 6782This may be helpful in debugging Emacs's memory usage.
7ee72033 6783We divide the value by 1024 to make sure it fits in a Lisp integer. */)
5842a27b 6784 (void)
20d24714
JB
6785{
6786 Lisp_Object end;
6787
5e48429a
JD
6788#ifdef HAVE_NS
6789 /* Avoid warning. sbrk has no relation to memory allocated anyway. */
6790 XSETINT (end, 0);
6791#else
d01a7826 6792 XSETINT (end, (intptr_t) (char *) sbrk (0) / 1024);
5e48429a 6793#endif
20d24714
JB
6794
6795 return end;
6796}
6797
310ea200 6798DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
a6266d23 6799 doc: /* Return a list of counters that measure how much consing there has been.
228299fa
GM
6800Each of these counters increments for a certain kind of object.
6801The counters wrap around from the largest positive integer to zero.
6802Garbage collection does not decrease them.
6803The elements of the value are as follows:
6804 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS STRINGS)
6805All are in units of 1 = one object consed
6806except for VECTOR-CELLS and STRING-CHARS, which count the total length of
6807objects consed.
6808MISCS include overlays, markers, and some internal types.
6809Frames, windows, buffers, and subprocesses count as vectors
7ee72033 6810 (but the contents of a buffer's text do not count here). */)
5842a27b 6811 (void)
310ea200 6812{
3438fe21 6813 return listn (CONSTYPE_HEAP, 8,
694b6c97
DA
6814 bounded_number (cons_cells_consed),
6815 bounded_number (floats_consed),
6816 bounded_number (vector_cells_consed),
6817 bounded_number (symbols_consed),
6818 bounded_number (string_chars_consed),
6819 bounded_number (misc_objects_consed),
6820 bounded_number (intervals_consed),
6821 bounded_number (strings_consed));
310ea200 6822}
e0b8c689 6823
8b058d44
EZ
6824/* Find at most FIND_MAX symbols which have OBJ as their value or
6825 function. This is used in gdbinit's `xwhichsymbols' command. */
6826
6827Lisp_Object
196e41e4 6828which_symbols (Lisp_Object obj, EMACS_INT find_max)
8b058d44
EZ
6829{
6830 struct symbol_block *sblk;
8d0eb4c2 6831 ptrdiff_t gc_count = inhibit_garbage_collection ();
8b058d44
EZ
6832 Lisp_Object found = Qnil;
6833
ca78dc43 6834 if (! DEADP (obj))
8b058d44
EZ
6835 {
6836 for (sblk = symbol_block; sblk; sblk = sblk->next)
6837 {
9426aba4 6838 union aligned_Lisp_Symbol *aligned_sym = sblk->symbols;
8b058d44
EZ
6839 int bn;
6840
9426aba4 6841 for (bn = 0; bn < SYMBOL_BLOCK_SIZE; bn++, aligned_sym++)
8b058d44 6842 {
9426aba4 6843 struct Lisp_Symbol *sym = &aligned_sym->s;
8b058d44
EZ
6844 Lisp_Object val;
6845 Lisp_Object tem;
6846
6847 if (sblk == symbol_block && bn >= symbol_block_index)
6848 break;
6849
6850 XSETSYMBOL (tem, sym);
6851 val = find_symbol_value (tem);
6852 if (EQ (val, obj)
c644523b
DA
6853 || EQ (sym->function, obj)
6854 || (!NILP (sym->function)
6855 && COMPILEDP (sym->function)
6856 && EQ (AREF (sym->function, COMPILED_BYTECODE), obj))
8b058d44
EZ
6857 || (!NILP (val)
6858 && COMPILEDP (val)
6859 && EQ (AREF (val, COMPILED_BYTECODE), obj)))
6860 {
6861 found = Fcons (tem, found);
6862 if (--find_max == 0)
6863 goto out;
6864 }
6865 }
6866 }
6867 }
6868
6869 out:
6870 unbind_to (gc_count, Qnil);
6871 return found;
6872}
6873
01ae0fbf
DC
6874#ifdef SUSPICIOUS_OBJECT_CHECKING
6875
608a4502 6876static void *
faa52174 6877find_suspicious_object_in_range (void *begin, void *end)
01ae0fbf 6878{
faa52174
PE
6879 char *begin_a = begin;
6880 char *end_a = end;
01ae0fbf
DC
6881 int i;
6882
faa52174
PE
6883 for (i = 0; i < ARRAYELTS (suspicious_objects); ++i)
6884 {
6885 char *suspicious_object = suspicious_objects[i];
6886 if (begin_a <= suspicious_object && suspicious_object < end_a)
6887 return suspicious_object;
6888 }
01ae0fbf
DC
6889
6890 return NULL;
6891}
6892
6893static void
1b85074c 6894note_suspicious_free (void* ptr)
01ae0fbf 6895{
01ae0fbf
DC
6896 struct suspicious_free_record* rec;
6897
1b85074c
DC
6898 rec = &suspicious_free_history[suspicious_free_history_index++];
6899 if (suspicious_free_history_index ==
1e1a3a32 6900 ARRAYELTS (suspicious_free_history))
1b85074c
DC
6901 {
6902 suspicious_free_history_index = 0;
6903 }
6904
6905 memset (rec, 0, sizeof (*rec));
6906 rec->suspicious_object = ptr;
1e1a3a32 6907 backtrace (&rec->backtrace[0], ARRAYELTS (rec->backtrace));
1b85074c
DC
6908}
6909
6910static void
6911detect_suspicious_free (void* ptr)
01ae0fbf
DC
6912{
6913 int i;
01ae0fbf
DC
6914
6915 eassert (ptr != NULL);
6916
c72d972c 6917 for (i = 0; i < ARRAYELTS (suspicious_objects); ++i)
01ae0fbf
DC
6918 if (suspicious_objects[i] == ptr)
6919 {
1b85074c 6920 note_suspicious_free (ptr);
01ae0fbf
DC
6921 suspicious_objects[i] = NULL;
6922 }
6923}
6924
6925#endif /* SUSPICIOUS_OBJECT_CHECKING */
6926
6927DEFUN ("suspicious-object", Fsuspicious_object, Ssuspicious_object, 1, 1, 0,
6928 doc: /* Return OBJ, maybe marking it for extra scrutiny.
6929If Emacs is compiled with suspicous object checking, capture
6930a stack trace when OBJ is freed in order to help track down
6931garbage collection bugs. Otherwise, do nothing and return OBJ. */)
6932 (Lisp_Object obj)
6933{
6934#ifdef SUSPICIOUS_OBJECT_CHECKING
6935 /* Right now, we care only about vectors. */
faa52174
PE
6936 if (VECTORLIKEP (obj))
6937 {
6938 suspicious_objects[suspicious_object_index++] = XVECTOR (obj);
6939 if (suspicious_object_index == ARRAYELTS (suspicious_objects))
6940 suspicious_object_index = 0;
6941 }
01ae0fbf
DC
6942#endif
6943 return obj;
6944}
6945
244ed907 6946#ifdef ENABLE_CHECKING
f4a681b0 6947
fce31d69 6948bool suppress_checking;
d3d47262 6949
e0b8c689 6950void
971de7fb 6951die (const char *msg, const char *file, int line)
e0b8c689 6952{
5013fc08 6953 fprintf (stderr, "\r\n%s:%d: Emacs fatal error: assertion failed: %s\r\n",
e0b8c689 6954 file, line, msg);
4d7e6e51 6955 terminate_due_to_signal (SIGABRT, INT_MAX);
e0b8c689 6956}
244ed907 6957#endif
20d24714 6958\f
b09cca6a 6959/* Initialization. */
7146af97 6960
dfcf069d 6961void
971de7fb 6962init_alloc_once (void)
7146af97
JB
6963{
6964 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
9e713715
GM
6965 purebeg = PUREBEG;
6966 pure_size = PURESIZE;
ab6780cd 6967
877935b1 6968#if GC_MARK_STACK || defined GC_MALLOC_CHECK
34400008
GM
6969 mem_init ();
6970 Vdead = make_pure_string ("DEAD", 4, 4, 0);
6971#endif
9e713715 6972
d1658221 6973#ifdef DOUG_LEA_MALLOC
b09cca6a
SM
6974 mallopt (M_TRIM_THRESHOLD, 128 * 1024); /* Trim threshold. */
6975 mallopt (M_MMAP_THRESHOLD, 64 * 1024); /* Mmap threshold. */
6976 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); /* Max. number of mmap'ed areas. */
d1658221 6977#endif
7146af97 6978 init_strings ();
f3372c87 6979 init_vectors ();
d5e35230 6980
24d8a105 6981 refill_memory_reserve ();
0dd6d66d 6982 gc_cons_threshold = GC_DEFAULT_THRESHOLD;
7146af97
JB
6983}
6984
dfcf069d 6985void
971de7fb 6986init_alloc (void)
7146af97
JB
6987{
6988 gcprolist = 0;
630686c8 6989 byte_stack_list = 0;
182ff242
GM
6990#if GC_MARK_STACK
6991#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
6992 setjmp_tested_p = longjmps_done = 0;
6993#endif
6994#endif
2c5bd608
DL
6995 Vgc_elapsed = make_float (0.0);
6996 gcs_done = 0;
a84683fd
DC
6997
6998#if USE_VALGRIND
d160dd0c 6999 valgrind_p = RUNNING_ON_VALGRIND != 0;
a84683fd 7000#endif
7146af97
JB
7001}
7002
7003void
971de7fb 7004syms_of_alloc (void)
7146af97 7005{
29208e82 7006 DEFVAR_INT ("gc-cons-threshold", gc_cons_threshold,
fb7ada5f 7007 doc: /* Number of bytes of consing between garbage collections.
228299fa
GM
7008Garbage collection can happen automatically once this many bytes have been
7009allocated since the last garbage collection. All data types count.
7146af97 7010
228299fa 7011Garbage collection happens automatically only when `eval' is called.
7146af97 7012
228299fa 7013By binding this temporarily to a large number, you can effectively
96f077ad
SM
7014prevent garbage collection during a part of the program.
7015See also `gc-cons-percentage'. */);
7016
29208e82 7017 DEFVAR_LISP ("gc-cons-percentage", Vgc_cons_percentage,
fb7ada5f 7018 doc: /* Portion of the heap used for allocation.
96f077ad
SM
7019Garbage collection can happen automatically once this portion of the heap
7020has been allocated since the last garbage collection.
7021If this portion is smaller than `gc-cons-threshold', this is ignored. */);
7022 Vgc_cons_percentage = make_float (0.1);
0819585c 7023
29208e82 7024 DEFVAR_INT ("pure-bytes-used", pure_bytes_used,
333f9019 7025 doc: /* Number of bytes of shareable Lisp data allocated so far. */);
0819585c 7026
29208e82 7027 DEFVAR_INT ("cons-cells-consed", cons_cells_consed,
a6266d23 7028 doc: /* Number of cons cells that have been consed so far. */);
0819585c 7029
29208e82 7030 DEFVAR_INT ("floats-consed", floats_consed,
a6266d23 7031 doc: /* Number of floats that have been consed so far. */);
0819585c 7032
29208e82 7033 DEFVAR_INT ("vector-cells-consed", vector_cells_consed,
a6266d23 7034 doc: /* Number of vector cells that have been consed so far. */);
0819585c 7035
29208e82 7036 DEFVAR_INT ("symbols-consed", symbols_consed,
a6266d23 7037 doc: /* Number of symbols that have been consed so far. */);
0819585c 7038
29208e82 7039 DEFVAR_INT ("string-chars-consed", string_chars_consed,
a6266d23 7040 doc: /* Number of string characters that have been consed so far. */);
0819585c 7041
29208e82 7042 DEFVAR_INT ("misc-objects-consed", misc_objects_consed,
01a6dcc8
GM
7043 doc: /* Number of miscellaneous objects that have been consed so far.
7044These include markers and overlays, plus certain objects not visible
7045to users. */);
2e471eb5 7046
29208e82 7047 DEFVAR_INT ("intervals-consed", intervals_consed,
a6266d23 7048 doc: /* Number of intervals that have been consed so far. */);
7146af97 7049
29208e82 7050 DEFVAR_INT ("strings-consed", strings_consed,
a6266d23 7051 doc: /* Number of strings that have been consed so far. */);
228299fa 7052
29208e82 7053 DEFVAR_LISP ("purify-flag", Vpurify_flag,
a6266d23 7054 doc: /* Non-nil means loading Lisp code in order to dump an executable.
e9515805
SM
7055This means that certain objects should be allocated in shared (pure) space.
7056It can also be set to a hash-table, in which case this table is used to
7057do hash-consing of the objects allocated to pure space. */);
228299fa 7058
29208e82 7059 DEFVAR_BOOL ("garbage-collection-messages", garbage_collection_messages,
a6266d23 7060 doc: /* Non-nil means display messages at start and end of garbage collection. */);
299585ee
RS
7061 garbage_collection_messages = 0;
7062
29208e82 7063 DEFVAR_LISP ("post-gc-hook", Vpost_gc_hook,
a6266d23 7064 doc: /* Hook run after garbage collection has finished. */);
9e713715 7065 Vpost_gc_hook = Qnil;
cd3520a4 7066 DEFSYM (Qpost_gc_hook, "post-gc-hook");
9e713715 7067
29208e82 7068 DEFVAR_LISP ("memory-signal-data", Vmemory_signal_data,
74a54b04 7069 doc: /* Precomputed `signal' argument for memory-full error. */);
bcb61d60
KH
7070 /* We build this in advance because if we wait until we need it, we might
7071 not be able to allocate the memory to hold it. */
74a54b04 7072 Vmemory_signal_data
3438fe21 7073 = listn (CONSTYPE_PURE, 2, Qerror,
694b6c97 7074 build_pure_c_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs"));
74a54b04 7075
29208e82 7076 DEFVAR_LISP ("memory-full", Vmemory_full,
24d8a105 7077 doc: /* Non-nil means Emacs cannot get much more Lisp memory. */);
74a54b04 7078 Vmemory_full = Qnil;
bcb61d60 7079
fecbd8ff
SM
7080 DEFSYM (Qconses, "conses");
7081 DEFSYM (Qsymbols, "symbols");
7082 DEFSYM (Qmiscs, "miscs");
7083 DEFSYM (Qstrings, "strings");
7084 DEFSYM (Qvectors, "vectors");
7085 DEFSYM (Qfloats, "floats");
7086 DEFSYM (Qintervals, "intervals");
7087 DEFSYM (Qbuffers, "buffers");
5b835e1d
DA
7088 DEFSYM (Qstring_bytes, "string-bytes");
7089 DEFSYM (Qvector_slots, "vector-slots");
f8643a6b 7090 DEFSYM (Qheap, "heap");
3d80c99f 7091 DEFSYM (Qautomatic_gc, "Automatic GC");
5b835e1d 7092
cd3520a4
JB
7093 DEFSYM (Qgc_cons_threshold, "gc-cons-threshold");
7094 DEFSYM (Qchar_table_extra_slots, "char-table-extra-slots");
a59de17b 7095
29208e82 7096 DEFVAR_LISP ("gc-elapsed", Vgc_elapsed,
2c5bd608 7097 doc: /* Accumulated time elapsed in garbage collections.
e7415487 7098The time is in seconds as a floating point value. */);
29208e82 7099 DEFVAR_INT ("gcs-done", gcs_done,
e7415487 7100 doc: /* Accumulated number of garbage collections done. */);
2c5bd608 7101
7146af97
JB
7102 defsubr (&Scons);
7103 defsubr (&Slist);
7104 defsubr (&Svector);
7105 defsubr (&Smake_byte_code);
7106 defsubr (&Smake_list);
7107 defsubr (&Smake_vector);
7108 defsubr (&Smake_string);
7b07587b 7109 defsubr (&Smake_bool_vector);
7146af97
JB
7110 defsubr (&Smake_symbol);
7111 defsubr (&Smake_marker);
7112 defsubr (&Spurecopy);
7113 defsubr (&Sgarbage_collect);
20d24714 7114 defsubr (&Smemory_limit);
310ea200 7115 defsubr (&Smemory_use_counts);
01ae0fbf 7116 defsubr (&Ssuspicious_object);
34400008
GM
7117
7118#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
7119 defsubr (&Sgc_status);
7120#endif
7146af97 7121}
5eceb8fb 7122
4706125e
PE
7123/* When compiled with GCC, GDB might say "No enum type named
7124 pvec_type" if we don't have at least one symbol with that type, and
7125 then xbacktrace could fail. Similarly for the other enums and
62aba0d4
FP
7126 their values. Some non-GCC compilers don't like these constructs. */
7127#ifdef __GNUC__
4706125e
PE
7128union
7129{
03a660a6
PE
7130 enum CHARTAB_SIZE_BITS CHARTAB_SIZE_BITS;
7131 enum CHAR_TABLE_STANDARD_SLOTS CHAR_TABLE_STANDARD_SLOTS;
7132 enum char_bits char_bits;
4706125e 7133 enum CHECK_LISP_OBJECT_TYPE CHECK_LISP_OBJECT_TYPE;
03a660a6 7134 enum DEFAULT_HASH_SIZE DEFAULT_HASH_SIZE;
03a660a6 7135 enum FLOAT_TO_STRING_BUFSIZE FLOAT_TO_STRING_BUFSIZE;
4706125e 7136 enum Lisp_Bits Lisp_Bits;
03a660a6
PE
7137 enum Lisp_Compiled Lisp_Compiled;
7138 enum maxargs maxargs;
7139 enum MAX_ALLOCA MAX_ALLOCA;
4706125e
PE
7140 enum More_Lisp_Bits More_Lisp_Bits;
7141 enum pvec_type pvec_type;
7142} const EXTERNALLY_VISIBLE gdb_make_enums_visible = {0};
62aba0d4 7143#endif /* __GNUC__ */