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