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