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