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