PR c++/30897
[official-gcc.git] / gcc / ggc-zone.c
blob404db7641ab3cbddbff9854c806c6d23833360d4
1 /* "Bag-of-pages" zone garbage collector for the GNU compiler.
2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
3 Free Software Foundation, Inc.
5 Contributed by Richard Henderson (rth@redhat.com) and Daniel Berlin
6 (dberlin@dberlin.org). Rewritten by Daniel Jacobowitz
7 <dan@codesourcery.com>.
9 This file is part of GCC.
11 GCC is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free
13 Software Foundation; either version 3, or (at your option) any later
14 version.
16 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17 WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 for more details.
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING3. If not see
23 <http://www.gnu.org/licenses/>. */
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tm.h"
29 #include "tree.h"
30 #include "rtl.h"
31 #include "tm_p.h"
32 #include "toplev.h"
33 #include "varray.h"
34 #include "flags.h"
35 #include "ggc.h"
36 #include "timevar.h"
37 #include "params.h"
38 #include "bitmap.h"
40 #ifdef ENABLE_VALGRIND_CHECKING
41 # ifdef HAVE_VALGRIND_MEMCHECK_H
42 # include <valgrind/memcheck.h>
43 # elif defined HAVE_MEMCHECK_H
44 # include <memcheck.h>
45 # else
46 # include <valgrind.h>
47 # endif
48 #else
49 /* Avoid #ifdef:s when we can help it. */
50 #define VALGRIND_DISCARD(x)
51 #define VALGRIND_MALLOCLIKE_BLOCK(w,x,y,z)
52 #define VALGRIND_FREELIKE_BLOCK(x,y)
53 #endif
55 /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
56 file open. Prefer either to valloc. */
57 #ifdef HAVE_MMAP_ANON
58 # undef HAVE_MMAP_DEV_ZERO
60 # include <sys/mman.h>
61 # ifndef MAP_FAILED
62 # define MAP_FAILED -1
63 # endif
64 # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
65 # define MAP_ANONYMOUS MAP_ANON
66 # endif
67 # define USING_MMAP
68 #endif
70 #ifdef HAVE_MMAP_DEV_ZERO
71 # include <sys/mman.h>
72 # ifndef MAP_FAILED
73 # define MAP_FAILED -1
74 # endif
75 # define USING_MMAP
76 #endif
78 #ifndef USING_MMAP
79 #error Zone collector requires mmap
80 #endif
82 #if (GCC_VERSION < 3001)
83 #define prefetch(X) ((void) X)
84 #define prefetchw(X) ((void) X)
85 #else
86 #define prefetch(X) __builtin_prefetch (X)
87 #define prefetchw(X) __builtin_prefetch (X, 1, 3)
88 #endif
90 /* FUTURE NOTES:
92 If we track inter-zone pointers, we can mark single zones at a
93 time.
95 If we have a zone where we guarantee no inter-zone pointers, we
96 could mark that zone separately.
98 The garbage zone should not be marked, and we should return 1 in
99 ggc_set_mark for any object in the garbage zone, which cuts off
100 marking quickly. */
102 /* Strategy:
104 This garbage-collecting allocator segregates objects into zones.
105 It also segregates objects into "large" and "small" bins. Large
106 objects are greater than page size.
108 Pages for small objects are broken up into chunks. The page has
109 a bitmap which marks the start position of each chunk (whether
110 allocated or free). Free chunks are on one of the zone's free
111 lists and contain a pointer to the next free chunk. Chunks in
112 most of the free lists have a fixed size determined by the
113 free list. Chunks in the "other" sized free list have their size
114 stored right after their chain pointer.
116 Empty pages (of all sizes) are kept on a single page cache list,
117 and are considered first when new pages are required; they are
118 deallocated at the start of the next collection if they haven't
119 been recycled by then. The free page list is currently per-zone. */
121 /* Define GGC_DEBUG_LEVEL to print debugging information.
122 0: No debugging output.
123 1: GC statistics only.
124 2: Page-entry allocations/deallocations as well.
125 3: Object allocations as well.
126 4: Object marks as well. */
127 #define GGC_DEBUG_LEVEL (0)
129 #ifndef HOST_BITS_PER_PTR
130 #define HOST_BITS_PER_PTR HOST_BITS_PER_LONG
131 #endif
133 /* This structure manages small free chunks. The SIZE field is only
134 initialized if the chunk is in the "other" sized free list. Large
135 chunks are allocated one at a time to their own page, and so don't
136 come in here. */
138 struct alloc_chunk {
139 struct alloc_chunk *next_free;
140 unsigned int size;
143 /* The size of the fixed-size portion of a small page descriptor. */
144 #define PAGE_OVERHEAD (offsetof (struct small_page_entry, alloc_bits))
146 /* The collector's idea of the page size. This must be a power of two
147 no larger than the system page size, because pages must be aligned
148 to this amount and are tracked at this granularity in the page
149 table. We choose a size at compile time for efficiency.
151 We could make a better guess at compile time if PAGE_SIZE is a
152 constant in system headers, and PAGE_SHIFT is defined... */
153 #define GGC_PAGE_SIZE 4096
154 #define GGC_PAGE_MASK (GGC_PAGE_SIZE - 1)
155 #define GGC_PAGE_SHIFT 12
157 #if 0
158 /* Alternative definitions which use the runtime page size. */
159 #define GGC_PAGE_SIZE G.pagesize
160 #define GGC_PAGE_MASK G.page_mask
161 #define GGC_PAGE_SHIFT G.lg_pagesize
162 #endif
164 /* The size of a small page managed by the garbage collector. This
165 must currently be GGC_PAGE_SIZE, but with a few changes could
166 be any multiple of it to reduce certain kinds of overhead. */
167 #define SMALL_PAGE_SIZE GGC_PAGE_SIZE
169 /* Free bin information. These numbers may be in need of re-tuning.
170 In general, decreasing the number of free bins would seem to
171 increase the time it takes to allocate... */
173 /* FIXME: We can't use anything but MAX_ALIGNMENT for the bin size
174 today. */
176 #define NUM_FREE_BINS 64
177 #define FREE_BIN_DELTA MAX_ALIGNMENT
178 #define SIZE_BIN_DOWN(SIZE) ((SIZE) / FREE_BIN_DELTA)
180 /* Allocation and marking parameters. */
182 /* The smallest allocatable unit to keep track of. */
183 #define BYTES_PER_ALLOC_BIT MAX_ALIGNMENT
185 /* The smallest markable unit. If we require each allocated object
186 to contain at least two allocatable units, we can use half as many
187 bits for the mark bitmap. But this adds considerable complexity
188 to sweeping. */
189 #define BYTES_PER_MARK_BIT BYTES_PER_ALLOC_BIT
191 #define BYTES_PER_MARK_WORD (8 * BYTES_PER_MARK_BIT * sizeof (mark_type))
193 /* We use this structure to determine the alignment required for
194 allocations.
196 There are several things wrong with this estimation of alignment.
198 The maximum alignment for a structure is often less than the
199 maximum alignment for a basic data type; for instance, on some
200 targets long long must be aligned to sizeof (int) in a structure
201 and sizeof (long long) in a variable. i386-linux is one example;
202 Darwin is another (sometimes, depending on the compiler in use).
204 Also, long double is not included. Nothing in GCC uses long
205 double, so we assume that this is OK. On powerpc-darwin, adding
206 long double would bring the maximum alignment up to 16 bytes,
207 and until we need long double (or to vectorize compiler operations)
208 that's painfully wasteful. This will need to change, some day. */
210 struct max_alignment {
211 char c;
212 union {
213 HOST_WIDEST_INT i;
214 double d;
215 } u;
218 /* The biggest alignment required. */
220 #define MAX_ALIGNMENT (offsetof (struct max_alignment, u))
222 /* Compute the smallest multiple of F that is >= X. */
224 #define ROUND_UP(x, f) (CEIL (x, f) * (f))
226 /* Types to use for the allocation and mark bitmaps. It might be
227 a good idea to add ffsl to libiberty and use unsigned long
228 instead; that could speed us up where long is wider than int. */
230 typedef unsigned int alloc_type;
231 typedef unsigned int mark_type;
232 #define alloc_ffs(x) ffs(x)
234 /* A page_entry records the status of an allocation page. This is the
235 common data between all three kinds of pages - small, large, and
236 PCH. */
237 typedef struct page_entry
239 /* The address at which the memory is allocated. */
240 char *page;
242 /* The zone that this page entry belongs to. */
243 struct alloc_zone *zone;
245 #ifdef GATHER_STATISTICS
246 /* How many collections we've survived. */
247 size_t survived;
248 #endif
250 /* Does this page contain small objects, or one large object? */
251 bool large_p;
253 /* Is this page part of the loaded PCH? */
254 bool pch_p;
255 } page_entry;
257 /* Additional data needed for small pages. */
258 struct small_page_entry
260 struct page_entry common;
262 /* The next small page entry, or NULL if this is the last. */
263 struct small_page_entry *next;
265 /* If currently marking this zone, a pointer to the mark bits
266 for this page. If we aren't currently marking this zone,
267 this pointer may be stale (pointing to freed memory). */
268 mark_type *mark_bits;
270 /* The allocation bitmap. This array extends far enough to have
271 one bit for every BYTES_PER_ALLOC_BIT bytes in the page. */
272 alloc_type alloc_bits[1];
275 /* Additional data needed for large pages. */
276 struct large_page_entry
278 struct page_entry common;
280 /* The next large page entry, or NULL if this is the last. */
281 struct large_page_entry *next;
283 /* The number of bytes allocated, not including the page entry. */
284 size_t bytes;
286 /* The previous page in the list, so that we can unlink this one. */
287 struct large_page_entry *prev;
289 /* During marking, is this object marked? */
290 bool mark_p;
293 /* A two-level tree is used to look up the page-entry for a given
294 pointer. Two chunks of the pointer's bits are extracted to index
295 the first and second levels of the tree, as follows:
297 HOST_PAGE_SIZE_BITS
298 32 | |
299 msb +----------------+----+------+------+ lsb
300 | | |
301 PAGE_L1_BITS |
303 PAGE_L2_BITS
305 The bottommost HOST_PAGE_SIZE_BITS are ignored, since page-entry
306 pages are aligned on system page boundaries. The next most
307 significant PAGE_L2_BITS and PAGE_L1_BITS are the second and first
308 index values in the lookup table, respectively.
310 For 32-bit architectures and the settings below, there are no
311 leftover bits. For architectures with wider pointers, the lookup
312 tree points to a list of pages, which must be scanned to find the
313 correct one. */
315 #define PAGE_L1_BITS (8)
316 #define PAGE_L2_BITS (32 - PAGE_L1_BITS - GGC_PAGE_SHIFT)
317 #define PAGE_L1_SIZE ((size_t) 1 << PAGE_L1_BITS)
318 #define PAGE_L2_SIZE ((size_t) 1 << PAGE_L2_BITS)
320 #define LOOKUP_L1(p) \
321 (((size_t) (p) >> (32 - PAGE_L1_BITS)) & ((1 << PAGE_L1_BITS) - 1))
323 #define LOOKUP_L2(p) \
324 (((size_t) (p) >> GGC_PAGE_SHIFT) & ((1 << PAGE_L2_BITS) - 1))
326 #if HOST_BITS_PER_PTR <= 32
328 /* On 32-bit hosts, we use a two level page table, as pictured above. */
329 typedef page_entry **page_table[PAGE_L1_SIZE];
331 #else
333 /* On 64-bit hosts, we use the same two level page tables plus a linked
334 list that disambiguates the top 32-bits. There will almost always be
335 exactly one entry in the list. */
336 typedef struct page_table_chain
338 struct page_table_chain *next;
339 size_t high_bits;
340 page_entry **table[PAGE_L1_SIZE];
341 } *page_table;
343 #endif
345 /* The global variables. */
346 static struct globals
348 /* The linked list of zones. */
349 struct alloc_zone *zones;
351 /* Lookup table for associating allocation pages with object addresses. */
352 page_table lookup;
354 /* The system's page size, and related constants. */
355 size_t pagesize;
356 size_t lg_pagesize;
357 size_t page_mask;
359 /* The size to allocate for a small page entry. This includes
360 the size of the structure and the size of the allocation
361 bitmap. */
362 size_t small_page_overhead;
364 #if defined (HAVE_MMAP_DEV_ZERO)
365 /* A file descriptor open to /dev/zero for reading. */
366 int dev_zero_fd;
367 #endif
369 /* Allocate pages in chunks of this size, to throttle calls to memory
370 allocation routines. The first page is used, the rest go onto the
371 free list. */
372 size_t quire_size;
374 /* The file descriptor for debugging output. */
375 FILE *debug_file;
376 } G;
378 /* A zone allocation structure. There is one of these for every
379 distinct allocation zone. */
380 struct alloc_zone
382 /* The most recent free chunk is saved here, instead of in the linked
383 free list, to decrease list manipulation. It is most likely that we
384 will want this one. */
385 char *cached_free;
386 size_t cached_free_size;
388 /* Linked lists of free storage. Slots 1 ... NUM_FREE_BINS have chunks of size
389 FREE_BIN_DELTA. All other chunks are in slot 0. */
390 struct alloc_chunk *free_chunks[NUM_FREE_BINS + 1];
392 /* The highest bin index which might be non-empty. It may turn out
393 to be empty, in which case we have to search downwards. */
394 size_t high_free_bin;
396 /* Bytes currently allocated in this zone. */
397 size_t allocated;
399 /* Linked list of the small pages in this zone. */
400 struct small_page_entry *pages;
402 /* Doubly linked list of large pages in this zone. */
403 struct large_page_entry *large_pages;
405 /* If we are currently marking this zone, a pointer to the mark bits. */
406 mark_type *mark_bits;
408 /* Name of the zone. */
409 const char *name;
411 /* The number of small pages currently allocated in this zone. */
412 size_t n_small_pages;
414 /* Bytes allocated at the end of the last collection. */
415 size_t allocated_last_gc;
417 /* Total amount of memory mapped. */
418 size_t bytes_mapped;
420 /* A cache of free system pages. */
421 struct small_page_entry *free_pages;
423 /* Next zone in the linked list of zones. */
424 struct alloc_zone *next_zone;
426 /* True if this zone was collected during this collection. */
427 bool was_collected;
429 /* True if this zone should be destroyed after the next collection. */
430 bool dead;
432 #ifdef GATHER_STATISTICS
433 struct
435 /* Total memory allocated with ggc_alloc. */
436 unsigned long long total_allocated;
437 /* Total overhead for memory to be allocated with ggc_alloc. */
438 unsigned long long total_overhead;
440 /* Total allocations and overhead for sizes less than 32, 64 and 128.
441 These sizes are interesting because they are typical cache line
442 sizes. */
444 unsigned long long total_allocated_under32;
445 unsigned long long total_overhead_under32;
447 unsigned long long total_allocated_under64;
448 unsigned long long total_overhead_under64;
450 unsigned long long total_allocated_under128;
451 unsigned long long total_overhead_under128;
452 } stats;
453 #endif
454 } main_zone;
456 /* Some default zones. */
457 struct alloc_zone rtl_zone;
458 struct alloc_zone tree_zone;
459 struct alloc_zone tree_id_zone;
461 /* The PCH zone does not need a normal zone structure, and it does
462 not live on the linked list of zones. */
463 struct pch_zone
465 /* The start of the PCH zone. NULL if there is none. */
466 char *page;
468 /* The end of the PCH zone. NULL if there is none. */
469 char *end;
471 /* The size of the PCH zone. 0 if there is none. */
472 size_t bytes;
474 /* The allocation bitmap for the PCH zone. */
475 alloc_type *alloc_bits;
477 /* If we are currently marking, the mark bitmap for the PCH zone.
478 When it is first read in, we could avoid marking the PCH,
479 because it will not contain any pointers to GC memory outside
480 of the PCH; however, the PCH is currently mapped as writable,
481 so we must mark it in case new pointers are added. */
482 mark_type *mark_bits;
483 } pch_zone;
485 #ifdef USING_MMAP
486 static char *alloc_anon (char *, size_t, struct alloc_zone *);
487 #endif
488 static struct small_page_entry * alloc_small_page (struct alloc_zone *);
489 static struct large_page_entry * alloc_large_page (size_t, struct alloc_zone *);
490 static void free_chunk (char *, size_t, struct alloc_zone *);
491 static void free_small_page (struct small_page_entry *);
492 static void free_large_page (struct large_page_entry *);
493 static void release_pages (struct alloc_zone *);
494 static void sweep_pages (struct alloc_zone *);
495 static bool ggc_collect_1 (struct alloc_zone *, bool);
496 static void new_ggc_zone_1 (struct alloc_zone *, const char *);
498 /* Traverse the page table and find the entry for a page.
499 Die (probably) if the object wasn't allocated via GC. */
501 static inline page_entry *
502 lookup_page_table_entry (const void *p)
504 page_entry ***base;
505 size_t L1, L2;
507 #if HOST_BITS_PER_PTR <= 32
508 base = &G.lookup[0];
509 #else
510 page_table table = G.lookup;
511 size_t high_bits = (size_t) p & ~ (size_t) 0xffffffff;
512 while (table->high_bits != high_bits)
513 table = table->next;
514 base = &table->table[0];
515 #endif
517 /* Extract the level 1 and 2 indices. */
518 L1 = LOOKUP_L1 (p);
519 L2 = LOOKUP_L2 (p);
521 return base[L1][L2];
524 /* Set the page table entry for the page that starts at P. If ENTRY
525 is NULL, clear the entry. */
527 static void
528 set_page_table_entry (void *p, page_entry *entry)
530 page_entry ***base;
531 size_t L1, L2;
533 #if HOST_BITS_PER_PTR <= 32
534 base = &G.lookup[0];
535 #else
536 page_table table;
537 size_t high_bits = (size_t) p & ~ (size_t) 0xffffffff;
538 for (table = G.lookup; table; table = table->next)
539 if (table->high_bits == high_bits)
540 goto found;
542 /* Not found -- allocate a new table. */
543 table = xcalloc (1, sizeof(*table));
544 table->next = G.lookup;
545 table->high_bits = high_bits;
546 G.lookup = table;
547 found:
548 base = &table->table[0];
549 #endif
551 /* Extract the level 1 and 2 indices. */
552 L1 = LOOKUP_L1 (p);
553 L2 = LOOKUP_L2 (p);
555 if (base[L1] == NULL)
556 base[L1] = xcalloc (PAGE_L2_SIZE, sizeof (page_entry *));
558 base[L1][L2] = entry;
561 /* Find the page table entry associated with OBJECT. */
563 static inline struct page_entry *
564 zone_get_object_page (const void *object)
566 return lookup_page_table_entry (object);
569 /* Find which element of the alloc_bits array OBJECT should be
570 recorded in. */
571 static inline unsigned int
572 zone_get_object_alloc_word (const void *object)
574 return (((size_t) object & (GGC_PAGE_SIZE - 1))
575 / (8 * sizeof (alloc_type) * BYTES_PER_ALLOC_BIT));
578 /* Find which bit of the appropriate word in the alloc_bits array
579 OBJECT should be recorded in. */
580 static inline unsigned int
581 zone_get_object_alloc_bit (const void *object)
583 return (((size_t) object / BYTES_PER_ALLOC_BIT)
584 % (8 * sizeof (alloc_type)));
587 /* Find which element of the mark_bits array OBJECT should be recorded
588 in. */
589 static inline unsigned int
590 zone_get_object_mark_word (const void *object)
592 return (((size_t) object & (GGC_PAGE_SIZE - 1))
593 / (8 * sizeof (mark_type) * BYTES_PER_MARK_BIT));
596 /* Find which bit of the appropriate word in the mark_bits array
597 OBJECT should be recorded in. */
598 static inline unsigned int
599 zone_get_object_mark_bit (const void *object)
601 return (((size_t) object / BYTES_PER_MARK_BIT)
602 % (8 * sizeof (mark_type)));
605 /* Set the allocation bit corresponding to OBJECT in its page's
606 bitmap. Used to split this object from the preceding one. */
607 static inline void
608 zone_set_object_alloc_bit (const void *object)
610 struct small_page_entry *page
611 = (struct small_page_entry *) zone_get_object_page (object);
612 unsigned int start_word = zone_get_object_alloc_word (object);
613 unsigned int start_bit = zone_get_object_alloc_bit (object);
615 page->alloc_bits[start_word] |= 1L << start_bit;
618 /* Clear the allocation bit corresponding to OBJECT in PAGE's
619 bitmap. Used to coalesce this object with the preceding
620 one. */
621 static inline void
622 zone_clear_object_alloc_bit (struct small_page_entry *page,
623 const void *object)
625 unsigned int start_word = zone_get_object_alloc_word (object);
626 unsigned int start_bit = zone_get_object_alloc_bit (object);
628 /* Would xor be quicker? */
629 page->alloc_bits[start_word] &= ~(1L << start_bit);
632 /* Find the size of the object which starts at START_WORD and
633 START_BIT in ALLOC_BITS, which is at most MAX_SIZE bytes.
634 Helper function for ggc_get_size and zone_find_object_size. */
636 static inline size_t
637 zone_object_size_1 (alloc_type *alloc_bits,
638 size_t start_word, size_t start_bit,
639 size_t max_size)
641 size_t size;
642 alloc_type alloc_word;
643 int indx;
645 /* Load the first word. */
646 alloc_word = alloc_bits[start_word++];
648 /* If that was the last bit in this word, we'll want to continue
649 with the next word. Otherwise, handle the rest of this word. */
650 if (start_bit)
652 indx = alloc_ffs (alloc_word >> start_bit);
653 if (indx)
654 /* indx is 1-based. We started at the bit after the object's
655 start, but we also ended at the bit after the object's end.
656 It cancels out. */
657 return indx * BYTES_PER_ALLOC_BIT;
659 /* The extra 1 accounts for the starting unit, before start_bit. */
660 size = (sizeof (alloc_type) * 8 - start_bit + 1) * BYTES_PER_ALLOC_BIT;
662 if (size >= max_size)
663 return max_size;
665 alloc_word = alloc_bits[start_word++];
667 else
668 size = BYTES_PER_ALLOC_BIT;
670 while (alloc_word == 0)
672 size += sizeof (alloc_type) * 8 * BYTES_PER_ALLOC_BIT;
673 if (size >= max_size)
674 return max_size;
675 alloc_word = alloc_bits[start_word++];
678 indx = alloc_ffs (alloc_word);
679 return size + (indx - 1) * BYTES_PER_ALLOC_BIT;
682 /* Find the size of OBJECT on small page PAGE. */
684 static inline size_t
685 zone_find_object_size (struct small_page_entry *page,
686 const void *object)
688 const char *object_midptr = (const char *) object + BYTES_PER_ALLOC_BIT;
689 unsigned int start_word = zone_get_object_alloc_word (object_midptr);
690 unsigned int start_bit = zone_get_object_alloc_bit (object_midptr);
691 size_t max_size = (page->common.page + SMALL_PAGE_SIZE
692 - (char *) object);
694 return zone_object_size_1 (page->alloc_bits, start_word, start_bit,
695 max_size);
698 /* Allocate the mark bits for every zone, and set the pointers on each
699 page. */
700 static void
701 zone_allocate_marks (void)
703 struct alloc_zone *zone;
705 for (zone = G.zones; zone; zone = zone->next_zone)
707 struct small_page_entry *page;
708 mark_type *cur_marks;
709 size_t mark_words, mark_words_per_page;
710 #ifdef ENABLE_CHECKING
711 size_t n = 0;
712 #endif
714 mark_words_per_page
715 = (GGC_PAGE_SIZE + BYTES_PER_MARK_WORD - 1) / BYTES_PER_MARK_WORD;
716 mark_words = zone->n_small_pages * mark_words_per_page;
717 zone->mark_bits = (mark_type *) xcalloc (sizeof (mark_type),
718 mark_words);
719 cur_marks = zone->mark_bits;
720 for (page = zone->pages; page; page = page->next)
722 page->mark_bits = cur_marks;
723 cur_marks += mark_words_per_page;
724 #ifdef ENABLE_CHECKING
725 n++;
726 #endif
728 #ifdef ENABLE_CHECKING
729 gcc_assert (n == zone->n_small_pages);
730 #endif
733 /* We don't collect the PCH zone, but we do have to mark it
734 (for now). */
735 if (pch_zone.bytes)
736 pch_zone.mark_bits
737 = (mark_type *) xcalloc (sizeof (mark_type),
738 CEIL (pch_zone.bytes, BYTES_PER_MARK_WORD));
741 /* After marking and sweeping, release the memory used for mark bits. */
742 static void
743 zone_free_marks (void)
745 struct alloc_zone *zone;
747 for (zone = G.zones; zone; zone = zone->next_zone)
748 if (zone->mark_bits)
750 free (zone->mark_bits);
751 zone->mark_bits = NULL;
754 if (pch_zone.bytes)
756 free (pch_zone.mark_bits);
757 pch_zone.mark_bits = NULL;
761 #ifdef USING_MMAP
762 /* Allocate SIZE bytes of anonymous memory, preferably near PREF,
763 (if non-null). The ifdef structure here is intended to cause a
764 compile error unless exactly one of the HAVE_* is defined. */
766 static inline char *
767 alloc_anon (char *pref ATTRIBUTE_UNUSED, size_t size, struct alloc_zone *zone)
769 #ifdef HAVE_MMAP_ANON
770 char *page = (char *) mmap (pref, size, PROT_READ | PROT_WRITE,
771 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
772 #endif
773 #ifdef HAVE_MMAP_DEV_ZERO
774 char *page = (char *) mmap (pref, size, PROT_READ | PROT_WRITE,
775 MAP_PRIVATE, G.dev_zero_fd, 0);
776 #endif
778 if (page == (char *) MAP_FAILED)
780 perror ("virtual memory exhausted");
781 exit (FATAL_EXIT_CODE);
784 /* Remember that we allocated this memory. */
785 zone->bytes_mapped += size;
787 /* Pretend we don't have access to the allocated pages. We'll enable
788 access to smaller pieces of the area in ggc_alloc. Discard the
789 handle to avoid handle leak. */
790 VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (page, size));
792 return page;
794 #endif
796 /* Allocate a new page for allocating small objects in ZONE, and
797 return an entry for it. */
799 static struct small_page_entry *
800 alloc_small_page (struct alloc_zone *zone)
802 struct small_page_entry *entry;
804 /* Check the list of free pages for one we can use. */
805 entry = zone->free_pages;
806 if (entry != NULL)
808 /* Recycle the allocated memory from this page ... */
809 zone->free_pages = entry->next;
811 else
813 /* We want just one page. Allocate a bunch of them and put the
814 extras on the freelist. (Can only do this optimization with
815 mmap for backing store.) */
816 struct small_page_entry *e, *f = zone->free_pages;
817 int i;
818 char *page;
820 page = alloc_anon (NULL, GGC_PAGE_SIZE * G.quire_size, zone);
822 /* This loop counts down so that the chain will be in ascending
823 memory order. */
824 for (i = G.quire_size - 1; i >= 1; i--)
826 e = xcalloc (1, G.small_page_overhead);
827 e->common.page = page + (i << GGC_PAGE_SHIFT);
828 e->common.zone = zone;
829 e->next = f;
830 f = e;
831 set_page_table_entry (e->common.page, &e->common);
834 zone->free_pages = f;
836 entry = xcalloc (1, G.small_page_overhead);
837 entry->common.page = page;
838 entry->common.zone = zone;
839 set_page_table_entry (page, &entry->common);
842 zone->n_small_pages++;
844 if (GGC_DEBUG_LEVEL >= 2)
845 fprintf (G.debug_file,
846 "Allocating %s page at %p, data %p-%p\n",
847 entry->common.zone->name, (PTR) entry, entry->common.page,
848 entry->common.page + SMALL_PAGE_SIZE - 1);
850 return entry;
853 /* Allocate a large page of size SIZE in ZONE. */
855 static struct large_page_entry *
856 alloc_large_page (size_t size, struct alloc_zone *zone)
858 struct large_page_entry *entry;
859 char *page;
860 size_t needed_size;
862 needed_size = size + sizeof (struct large_page_entry);
863 page = xmalloc (needed_size);
865 entry = (struct large_page_entry *) page;
867 entry->next = NULL;
868 entry->common.page = page + sizeof (struct large_page_entry);
869 entry->common.large_p = true;
870 entry->common.pch_p = false;
871 entry->common.zone = zone;
872 #ifdef GATHER_STATISTICS
873 entry->common.survived = 0;
874 #endif
875 entry->mark_p = false;
876 entry->bytes = size;
877 entry->prev = NULL;
879 set_page_table_entry (entry->common.page, &entry->common);
881 if (GGC_DEBUG_LEVEL >= 2)
882 fprintf (G.debug_file,
883 "Allocating %s large page at %p, data %p-%p\n",
884 entry->common.zone->name, (PTR) entry, entry->common.page,
885 entry->common.page + SMALL_PAGE_SIZE - 1);
887 return entry;
891 /* For a page that is no longer needed, put it on the free page list. */
893 static inline void
894 free_small_page (struct small_page_entry *entry)
896 if (GGC_DEBUG_LEVEL >= 2)
897 fprintf (G.debug_file,
898 "Deallocating %s page at %p, data %p-%p\n",
899 entry->common.zone->name, (PTR) entry,
900 entry->common.page, entry->common.page + SMALL_PAGE_SIZE - 1);
902 gcc_assert (!entry->common.large_p);
904 /* Mark the page as inaccessible. Discard the handle to
905 avoid handle leak. */
906 VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (entry->common.page,
907 SMALL_PAGE_SIZE));
909 entry->next = entry->common.zone->free_pages;
910 entry->common.zone->free_pages = entry;
911 entry->common.zone->n_small_pages--;
914 /* Release a large page that is no longer needed. */
916 static inline void
917 free_large_page (struct large_page_entry *entry)
919 if (GGC_DEBUG_LEVEL >= 2)
920 fprintf (G.debug_file,
921 "Deallocating %s page at %p, data %p-%p\n",
922 entry->common.zone->name, (PTR) entry,
923 entry->common.page, entry->common.page + SMALL_PAGE_SIZE - 1);
925 gcc_assert (entry->common.large_p);
927 set_page_table_entry (entry->common.page, NULL);
928 free (entry);
931 /* Release the free page cache to the system. */
933 static void
934 release_pages (struct alloc_zone *zone)
936 #ifdef USING_MMAP
937 struct small_page_entry *p, *next;
938 char *start;
939 size_t len;
941 /* Gather up adjacent pages so they are unmapped together. */
942 p = zone->free_pages;
944 while (p)
946 start = p->common.page;
947 next = p->next;
948 len = SMALL_PAGE_SIZE;
949 set_page_table_entry (p->common.page, NULL);
950 p = next;
952 while (p && p->common.page == start + len)
954 next = p->next;
955 len += SMALL_PAGE_SIZE;
956 set_page_table_entry (p->common.page, NULL);
957 p = next;
960 munmap (start, len);
961 zone->bytes_mapped -= len;
964 zone->free_pages = NULL;
965 #endif
968 /* Place the block at PTR of size SIZE on the free list for ZONE. */
970 static inline void
971 free_chunk (char *ptr, size_t size, struct alloc_zone *zone)
973 struct alloc_chunk *chunk = (struct alloc_chunk *) ptr;
974 size_t bin = 0;
976 bin = SIZE_BIN_DOWN (size);
977 gcc_assert (bin != 0);
978 if (bin > NUM_FREE_BINS)
980 bin = 0;
981 VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (chunk, sizeof (struct alloc_chunk)));
982 chunk->size = size;
983 chunk->next_free = zone->free_chunks[bin];
984 VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (ptr + sizeof (struct alloc_chunk),
985 size - sizeof (struct alloc_chunk)));
987 else
989 VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (chunk, sizeof (struct alloc_chunk *)));
990 chunk->next_free = zone->free_chunks[bin];
991 VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (ptr + sizeof (struct alloc_chunk *),
992 size - sizeof (struct alloc_chunk *)));
995 zone->free_chunks[bin] = chunk;
996 if (bin > zone->high_free_bin)
997 zone->high_free_bin = bin;
998 if (GGC_DEBUG_LEVEL >= 3)
999 fprintf (G.debug_file, "Deallocating object, chunk=%p\n", (void *)chunk);
1002 /* Allocate a chunk of memory of at least ORIG_SIZE bytes, in ZONE. */
1004 void *
1005 ggc_alloc_zone_stat (size_t orig_size, struct alloc_zone *zone
1006 MEM_STAT_DECL)
1008 size_t bin;
1009 size_t csize;
1010 struct small_page_entry *entry;
1011 struct alloc_chunk *chunk, **pp;
1012 void *result;
1013 size_t size = orig_size;
1015 /* Make sure that zero-sized allocations get a unique and freeable
1016 pointer. */
1017 if (size == 0)
1018 size = MAX_ALIGNMENT;
1019 else
1020 size = (size + MAX_ALIGNMENT - 1) & -MAX_ALIGNMENT;
1022 /* Try to allocate the object from several different sources. Each
1023 of these cases is responsible for setting RESULT and SIZE to
1024 describe the allocated block, before jumping to FOUND. If a
1025 chunk is split, the allocate bit for the new chunk should also be
1026 set.
1028 Large objects are handled specially. However, they'll just fail
1029 the next couple of conditions, so we can wait to check for them
1030 below. The large object case is relatively rare (< 1%), so this
1031 is a win. */
1033 /* First try to split the last chunk we allocated. For best
1034 fragmentation behavior it would be better to look for a
1035 free bin of the appropriate size for a small object. However,
1036 we're unlikely (1% - 7%) to find one, and this gives better
1037 locality behavior anyway. This case handles the lion's share
1038 of all calls to this function. */
1039 if (size <= zone->cached_free_size)
1041 result = zone->cached_free;
1043 zone->cached_free_size -= size;
1044 if (zone->cached_free_size)
1046 zone->cached_free += size;
1047 zone_set_object_alloc_bit (zone->cached_free);
1050 goto found;
1053 /* Next, try to find a free bin of the exactly correct size. */
1055 /* We want to round SIZE up, rather than down, but we know it's
1056 already aligned to at least FREE_BIN_DELTA, so we can just
1057 shift. */
1058 bin = SIZE_BIN_DOWN (size);
1060 if (bin <= NUM_FREE_BINS
1061 && (chunk = zone->free_chunks[bin]) != NULL)
1063 /* We have a chunk of the right size. Pull it off the free list
1064 and use it. */
1066 zone->free_chunks[bin] = chunk->next_free;
1068 /* NOTE: SIZE is only guaranteed to be right if MAX_ALIGNMENT
1069 == FREE_BIN_DELTA. */
1070 result = chunk;
1072 /* The allocation bits are already set correctly. HIGH_FREE_BIN
1073 may now be wrong, if this was the last chunk in the high bin.
1074 Rather than fixing it up now, wait until we need to search
1075 the free bins. */
1077 goto found;
1080 /* Next, if there wasn't a chunk of the ideal size, look for a chunk
1081 to split. We can find one in the too-big bin, or in the largest
1082 sized bin with a chunk in it. Try the largest normal-sized bin
1083 first. */
1085 if (zone->high_free_bin > bin)
1087 /* Find the highest numbered free bin. It will be at or below
1088 the watermark. */
1089 while (zone->high_free_bin > bin
1090 && zone->free_chunks[zone->high_free_bin] == NULL)
1091 zone->high_free_bin--;
1093 if (zone->high_free_bin > bin)
1095 size_t tbin = zone->high_free_bin;
1096 chunk = zone->free_chunks[tbin];
1098 /* Remove the chunk from its previous bin. */
1099 zone->free_chunks[tbin] = chunk->next_free;
1101 result = (char *) chunk;
1103 /* Save the rest of the chunk for future allocation. */
1104 if (zone->cached_free_size)
1105 free_chunk (zone->cached_free, zone->cached_free_size, zone);
1107 chunk = (struct alloc_chunk *) ((char *) result + size);
1108 zone->cached_free = (char *) chunk;
1109 zone->cached_free_size = (tbin - bin) * FREE_BIN_DELTA;
1111 /* Mark the new free chunk as an object, so that we can
1112 find the size of the newly allocated object. */
1113 zone_set_object_alloc_bit (chunk);
1115 /* HIGH_FREE_BIN may now be wrong, if this was the last
1116 chunk in the high bin. Rather than fixing it up now,
1117 wait until we need to search the free bins. */
1119 goto found;
1123 /* Failing that, look through the "other" bucket for a chunk
1124 that is large enough. */
1125 pp = &(zone->free_chunks[0]);
1126 chunk = *pp;
1127 while (chunk && chunk->size < size)
1129 pp = &chunk->next_free;
1130 chunk = *pp;
1133 if (chunk)
1135 /* Remove the chunk from its previous bin. */
1136 *pp = chunk->next_free;
1138 result = (char *) chunk;
1140 /* Save the rest of the chunk for future allocation, if there's any
1141 left over. */
1142 csize = chunk->size;
1143 if (csize > size)
1145 if (zone->cached_free_size)
1146 free_chunk (zone->cached_free, zone->cached_free_size, zone);
1148 chunk = (struct alloc_chunk *) ((char *) result + size);
1149 zone->cached_free = (char *) chunk;
1150 zone->cached_free_size = csize - size;
1152 /* Mark the new free chunk as an object. */
1153 zone_set_object_alloc_bit (chunk);
1156 goto found;
1159 /* Handle large allocations. We could choose any threshold between
1160 GGC_PAGE_SIZE - sizeof (struct large_page_entry) and
1161 GGC_PAGE_SIZE. It can't be smaller, because then it wouldn't
1162 be guaranteed to have a unique entry in the lookup table. Large
1163 allocations will always fall through to here. */
1164 if (size > GGC_PAGE_SIZE)
1166 struct large_page_entry *entry = alloc_large_page (size, zone);
1168 #ifdef GATHER_STATISTICS
1169 entry->common.survived = 0;
1170 #endif
1172 entry->next = zone->large_pages;
1173 if (zone->large_pages)
1174 zone->large_pages->prev = entry;
1175 zone->large_pages = entry;
1177 result = entry->common.page;
1179 goto found;
1182 /* Failing everything above, allocate a new small page. */
1184 entry = alloc_small_page (zone);
1185 entry->next = zone->pages;
1186 zone->pages = entry;
1188 /* Mark the first chunk in the new page. */
1189 entry->alloc_bits[0] = 1;
1191 result = entry->common.page;
1192 if (size < SMALL_PAGE_SIZE)
1194 if (zone->cached_free_size)
1195 free_chunk (zone->cached_free, zone->cached_free_size, zone);
1197 zone->cached_free = (char *) result + size;
1198 zone->cached_free_size = SMALL_PAGE_SIZE - size;
1200 /* Mark the new free chunk as an object. */
1201 zone_set_object_alloc_bit (zone->cached_free);
1204 found:
1206 /* We could save TYPE in the chunk, but we don't use that for
1207 anything yet. If we wanted to, we could do it by adding it
1208 either before the beginning of the chunk or after its end,
1209 and adjusting the size and pointer appropriately. */
1211 /* We'll probably write to this after we return. */
1212 prefetchw (result);
1214 #ifdef ENABLE_GC_CHECKING
1215 /* `Poison' the entire allocated object. */
1216 VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (result, size));
1217 memset (result, 0xaf, size);
1218 VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (result + orig_size,
1219 size - orig_size));
1220 #endif
1222 /* Tell Valgrind that the memory is there, but its content isn't
1223 defined. The bytes at the end of the object are still marked
1224 unaccessible. */
1225 VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (result, orig_size));
1227 /* Keep track of how many bytes are being allocated. This
1228 information is used in deciding when to collect. */
1229 zone->allocated += size;
1231 timevar_ggc_mem_total += size;
1233 #ifdef GATHER_STATISTICS
1234 ggc_record_overhead (orig_size, size - orig_size, result PASS_MEM_STAT);
1237 size_t object_size = size;
1238 size_t overhead = object_size - orig_size;
1240 zone->stats.total_overhead += overhead;
1241 zone->stats.total_allocated += object_size;
1243 if (orig_size <= 32)
1245 zone->stats.total_overhead_under32 += overhead;
1246 zone->stats.total_allocated_under32 += object_size;
1248 if (orig_size <= 64)
1250 zone->stats.total_overhead_under64 += overhead;
1251 zone->stats.total_allocated_under64 += object_size;
1253 if (orig_size <= 128)
1255 zone->stats.total_overhead_under128 += overhead;
1256 zone->stats.total_allocated_under128 += object_size;
1259 #endif
1261 if (GGC_DEBUG_LEVEL >= 3)
1262 fprintf (G.debug_file, "Allocating object, size=%lu at %p\n",
1263 (unsigned long) size, result);
1265 return result;
1268 /* Allocate a SIZE of chunk memory of GTE type, into an appropriate zone
1269 for that type. */
1271 void *
1272 ggc_alloc_typed_stat (enum gt_types_enum gte, size_t size
1273 MEM_STAT_DECL)
1275 switch (gte)
1277 case gt_ggc_e_14lang_tree_node:
1278 return ggc_alloc_zone_pass_stat (size, &tree_zone);
1280 case gt_ggc_e_7rtx_def:
1281 return ggc_alloc_zone_pass_stat (size, &rtl_zone);
1283 case gt_ggc_e_9rtvec_def:
1284 return ggc_alloc_zone_pass_stat (size, &rtl_zone);
1286 default:
1287 return ggc_alloc_zone_pass_stat (size, &main_zone);
1291 /* Normal ggc_alloc simply allocates into the main zone. */
1293 void *
1294 ggc_alloc_stat (size_t size MEM_STAT_DECL)
1296 return ggc_alloc_zone_pass_stat (size, &main_zone);
1299 /* Poison the chunk. */
1300 #ifdef ENABLE_GC_CHECKING
1301 #define poison_region(PTR, SIZE) \
1302 memset ((PTR), 0xa5, (SIZE))
1303 #else
1304 #define poison_region(PTR, SIZE)
1305 #endif
1307 /* Free the object at P. */
1309 void
1310 ggc_free (void *p)
1312 struct page_entry *page;
1314 #ifdef GATHER_STATISTICS
1315 ggc_free_overhead (p);
1316 #endif
1318 poison_region (p, ggc_get_size (p));
1320 page = zone_get_object_page (p);
1322 if (page->large_p)
1324 struct large_page_entry *large_page
1325 = (struct large_page_entry *) page;
1327 /* Remove the page from the linked list. */
1328 if (large_page->prev)
1329 large_page->prev->next = large_page->next;
1330 else
1332 gcc_assert (large_page->common.zone->large_pages == large_page);
1333 large_page->common.zone->large_pages = large_page->next;
1335 if (large_page->next)
1336 large_page->next->prev = large_page->prev;
1338 large_page->common.zone->allocated -= large_page->bytes;
1340 /* Release the memory associated with this object. */
1341 free_large_page (large_page);
1343 else if (page->pch_p)
1344 /* Don't do anything. We won't allocate a new object from the
1345 PCH zone so there's no point in releasing anything. */
1347 else
1349 size_t size = ggc_get_size (p);
1351 page->zone->allocated -= size;
1353 /* Add the chunk to the free list. We don't bother with coalescing,
1354 since we are likely to want a chunk of this size again. */
1355 free_chunk (p, size, page->zone);
1359 /* If P is not marked, mark it and return false. Otherwise return true.
1360 P must have been allocated by the GC allocator; it mustn't point to
1361 static objects, stack variables, or memory allocated with malloc. */
1364 ggc_set_mark (const void *p)
1366 struct page_entry *page;
1367 const char *ptr = (const char *) p;
1369 page = zone_get_object_page (p);
1371 if (page->pch_p)
1373 size_t mark_word, mark_bit, offset;
1374 offset = (ptr - pch_zone.page) / BYTES_PER_MARK_BIT;
1375 mark_word = offset / (8 * sizeof (mark_type));
1376 mark_bit = offset % (8 * sizeof (mark_type));
1378 if (pch_zone.mark_bits[mark_word] & (1 << mark_bit))
1379 return 1;
1380 pch_zone.mark_bits[mark_word] |= (1 << mark_bit);
1382 else if (page->large_p)
1384 struct large_page_entry *large_page
1385 = (struct large_page_entry *) page;
1387 if (large_page->mark_p)
1388 return 1;
1389 large_page->mark_p = true;
1391 else
1393 struct small_page_entry *small_page
1394 = (struct small_page_entry *) page;
1396 if (small_page->mark_bits[zone_get_object_mark_word (p)]
1397 & (1 << zone_get_object_mark_bit (p)))
1398 return 1;
1399 small_page->mark_bits[zone_get_object_mark_word (p)]
1400 |= (1 << zone_get_object_mark_bit (p));
1403 if (GGC_DEBUG_LEVEL >= 4)
1404 fprintf (G.debug_file, "Marking %p\n", p);
1406 return 0;
1409 /* Return 1 if P has been marked, zero otherwise.
1410 P must have been allocated by the GC allocator; it mustn't point to
1411 static objects, stack variables, or memory allocated with malloc. */
1414 ggc_marked_p (const void *p)
1416 struct page_entry *page;
1417 const char *ptr = p;
1419 page = zone_get_object_page (p);
1421 if (page->pch_p)
1423 size_t mark_word, mark_bit, offset;
1424 offset = (ptr - pch_zone.page) / BYTES_PER_MARK_BIT;
1425 mark_word = offset / (8 * sizeof (mark_type));
1426 mark_bit = offset % (8 * sizeof (mark_type));
1428 return (pch_zone.mark_bits[mark_word] & (1 << mark_bit)) != 0;
1431 if (page->large_p)
1433 struct large_page_entry *large_page
1434 = (struct large_page_entry *) page;
1436 return large_page->mark_p;
1438 else
1440 struct small_page_entry *small_page
1441 = (struct small_page_entry *) page;
1443 return 0 != (small_page->mark_bits[zone_get_object_mark_word (p)]
1444 & (1 << zone_get_object_mark_bit (p)));
1448 /* Return the size of the gc-able object P. */
1450 size_t
1451 ggc_get_size (const void *p)
1453 struct page_entry *page;
1454 const char *ptr = (const char *) p;
1456 page = zone_get_object_page (p);
1458 if (page->pch_p)
1460 size_t alloc_word, alloc_bit, offset, max_size;
1461 offset = (ptr - pch_zone.page) / BYTES_PER_ALLOC_BIT + 1;
1462 alloc_word = offset / (8 * sizeof (alloc_type));
1463 alloc_bit = offset % (8 * sizeof (alloc_type));
1464 max_size = pch_zone.bytes - (ptr - pch_zone.page);
1465 return zone_object_size_1 (pch_zone.alloc_bits, alloc_word, alloc_bit,
1466 max_size);
1469 if (page->large_p)
1470 return ((struct large_page_entry *)page)->bytes;
1471 else
1472 return zone_find_object_size ((struct small_page_entry *) page, p);
1475 /* Initialize the ggc-zone-mmap allocator. */
1476 void
1477 init_ggc (void)
1479 /* The allocation size must be greater than BYTES_PER_MARK_BIT, and
1480 a multiple of both BYTES_PER_ALLOC_BIT and FREE_BIN_DELTA, for
1481 the current assumptions to hold. */
1483 gcc_assert (FREE_BIN_DELTA == MAX_ALIGNMENT);
1485 /* Set up the main zone by hand. */
1486 main_zone.name = "Main zone";
1487 G.zones = &main_zone;
1489 /* Allocate the default zones. */
1490 new_ggc_zone_1 (&rtl_zone, "RTL zone");
1491 new_ggc_zone_1 (&tree_zone, "Tree zone");
1492 new_ggc_zone_1 (&tree_id_zone, "Tree identifier zone");
1494 G.pagesize = getpagesize();
1495 G.lg_pagesize = exact_log2 (G.pagesize);
1496 G.page_mask = ~(G.pagesize - 1);
1498 /* Require the system page size to be a multiple of GGC_PAGE_SIZE. */
1499 gcc_assert ((G.pagesize & (GGC_PAGE_SIZE - 1)) == 0);
1501 /* Allocate 16 system pages at a time. */
1502 G.quire_size = 16 * G.pagesize / GGC_PAGE_SIZE;
1504 /* Calculate the size of the allocation bitmap and other overhead. */
1505 /* Right now we allocate bits for the page header and bitmap. These
1506 are wasted, but a little tricky to eliminate. */
1507 G.small_page_overhead
1508 = PAGE_OVERHEAD + (GGC_PAGE_SIZE / BYTES_PER_ALLOC_BIT / 8);
1509 /* G.small_page_overhead = ROUND_UP (G.small_page_overhead, MAX_ALIGNMENT); */
1511 #ifdef HAVE_MMAP_DEV_ZERO
1512 G.dev_zero_fd = open ("/dev/zero", O_RDONLY);
1513 gcc_assert (G.dev_zero_fd != -1);
1514 #endif
1516 #if 0
1517 G.debug_file = fopen ("ggc-mmap.debug", "w");
1518 setlinebuf (G.debug_file);
1519 #else
1520 G.debug_file = stdout;
1521 #endif
1523 #ifdef USING_MMAP
1524 /* StunOS has an amazing off-by-one error for the first mmap allocation
1525 after fiddling with RLIMIT_STACK. The result, as hard as it is to
1526 believe, is an unaligned page allocation, which would cause us to
1527 hork badly if we tried to use it. */
1529 char *p = alloc_anon (NULL, G.pagesize, &main_zone);
1530 struct small_page_entry *e;
1531 if ((size_t)p & (G.pagesize - 1))
1533 /* How losing. Discard this one and try another. If we still
1534 can't get something useful, give up. */
1536 p = alloc_anon (NULL, G.pagesize, &main_zone);
1537 gcc_assert (!((size_t)p & (G.pagesize - 1)));
1540 if (GGC_PAGE_SIZE == G.pagesize)
1542 /* We have a good page, might as well hold onto it... */
1543 e = xcalloc (1, G.small_page_overhead);
1544 e->common.page = p;
1545 e->common.zone = &main_zone;
1546 e->next = main_zone.free_pages;
1547 set_page_table_entry (e->common.page, &e->common);
1548 main_zone.free_pages = e;
1550 else
1552 munmap (p, G.pagesize);
1555 #endif
1558 /* Start a new GGC zone. */
1560 static void
1561 new_ggc_zone_1 (struct alloc_zone *new_zone, const char * name)
1563 new_zone->name = name;
1564 new_zone->next_zone = G.zones->next_zone;
1565 G.zones->next_zone = new_zone;
1568 struct alloc_zone *
1569 new_ggc_zone (const char * name)
1571 struct alloc_zone *new_zone = xcalloc (1, sizeof (struct alloc_zone));
1572 new_ggc_zone_1 (new_zone, name);
1573 return new_zone;
1576 /* Destroy a GGC zone. */
1577 void
1578 destroy_ggc_zone (struct alloc_zone * dead_zone)
1580 struct alloc_zone *z;
1582 for (z = G.zones; z && z->next_zone != dead_zone; z = z->next_zone)
1583 /* Just find that zone. */
1584 continue;
1586 /* We should have found the zone in the list. Anything else is fatal. */
1587 gcc_assert (z);
1589 /* z is dead, baby. z is dead. */
1590 z->dead = true;
1593 /* Free all empty pages and objects within a page for a given zone */
1595 static void
1596 sweep_pages (struct alloc_zone *zone)
1598 struct large_page_entry **lpp, *lp, *lnext;
1599 struct small_page_entry **spp, *sp, *snext;
1600 char *last_free;
1601 size_t allocated = 0;
1602 bool nomarksinpage;
1604 /* First, reset the free_chunks lists, since we are going to
1605 re-free free chunks in hopes of coalescing them into large chunks. */
1606 memset (zone->free_chunks, 0, sizeof (zone->free_chunks));
1607 zone->high_free_bin = 0;
1608 zone->cached_free = NULL;
1609 zone->cached_free_size = 0;
1611 /* Large pages are all or none affairs. Either they are completely
1612 empty, or they are completely full. */
1613 lpp = &zone->large_pages;
1614 for (lp = zone->large_pages; lp != NULL; lp = lnext)
1616 gcc_assert (lp->common.large_p);
1618 lnext = lp->next;
1620 #ifdef GATHER_STATISTICS
1621 /* This page has now survived another collection. */
1622 lp->common.survived++;
1623 #endif
1625 if (lp->mark_p)
1627 lp->mark_p = false;
1628 allocated += lp->bytes;
1629 lpp = &lp->next;
1631 else
1633 *lpp = lnext;
1634 #ifdef ENABLE_GC_CHECKING
1635 /* Poison the page. */
1636 memset (lp->common.page, 0xb5, SMALL_PAGE_SIZE);
1637 #endif
1638 if (lp->prev)
1639 lp->prev->next = lp->next;
1640 if (lp->next)
1641 lp->next->prev = lp->prev;
1642 free_large_page (lp);
1646 spp = &zone->pages;
1647 for (sp = zone->pages; sp != NULL; sp = snext)
1649 char *object, *last_object;
1650 char *end;
1651 alloc_type *alloc_word_p;
1652 mark_type *mark_word_p;
1654 gcc_assert (!sp->common.large_p);
1656 snext = sp->next;
1658 #ifdef GATHER_STATISTICS
1659 /* This page has now survived another collection. */
1660 sp->common.survived++;
1661 #endif
1663 /* Step through all chunks, consolidate those that are free and
1664 insert them into the free lists. Note that consolidation
1665 slows down collection slightly. */
1667 last_object = object = sp->common.page;
1668 end = sp->common.page + SMALL_PAGE_SIZE;
1669 last_free = NULL;
1670 nomarksinpage = true;
1671 mark_word_p = sp->mark_bits;
1672 alloc_word_p = sp->alloc_bits;
1674 gcc_assert (BYTES_PER_ALLOC_BIT == BYTES_PER_MARK_BIT);
1676 object = sp->common.page;
1679 unsigned int i, n;
1680 alloc_type alloc_word;
1681 mark_type mark_word;
1683 alloc_word = *alloc_word_p++;
1684 mark_word = *mark_word_p++;
1686 if (mark_word)
1687 nomarksinpage = false;
1689 /* There ought to be some way to do this without looping... */
1690 i = 0;
1691 while ((n = alloc_ffs (alloc_word)) != 0)
1693 /* Extend the current state for n - 1 bits. We can't
1694 shift alloc_word by n, even though it isn't used in the
1695 loop, in case only the highest bit was set. */
1696 alloc_word >>= n - 1;
1697 mark_word >>= n - 1;
1698 object += BYTES_PER_MARK_BIT * (n - 1);
1700 if (mark_word & 1)
1702 if (last_free)
1704 VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (last_free,
1705 object
1706 - last_free));
1707 poison_region (last_free, object - last_free);
1708 free_chunk (last_free, object - last_free, zone);
1709 last_free = NULL;
1711 else
1712 allocated += object - last_object;
1713 last_object = object;
1715 else
1717 if (last_free == NULL)
1719 last_free = object;
1720 allocated += object - last_object;
1722 else
1723 zone_clear_object_alloc_bit (sp, object);
1726 /* Shift to just after the alloc bit we handled. */
1727 alloc_word >>= 1;
1728 mark_word >>= 1;
1729 object += BYTES_PER_MARK_BIT;
1731 i += n;
1734 object += BYTES_PER_MARK_BIT * (8 * sizeof (alloc_type) - i);
1736 while (object < end);
1738 if (nomarksinpage)
1740 *spp = snext;
1741 #ifdef ENABLE_GC_CHECKING
1742 VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (sp->common.page, SMALL_PAGE_SIZE));
1743 /* Poison the page. */
1744 memset (sp->common.page, 0xb5, SMALL_PAGE_SIZE);
1745 #endif
1746 free_small_page (sp);
1747 continue;
1749 else if (last_free)
1751 VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (last_free,
1752 object - last_free));
1753 poison_region (last_free, object - last_free);
1754 free_chunk (last_free, object - last_free, zone);
1756 else
1757 allocated += object - last_object;
1759 spp = &sp->next;
1762 zone->allocated = allocated;
1765 /* mark-and-sweep routine for collecting a single zone. NEED_MARKING
1766 is true if we need to mark before sweeping, false if some other
1767 zone collection has already performed marking for us. Returns true
1768 if we collected, false otherwise. */
1770 static bool
1771 ggc_collect_1 (struct alloc_zone *zone, bool need_marking)
1773 #if 0
1774 /* */
1776 int i;
1777 for (i = 0; i < NUM_FREE_BINS + 1; i++)
1779 struct alloc_chunk *chunk;
1780 int n, tot;
1782 n = 0;
1783 tot = 0;
1784 chunk = zone->free_chunks[i];
1785 while (chunk)
1787 n++;
1788 tot += chunk->size;
1789 chunk = chunk->next_free;
1791 fprintf (stderr, "Bin %d: %d free chunks (%d bytes)\n",
1792 i, n, tot);
1795 /* */
1796 #endif
1798 if (!quiet_flag)
1799 fprintf (stderr, " {%s GC %luk -> ",
1800 zone->name, (unsigned long) zone->allocated / 1024);
1802 /* Zero the total allocated bytes. This will be recalculated in the
1803 sweep phase. */
1804 zone->allocated = 0;
1806 /* Release the pages we freed the last time we collected, but didn't
1807 reuse in the interim. */
1808 release_pages (zone);
1810 if (need_marking)
1812 zone_allocate_marks ();
1813 ggc_mark_roots ();
1814 #ifdef GATHER_STATISTICS
1815 ggc_prune_overhead_list ();
1816 #endif
1819 sweep_pages (zone);
1820 zone->was_collected = true;
1821 zone->allocated_last_gc = zone->allocated;
1823 if (!quiet_flag)
1824 fprintf (stderr, "%luk}", (unsigned long) zone->allocated / 1024);
1825 return true;
1828 #ifdef GATHER_STATISTICS
1829 /* Calculate the average page survival rate in terms of number of
1830 collections. */
1832 static float
1833 calculate_average_page_survival (struct alloc_zone *zone)
1835 float count = 0.0;
1836 float survival = 0.0;
1837 struct small_page_entry *p;
1838 struct large_page_entry *lp;
1839 for (p = zone->pages; p; p = p->next)
1841 count += 1.0;
1842 survival += p->common.survived;
1844 for (lp = zone->large_pages; lp; lp = lp->next)
1846 count += 1.0;
1847 survival += lp->common.survived;
1849 return survival/count;
1851 #endif
1853 /* Top level collection routine. */
1855 void
1856 ggc_collect (void)
1858 struct alloc_zone *zone;
1859 bool marked = false;
1861 timevar_push (TV_GC);
1863 if (!ggc_force_collect)
1865 float allocated_last_gc = 0, allocated = 0, min_expand;
1867 for (zone = G.zones; zone; zone = zone->next_zone)
1869 allocated_last_gc += zone->allocated_last_gc;
1870 allocated += zone->allocated;
1873 allocated_last_gc =
1874 MAX (allocated_last_gc,
1875 (size_t) PARAM_VALUE (GGC_MIN_HEAPSIZE) * 1024);
1876 min_expand = allocated_last_gc * PARAM_VALUE (GGC_MIN_EXPAND) / 100;
1878 if (allocated < allocated_last_gc + min_expand)
1880 timevar_pop (TV_GC);
1881 return;
1885 /* Start by possibly collecting the main zone. */
1886 main_zone.was_collected = false;
1887 marked |= ggc_collect_1 (&main_zone, true);
1889 /* In order to keep the number of collections down, we don't
1890 collect other zones unless we are collecting the main zone. This
1891 gives us roughly the same number of collections as we used to
1892 have with the old gc. The number of collection is important
1893 because our main slowdown (according to profiling) is now in
1894 marking. So if we mark twice as often as we used to, we'll be
1895 twice as slow. Hopefully we'll avoid this cost when we mark
1896 zone-at-a-time. */
1897 /* NOTE drow/2004-07-28: We now always collect the main zone, but
1898 keep this code in case the heuristics are further refined. */
1900 if (main_zone.was_collected)
1902 struct alloc_zone *zone;
1904 for (zone = main_zone.next_zone; zone; zone = zone->next_zone)
1906 zone->was_collected = false;
1907 marked |= ggc_collect_1 (zone, !marked);
1911 #ifdef GATHER_STATISTICS
1912 /* Print page survival stats, if someone wants them. */
1913 if (GGC_DEBUG_LEVEL >= 2)
1915 for (zone = G.zones; zone; zone = zone->next_zone)
1917 if (zone->was_collected)
1919 float f = calculate_average_page_survival (zone);
1920 printf ("Average page survival in zone `%s' is %f\n",
1921 zone->name, f);
1925 #endif
1927 if (marked)
1928 zone_free_marks ();
1930 /* Free dead zones. */
1931 for (zone = G.zones; zone && zone->next_zone; zone = zone->next_zone)
1933 if (zone->next_zone->dead)
1935 struct alloc_zone *dead_zone = zone->next_zone;
1937 printf ("Zone `%s' is dead and will be freed.\n", dead_zone->name);
1939 /* The zone must be empty. */
1940 gcc_assert (!dead_zone->allocated);
1942 /* Unchain the dead zone, release all its pages and free it. */
1943 zone->next_zone = zone->next_zone->next_zone;
1944 release_pages (dead_zone);
1945 free (dead_zone);
1949 timevar_pop (TV_GC);
1952 /* Print allocation statistics. */
1953 #define SCALE(x) ((unsigned long) ((x) < 1024*10 \
1954 ? (x) \
1955 : ((x) < 1024*1024*10 \
1956 ? (x) / 1024 \
1957 : (x) / (1024*1024))))
1958 #define LABEL(x) ((x) < 1024*10 ? ' ' : ((x) < 1024*1024*10 ? 'k' : 'M'))
1960 void
1961 ggc_print_statistics (void)
1963 struct alloc_zone *zone;
1964 struct ggc_statistics stats;
1965 size_t total_overhead = 0, total_allocated = 0, total_bytes_mapped = 0;
1966 size_t pte_overhead, i;
1968 /* Clear the statistics. */
1969 memset (&stats, 0, sizeof (stats));
1971 /* Make sure collection will really occur. */
1972 ggc_force_collect = true;
1974 /* Collect and print the statistics common across collectors. */
1975 ggc_print_common_statistics (stderr, &stats);
1977 ggc_force_collect = false;
1979 /* Release free pages so that we will not count the bytes allocated
1980 there as part of the total allocated memory. */
1981 for (zone = G.zones; zone; zone = zone->next_zone)
1982 release_pages (zone);
1984 /* Collect some information about the various sizes of
1985 allocation. */
1986 fprintf (stderr,
1987 "Memory still allocated at the end of the compilation process\n");
1989 fprintf (stderr, "%20s %10s %10s %10s\n",
1990 "Zone", "Allocated", "Used", "Overhead");
1991 for (zone = G.zones; zone; zone = zone->next_zone)
1993 struct large_page_entry *large_page;
1994 size_t overhead, allocated, in_use;
1996 /* Skip empty zones. */
1997 if (!zone->pages && !zone->large_pages)
1998 continue;
2000 allocated = in_use = 0;
2002 overhead = sizeof (struct alloc_zone);
2004 for (large_page = zone->large_pages; large_page != NULL;
2005 large_page = large_page->next)
2007 allocated += large_page->bytes;
2008 in_use += large_page->bytes;
2009 overhead += sizeof (struct large_page_entry);
2012 /* There's no easy way to walk through the small pages finding
2013 used and unused objects. Instead, add all the pages, and
2014 subtract out the free list. */
2016 allocated += GGC_PAGE_SIZE * zone->n_small_pages;
2017 in_use += GGC_PAGE_SIZE * zone->n_small_pages;
2018 overhead += G.small_page_overhead * zone->n_small_pages;
2020 for (i = 0; i <= NUM_FREE_BINS; i++)
2022 struct alloc_chunk *chunk = zone->free_chunks[i];
2023 while (chunk)
2025 in_use -= ggc_get_size (chunk);
2026 chunk = chunk->next_free;
2030 fprintf (stderr, "%20s %10lu%c %10lu%c %10lu%c\n",
2031 zone->name,
2032 SCALE (allocated), LABEL (allocated),
2033 SCALE (in_use), LABEL (in_use),
2034 SCALE (overhead), LABEL (overhead));
2036 gcc_assert (in_use == zone->allocated);
2038 total_overhead += overhead;
2039 total_allocated += zone->allocated;
2040 total_bytes_mapped += zone->bytes_mapped;
2043 /* Count the size of the page table as best we can. */
2044 #if HOST_BITS_PER_PTR <= 32
2045 pte_overhead = sizeof (G.lookup);
2046 for (i = 0; i < PAGE_L1_SIZE; i++)
2047 if (G.lookup[i])
2048 pte_overhead += PAGE_L2_SIZE * sizeof (struct page_entry *);
2049 #else
2051 page_table table = G.lookup;
2052 pte_overhead = 0;
2053 while (table)
2055 pte_overhead += sizeof (*table);
2056 for (i = 0; i < PAGE_L1_SIZE; i++)
2057 if (table->table[i])
2058 pte_overhead += PAGE_L2_SIZE * sizeof (struct page_entry *);
2059 table = table->next;
2062 #endif
2063 fprintf (stderr, "%20s %11s %11s %10lu%c\n", "Page Table",
2064 "", "", SCALE (pte_overhead), LABEL (pte_overhead));
2065 total_overhead += pte_overhead;
2067 fprintf (stderr, "%20s %10lu%c %10lu%c %10lu%c\n", "Total",
2068 SCALE (total_bytes_mapped), LABEL (total_bytes_mapped),
2069 SCALE (total_allocated), LABEL(total_allocated),
2070 SCALE (total_overhead), LABEL (total_overhead));
2072 #ifdef GATHER_STATISTICS
2074 unsigned long long all_overhead = 0, all_allocated = 0;
2075 unsigned long long all_overhead_under32 = 0, all_allocated_under32 = 0;
2076 unsigned long long all_overhead_under64 = 0, all_allocated_under64 = 0;
2077 unsigned long long all_overhead_under128 = 0, all_allocated_under128 = 0;
2079 fprintf (stderr, "\nTotal allocations and overheads during the compilation process\n");
2081 for (zone = G.zones; zone; zone = zone->next_zone)
2083 all_overhead += zone->stats.total_overhead;
2084 all_allocated += zone->stats.total_allocated;
2086 all_allocated_under32 += zone->stats.total_allocated_under32;
2087 all_overhead_under32 += zone->stats.total_overhead_under32;
2089 all_allocated_under64 += zone->stats.total_allocated_under64;
2090 all_overhead_under64 += zone->stats.total_overhead_under64;
2092 all_allocated_under128 += zone->stats.total_allocated_under128;
2093 all_overhead_under128 += zone->stats.total_overhead_under128;
2095 fprintf (stderr, "%20s: %10lld\n",
2096 zone->name, zone->stats.total_allocated);
2099 fprintf (stderr, "\n");
2101 fprintf (stderr, "Total Overhead: %10lld\n",
2102 all_overhead);
2103 fprintf (stderr, "Total Allocated: %10lld\n",
2104 all_allocated);
2106 fprintf (stderr, "Total Overhead under 32B: %10lld\n",
2107 all_overhead_under32);
2108 fprintf (stderr, "Total Allocated under 32B: %10lld\n",
2109 all_allocated_under32);
2110 fprintf (stderr, "Total Overhead under 64B: %10lld\n",
2111 all_overhead_under64);
2112 fprintf (stderr, "Total Allocated under 64B: %10lld\n",
2113 all_allocated_under64);
2114 fprintf (stderr, "Total Overhead under 128B: %10lld\n",
2115 all_overhead_under128);
2116 fprintf (stderr, "Total Allocated under 128B: %10lld\n",
2117 all_allocated_under128);
2119 #endif
2122 /* Precompiled header support. */
2124 /* For precompiled headers, we sort objects based on their type. We
2125 also sort various objects into their own buckets; currently this
2126 covers strings and IDENTIFIER_NODE trees. The choices of how
2127 to sort buckets have not yet been tuned. */
2129 #define NUM_PCH_BUCKETS (gt_types_enum_last + 3)
2131 #define OTHER_BUCKET (gt_types_enum_last + 0)
2132 #define IDENTIFIER_BUCKET (gt_types_enum_last + 1)
2133 #define STRING_BUCKET (gt_types_enum_last + 2)
2135 struct ggc_pch_ondisk
2137 size_t total;
2138 size_t type_totals[NUM_PCH_BUCKETS];
2141 struct ggc_pch_data
2143 struct ggc_pch_ondisk d;
2144 size_t base;
2145 size_t orig_base;
2146 size_t alloc_size;
2147 alloc_type *alloc_bits;
2148 size_t type_bases[NUM_PCH_BUCKETS];
2149 size_t start_offset;
2152 /* Initialize the PCH data structure. */
2154 struct ggc_pch_data *
2155 init_ggc_pch (void)
2157 return xcalloc (sizeof (struct ggc_pch_data), 1);
2160 /* Return which of the page-aligned buckets the object at X, with type
2161 TYPE, should be sorted into in the PCH. Strings will have
2162 IS_STRING set and TYPE will be gt_types_enum_last. Other objects
2163 of unknown type will also have TYPE equal to gt_types_enum_last. */
2165 static int
2166 pch_bucket (void *x, enum gt_types_enum type,
2167 bool is_string)
2169 /* Sort identifiers into their own bucket, to improve locality
2170 when searching the identifier hash table. */
2171 if (type == gt_ggc_e_14lang_tree_node
2172 && TREE_CODE ((tree) x) == IDENTIFIER_NODE)
2173 return IDENTIFIER_BUCKET;
2174 else if (type == gt_types_enum_last)
2176 if (is_string)
2177 return STRING_BUCKET;
2178 return OTHER_BUCKET;
2180 return type;
2183 /* Add the size of object X to the size of the PCH data. */
2185 void
2186 ggc_pch_count_object (struct ggc_pch_data *d, void *x ATTRIBUTE_UNUSED,
2187 size_t size, bool is_string, enum gt_types_enum type)
2189 /* NOTE: Right now we don't need to align up the size of any objects.
2190 Strings can be unaligned, and everything else is allocated to a
2191 MAX_ALIGNMENT boundary already. */
2193 d->d.type_totals[pch_bucket (x, type, is_string)] += size;
2196 /* Return the total size of the PCH data. */
2198 size_t
2199 ggc_pch_total_size (struct ggc_pch_data *d)
2201 enum gt_types_enum i;
2202 size_t alloc_size, total_size;
2204 total_size = 0;
2205 for (i = 0; i < NUM_PCH_BUCKETS; i++)
2207 d->d.type_totals[i] = ROUND_UP (d->d.type_totals[i], GGC_PAGE_SIZE);
2208 total_size += d->d.type_totals[i];
2210 d->d.total = total_size;
2212 /* Include the size of the allocation bitmap. */
2213 alloc_size = CEIL (d->d.total, BYTES_PER_ALLOC_BIT * 8);
2214 alloc_size = ROUND_UP (alloc_size, MAX_ALIGNMENT);
2215 d->alloc_size = alloc_size;
2217 return d->d.total + alloc_size;
2220 /* Set the base address for the objects in the PCH file. */
2222 void
2223 ggc_pch_this_base (struct ggc_pch_data *d, void *base_)
2225 int i;
2226 size_t base = (size_t) base_;
2228 d->base = d->orig_base = base;
2229 for (i = 0; i < NUM_PCH_BUCKETS; i++)
2231 d->type_bases[i] = base;
2232 base += d->d.type_totals[i];
2235 if (d->alloc_bits == NULL)
2236 d->alloc_bits = xcalloc (1, d->alloc_size);
2239 /* Allocate a place for object X of size SIZE in the PCH file. */
2241 char *
2242 ggc_pch_alloc_object (struct ggc_pch_data *d, void *x,
2243 size_t size, bool is_string,
2244 enum gt_types_enum type)
2246 size_t alloc_word, alloc_bit;
2247 char *result;
2248 int bucket = pch_bucket (x, type, is_string);
2250 /* Record the start of the object in the allocation bitmap. We
2251 can't assert that the allocation bit is previously clear, because
2252 strings may violate the invariant that they are at least
2253 BYTES_PER_ALLOC_BIT long. This is harmless - ggc_get_size
2254 should not be called for strings. */
2255 alloc_word = ((d->type_bases[bucket] - d->orig_base)
2256 / (8 * sizeof (alloc_type) * BYTES_PER_ALLOC_BIT));
2257 alloc_bit = ((d->type_bases[bucket] - d->orig_base)
2258 / BYTES_PER_ALLOC_BIT) % (8 * sizeof (alloc_type));
2259 d->alloc_bits[alloc_word] |= 1L << alloc_bit;
2261 /* Place the object at the current pointer for this bucket. */
2262 result = (char *) d->type_bases[bucket];
2263 d->type_bases[bucket] += size;
2264 return result;
2267 /* Prepare to write out the PCH data to file F. */
2269 void
2270 ggc_pch_prepare_write (struct ggc_pch_data *d,
2271 FILE *f)
2273 /* We seek around a lot while writing. Record where the end
2274 of the padding in the PCH file is, so that we can
2275 locate each object's offset. */
2276 d->start_offset = ftell (f);
2279 /* Write out object X of SIZE to file F. */
2281 void
2282 ggc_pch_write_object (struct ggc_pch_data *d,
2283 FILE *f, void *x, void *newx,
2284 size_t size, bool is_string ATTRIBUTE_UNUSED)
2286 if (fseek (f, (size_t) newx - d->orig_base + d->start_offset, SEEK_SET) != 0)
2287 fatal_error ("can't seek PCH file: %m");
2289 if (fwrite (x, size, 1, f) != 1)
2290 fatal_error ("can't write PCH file: %m");
2293 void
2294 ggc_pch_finish (struct ggc_pch_data *d, FILE *f)
2296 /* Write out the allocation bitmap. */
2297 if (fseek (f, d->start_offset + d->d.total, SEEK_SET) != 0)
2298 fatal_error ("can't seek PCH file: %m");
2300 if (fwrite (d->alloc_bits, d->alloc_size, 1, f) != 1)
2301 fatal_error ("can't write PCH fle: %m");
2303 /* Done with the PCH, so write out our footer. */
2304 if (fwrite (&d->d, sizeof (d->d), 1, f) != 1)
2305 fatal_error ("can't write PCH file: %m");
2307 free (d->alloc_bits);
2308 free (d);
2311 /* The PCH file from F has been mapped at ADDR. Read in any
2312 additional data from the file and set up the GC state. */
2314 void
2315 ggc_pch_read (FILE *f, void *addr)
2317 struct ggc_pch_ondisk d;
2318 size_t alloc_size;
2319 struct alloc_zone *zone;
2320 struct page_entry *pch_page;
2321 char *p;
2323 if (fread (&d, sizeof (d), 1, f) != 1)
2324 fatal_error ("can't read PCH file: %m");
2326 alloc_size = CEIL (d.total, BYTES_PER_ALLOC_BIT * 8);
2327 alloc_size = ROUND_UP (alloc_size, MAX_ALIGNMENT);
2329 pch_zone.bytes = d.total;
2330 pch_zone.alloc_bits = (alloc_type *) ((char *) addr + pch_zone.bytes);
2331 pch_zone.page = (char *) addr;
2332 pch_zone.end = (char *) pch_zone.alloc_bits;
2334 /* We've just read in a PCH file. So, every object that used to be
2335 allocated is now free. */
2336 for (zone = G.zones; zone; zone = zone->next_zone)
2338 struct small_page_entry *page, *next_page;
2339 struct large_page_entry *large_page, *next_large_page;
2341 zone->allocated = 0;
2343 /* Clear the zone's free chunk list. */
2344 memset (zone->free_chunks, 0, sizeof (zone->free_chunks));
2345 zone->high_free_bin = 0;
2346 zone->cached_free = NULL;
2347 zone->cached_free_size = 0;
2349 /* Move all the small pages onto the free list. */
2350 for (page = zone->pages; page != NULL; page = next_page)
2352 next_page = page->next;
2353 memset (page->alloc_bits, 0,
2354 G.small_page_overhead - PAGE_OVERHEAD);
2355 free_small_page (page);
2358 /* Discard all the large pages. */
2359 for (large_page = zone->large_pages; large_page != NULL;
2360 large_page = next_large_page)
2362 next_large_page = large_page->next;
2363 free_large_page (large_page);
2366 zone->pages = NULL;
2367 zone->large_pages = NULL;
2370 /* Allocate the dummy page entry for the PCH, and set all pages
2371 mapped into the PCH to reference it. */
2372 pch_page = xcalloc (1, sizeof (struct page_entry));
2373 pch_page->page = pch_zone.page;
2374 pch_page->pch_p = true;
2376 for (p = pch_zone.page; p < pch_zone.end; p += GGC_PAGE_SIZE)
2377 set_page_table_entry (p, pch_page);