OSDN Git Service

PR target/33286
[pf3gnuchains/gcc-fork.git] / gcc / ggc-zone.c
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.
4
5    Contributed by Richard Henderson (rth@redhat.com) and Daniel Berlin
6    (dberlin@dberlin.org).  Rewritten by Daniel Jacobowitz
7    <dan@codesourcery.com>.
8
9 This file is part of GCC.
10
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.
15
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.
20
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/>.  */
24
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"
39
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
54
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
59
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
69
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
77
78 #ifndef USING_MMAP
79 #error Zone collector requires mmap
80 #endif
81
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
89
90 /* FUTURE NOTES:
91
92    If we track inter-zone pointers, we can mark single zones at a
93    time.
94
95    If we have a zone where we guarantee no inter-zone pointers, we
96    could mark that zone separately.
97
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.  */
101
102 /* Strategy:
103
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.
107
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.
115
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.  */
120
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)
128
129 #ifndef HOST_BITS_PER_PTR
130 #define HOST_BITS_PER_PTR  HOST_BITS_PER_LONG
131 #endif
132
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.  */
137
138 struct alloc_chunk {
139   struct alloc_chunk *next_free;
140   unsigned int size;
141 };
142
143 /* The size of the fixed-size portion of a small page descriptor.  */
144 #define PAGE_OVERHEAD   (offsetof (struct small_page_entry, alloc_bits))
145
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.
150
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
156
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
163
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
168
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... */
172
173 /* FIXME: We can't use anything but MAX_ALIGNMENT for the bin size
174    today.  */
175
176 #define NUM_FREE_BINS           64
177 #define FREE_BIN_DELTA          MAX_ALIGNMENT
178 #define SIZE_BIN_DOWN(SIZE)     ((SIZE) / FREE_BIN_DELTA)
179
180 /* Allocation and marking parameters.  */
181
182 /* The smallest allocatable unit to keep track of.  */
183 #define BYTES_PER_ALLOC_BIT     MAX_ALIGNMENT
184
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
190
191 #define BYTES_PER_MARK_WORD     (8 * BYTES_PER_MARK_BIT * sizeof (mark_type))
192
193 /* We use this structure to determine the alignment required for
194    allocations.
195
196    There are several things wrong with this estimation of alignment.
197
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).
203
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.  */
209
210 struct max_alignment {
211   char c;
212   union {
213     HOST_WIDEST_INT i;
214     double d;
215   } u;
216 };
217
218 /* The biggest alignment required.  */
219
220 #define MAX_ALIGNMENT (offsetof (struct max_alignment, u))
221
222 /* Compute the smallest multiple of F that is >= X.  */
223
224 #define ROUND_UP(x, f) (CEIL (x, f) * (f))
225
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.  */
229
230 typedef unsigned int alloc_type;
231 typedef unsigned int mark_type;
232 #define alloc_ffs(x) ffs(x)
233
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
238 {
239   /* The address at which the memory is allocated.  */
240   char *page;
241
242   /* The zone that this page entry belongs to.  */
243   struct alloc_zone *zone;
244
245 #ifdef GATHER_STATISTICS
246   /* How many collections we've survived.  */
247   size_t survived;
248 #endif
249
250   /* Does this page contain small objects, or one large object?  */
251   bool large_p;
252
253   /* Is this page part of the loaded PCH?  */
254   bool pch_p;
255 } page_entry;
256
257 /* Additional data needed for small pages.  */
258 struct small_page_entry
259 {
260   struct page_entry common;
261
262   /* The next small page entry, or NULL if this is the last.  */
263   struct small_page_entry *next;
264
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;
269
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];
273 };
274
275 /* Additional data needed for large pages.  */
276 struct large_page_entry
277 {
278   struct page_entry common;
279
280   /* The next large page entry, or NULL if this is the last.  */
281   struct large_page_entry *next;
282
283   /* The number of bytes allocated, not including the page entry.  */
284   size_t bytes;
285
286   /* The previous page in the list, so that we can unlink this one.  */
287   struct large_page_entry *prev;
288
289   /* During marking, is this object marked?  */
290   bool mark_p;
291 };
292
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:
296
297                                    HOST_PAGE_SIZE_BITS
298                            32           |      |
299        msb +----------------+----+------+------+ lsb
300                             |    |      |
301                          PAGE_L1_BITS   |
302                                  |      |
303                                PAGE_L2_BITS
304
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.
309
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.  */
314
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)
319
320 #define LOOKUP_L1(p) \
321   (((size_t) (p) >> (32 - PAGE_L1_BITS)) & ((1 << PAGE_L1_BITS) - 1))
322
323 #define LOOKUP_L2(p) \
324   (((size_t) (p) >> GGC_PAGE_SHIFT) & ((1 << PAGE_L2_BITS) - 1))
325
326 #if HOST_BITS_PER_PTR <= 32
327
328 /* On 32-bit hosts, we use a two level page table, as pictured above.  */
329 typedef page_entry **page_table[PAGE_L1_SIZE];
330
331 #else
332
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
337 {
338   struct page_table_chain *next;
339   size_t high_bits;
340   page_entry **table[PAGE_L1_SIZE];
341 } *page_table;
342
343 #endif
344
345 /* The global variables.  */
346 static struct globals
347 {
348   /* The linked list of zones.  */
349   struct alloc_zone *zones;
350
351   /* Lookup table for associating allocation pages with object addresses.  */
352   page_table lookup;
353
354   /* The system's page size, and related constants.  */
355   size_t pagesize;
356   size_t lg_pagesize;
357   size_t page_mask;
358
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;
363
364 #if defined (HAVE_MMAP_DEV_ZERO)
365   /* A file descriptor open to /dev/zero for reading.  */
366   int dev_zero_fd;
367 #endif
368
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;
373
374   /* The file descriptor for debugging output.  */
375   FILE *debug_file;
376 } G;
377
378 /* A zone allocation structure.  There is one of these for every
379    distinct allocation zone.  */
380 struct alloc_zone
381 {
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;
387
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];
391
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;
395
396   /* Bytes currently allocated in this zone.  */
397   size_t allocated;
398
399   /* Linked list of the small pages in this zone.  */
400   struct small_page_entry *pages;
401
402   /* Doubly linked list of large pages in this zone.  */
403   struct large_page_entry *large_pages;
404
405   /* If we are currently marking this zone, a pointer to the mark bits.  */
406   mark_type *mark_bits;
407
408   /* Name of the zone.  */
409   const char *name;
410
411   /* The number of small pages currently allocated in this zone.  */
412   size_t n_small_pages;
413
414   /* Bytes allocated at the end of the last collection.  */
415   size_t allocated_last_gc;
416
417   /* Total amount of memory mapped.  */
418   size_t bytes_mapped;
419
420   /* A cache of free system pages.  */
421   struct small_page_entry *free_pages;
422
423   /* Next zone in the linked list of zones.  */
424   struct alloc_zone *next_zone;
425
426   /* True if this zone was collected during this collection.  */
427   bool was_collected;
428
429   /* True if this zone should be destroyed after the next collection.  */
430   bool dead;
431
432 #ifdef GATHER_STATISTICS
433   struct
434   {
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;
439
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.  */
443    
444     unsigned long long total_allocated_under32;
445     unsigned long long total_overhead_under32;
446   
447     unsigned long long total_allocated_under64;
448     unsigned long long total_overhead_under64;
449   
450     unsigned long long total_allocated_under128;
451     unsigned long long total_overhead_under128;
452   } stats;
453 #endif
454 } main_zone;
455
456 /* Some default zones.  */
457 struct alloc_zone rtl_zone;
458 struct alloc_zone tree_zone;
459 struct alloc_zone tree_id_zone;
460
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
464 {
465   /* The start of the PCH zone.  NULL if there is none.  */
466   char *page;
467
468   /* The end of the PCH zone.  NULL if there is none.  */
469   char *end;
470
471   /* The size of the PCH zone.  0 if there is none.  */
472   size_t bytes;
473
474   /* The allocation bitmap for the PCH zone.  */
475   alloc_type *alloc_bits;
476
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;
484
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 *);
497
498 /* Traverse the page table and find the entry for a page.
499    Die (probably) if the object wasn't allocated via GC.  */
500
501 static inline page_entry *
502 lookup_page_table_entry (const void *p)
503 {
504   page_entry ***base;
505   size_t L1, L2;
506
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
516
517   /* Extract the level 1 and 2 indices.  */
518   L1 = LOOKUP_L1 (p);
519   L2 = LOOKUP_L2 (p);
520
521   return base[L1][L2];
522 }
523
524 /* Set the page table entry for the page that starts at P.  If ENTRY
525    is NULL, clear the entry.  */
526
527 static void
528 set_page_table_entry (void *p, page_entry *entry)
529 {
530   page_entry ***base;
531   size_t L1, L2;
532
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;
541
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
550
551   /* Extract the level 1 and 2 indices.  */
552   L1 = LOOKUP_L1 (p);
553   L2 = LOOKUP_L2 (p);
554
555   if (base[L1] == NULL)
556     base[L1] = xcalloc (PAGE_L2_SIZE, sizeof (page_entry *));
557
558   base[L1][L2] = entry;
559 }
560
561 /* Find the page table entry associated with OBJECT.  */
562
563 static inline struct page_entry *
564 zone_get_object_page (const void *object)
565 {
566   return lookup_page_table_entry (object);
567 }
568
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)
573 {
574   return (((size_t) object & (GGC_PAGE_SIZE - 1))
575           / (8 * sizeof (alloc_type) * BYTES_PER_ALLOC_BIT));
576 }
577
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)
582 {
583   return (((size_t) object / BYTES_PER_ALLOC_BIT)
584           % (8 * sizeof (alloc_type)));
585 }
586
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)
591 {
592   return (((size_t) object & (GGC_PAGE_SIZE - 1))
593           / (8 * sizeof (mark_type) * BYTES_PER_MARK_BIT));
594 }
595
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)
600 {
601   return (((size_t) object / BYTES_PER_MARK_BIT)
602           % (8 * sizeof (mark_type)));
603 }
604
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)
609 {
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);
614
615   page->alloc_bits[start_word] |= 1L << start_bit;
616 }
617
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)
624 {
625   unsigned int start_word = zone_get_object_alloc_word (object);
626   unsigned int start_bit = zone_get_object_alloc_bit (object);
627
628   /* Would xor be quicker?  */
629   page->alloc_bits[start_word] &= ~(1L << start_bit);
630 }
631
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.  */
635
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)
640 {
641   size_t size;
642   alloc_type alloc_word;
643   int indx;
644
645   /* Load the first word.  */
646   alloc_word = alloc_bits[start_word++];
647
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)
651     {
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;
658
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;
661
662       if (size >= max_size)
663         return max_size;
664
665       alloc_word = alloc_bits[start_word++];
666     }
667   else
668     size = BYTES_PER_ALLOC_BIT;
669
670   while (alloc_word == 0)
671     {
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++];
676     }
677
678   indx = alloc_ffs (alloc_word);
679   return size + (indx - 1) * BYTES_PER_ALLOC_BIT;
680 }
681
682 /* Find the size of OBJECT on small page PAGE.  */
683
684 static inline size_t
685 zone_find_object_size (struct small_page_entry *page,
686                        const void *object)
687 {
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);
693
694   return zone_object_size_1 (page->alloc_bits, start_word, start_bit,
695                              max_size);
696 }
697
698 /* Allocate the mark bits for every zone, and set the pointers on each
699    page.  */
700 static void
701 zone_allocate_marks (void)
702 {
703   struct alloc_zone *zone;
704
705   for (zone = G.zones; zone; zone = zone->next_zone)
706     {
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
713
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)
721         {
722           page->mark_bits = cur_marks;
723           cur_marks += mark_words_per_page;
724 #ifdef ENABLE_CHECKING
725           n++;
726 #endif
727         }
728 #ifdef ENABLE_CHECKING
729       gcc_assert (n == zone->n_small_pages);
730 #endif
731     }
732
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));
739 }
740
741 /* After marking and sweeping, release the memory used for mark bits.  */
742 static void
743 zone_free_marks (void)
744 {
745   struct alloc_zone *zone;
746
747   for (zone = G.zones; zone; zone = zone->next_zone)
748     if (zone->mark_bits)
749       {
750         free (zone->mark_bits);
751         zone->mark_bits = NULL;
752       }
753
754   if (pch_zone.bytes)
755     {
756       free (pch_zone.mark_bits);
757       pch_zone.mark_bits = NULL;
758     }
759 }
760
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.  */
765
766 static inline char *
767 alloc_anon (char *pref ATTRIBUTE_UNUSED, size_t size, struct alloc_zone *zone)
768 {
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
777
778   if (page == (char *) MAP_FAILED)
779     {
780       perror ("virtual memory exhausted");
781       exit (FATAL_EXIT_CODE);
782     }
783
784   /* Remember that we allocated this memory.  */
785   zone->bytes_mapped += size;
786
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));
791
792   return page;
793 }
794 #endif
795
796 /* Allocate a new page for allocating small objects in ZONE, and
797    return an entry for it.  */
798
799 static struct small_page_entry *
800 alloc_small_page (struct alloc_zone *zone)
801 {
802   struct small_page_entry *entry;
803
804   /* Check the list of free pages for one we can use.  */
805   entry = zone->free_pages;
806   if (entry != NULL)
807     {
808       /* Recycle the allocated memory from this page ...  */
809       zone->free_pages = entry->next;
810     }
811   else
812     {
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;
819
820       page = alloc_anon (NULL, GGC_PAGE_SIZE * G.quire_size, zone);
821
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--)
825         {
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);
832         }
833
834       zone->free_pages = f;
835
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);
840     }
841
842   zone->n_small_pages++;
843
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);
849
850   return entry;
851 }
852
853 /* Allocate a large page of size SIZE in ZONE.  */
854
855 static struct large_page_entry *
856 alloc_large_page (size_t size, struct alloc_zone *zone)
857 {
858   struct large_page_entry *entry;
859   char *page;
860   size_t needed_size;
861
862   needed_size = size + sizeof (struct large_page_entry);
863   page = xmalloc (needed_size);
864
865   entry = (struct large_page_entry *) page;
866
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;
878
879   set_page_table_entry (entry->common.page, &entry->common);
880
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);
886
887   return entry;
888 }
889
890
891 /* For a page that is no longer needed, put it on the free page list.  */
892
893 static inline void
894 free_small_page (struct small_page_entry *entry)
895 {
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);
901
902   gcc_assert (!entry->common.large_p);
903
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));
908
909   entry->next = entry->common.zone->free_pages;
910   entry->common.zone->free_pages = entry;
911   entry->common.zone->n_small_pages--;
912 }
913
914 /* Release a large page that is no longer needed.  */
915
916 static inline void
917 free_large_page (struct large_page_entry *entry)
918 {
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);
924
925   gcc_assert (entry->common.large_p);
926
927   set_page_table_entry (entry->common.page, NULL);
928   free (entry);
929 }
930
931 /* Release the free page cache to the system.  */
932
933 static void
934 release_pages (struct alloc_zone *zone)
935 {
936 #ifdef USING_MMAP
937   struct small_page_entry *p, *next;
938   char *start;
939   size_t len;
940
941   /* Gather up adjacent pages so they are unmapped together.  */
942   p = zone->free_pages;
943
944   while (p)
945     {
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;
951
952       while (p && p->common.page == start + len)
953         {
954           next = p->next;
955           len += SMALL_PAGE_SIZE;
956           set_page_table_entry (p->common.page, NULL);
957           p = next;
958         }
959
960       munmap (start, len);
961       zone->bytes_mapped -= len;
962     }
963
964   zone->free_pages = NULL;
965 #endif
966 }
967
968 /* Place the block at PTR of size SIZE on the free list for ZONE.  */
969
970 static inline void
971 free_chunk (char *ptr, size_t size, struct alloc_zone *zone)
972 {
973   struct alloc_chunk *chunk = (struct alloc_chunk *) ptr;
974   size_t bin = 0;
975
976   bin = SIZE_BIN_DOWN (size);
977   gcc_assert (bin != 0);
978   if (bin > NUM_FREE_BINS)
979     {
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)));
986     }
987   else
988     {
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 *)));
993     }
994
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);
1000 }
1001
1002 /* Allocate a chunk of memory of at least ORIG_SIZE bytes, in ZONE.  */
1003
1004 void *
1005 ggc_alloc_zone_stat (size_t orig_size, struct alloc_zone *zone
1006                      MEM_STAT_DECL)
1007 {
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;
1014
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;
1021
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.
1027
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.  */
1032
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)
1040     {
1041       result = zone->cached_free;
1042
1043       zone->cached_free_size -= size;
1044       if (zone->cached_free_size)
1045         {
1046           zone->cached_free += size;
1047           zone_set_object_alloc_bit (zone->cached_free);
1048         }
1049
1050       goto found;
1051     }
1052
1053   /* Next, try to find a free bin of the exactly correct size.  */
1054
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);
1059
1060   if (bin <= NUM_FREE_BINS
1061       && (chunk = zone->free_chunks[bin]) != NULL)
1062     {
1063       /* We have a chunk of the right size.  Pull it off the free list
1064          and use it.  */
1065
1066       zone->free_chunks[bin] = chunk->next_free;
1067
1068       /* NOTE: SIZE is only guaranteed to be right if MAX_ALIGNMENT
1069          == FREE_BIN_DELTA.  */
1070       result = chunk;
1071
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.  */
1076
1077       goto found;
1078     }
1079
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.  */
1084
1085   if (zone->high_free_bin > bin)
1086     {
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--;
1092
1093       if (zone->high_free_bin > bin)
1094         {
1095           size_t tbin = zone->high_free_bin;
1096           chunk = zone->free_chunks[tbin];
1097
1098           /* Remove the chunk from its previous bin.  */
1099           zone->free_chunks[tbin] = chunk->next_free;
1100
1101           result = (char *) chunk;
1102
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);
1106
1107           chunk = (struct alloc_chunk *) ((char *) result + size);
1108           zone->cached_free = (char *) chunk;
1109           zone->cached_free_size = (tbin - bin) * FREE_BIN_DELTA;
1110
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);
1114
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.  */
1118
1119           goto found;
1120         }
1121     }
1122
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)
1128     {
1129       pp = &chunk->next_free;
1130       chunk = *pp;
1131     }
1132
1133   if (chunk)
1134     {
1135       /* Remove the chunk from its previous bin.  */
1136       *pp = chunk->next_free;
1137
1138       result = (char *) chunk;
1139
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)
1144         {
1145           if (zone->cached_free_size)
1146             free_chunk (zone->cached_free, zone->cached_free_size, zone);
1147
1148           chunk = (struct alloc_chunk *) ((char *) result + size);
1149           zone->cached_free = (char *) chunk;
1150           zone->cached_free_size = csize - size;
1151
1152           /* Mark the new free chunk as an object.  */
1153           zone_set_object_alloc_bit (chunk);
1154         }
1155
1156       goto found;
1157     }
1158
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)
1165     {
1166       struct large_page_entry *entry = alloc_large_page (size, zone);
1167
1168 #ifdef GATHER_STATISTICS
1169       entry->common.survived = 0;
1170 #endif
1171
1172       entry->next = zone->large_pages;
1173       if (zone->large_pages)
1174         zone->large_pages->prev = entry;
1175       zone->large_pages = entry;
1176
1177       result = entry->common.page;
1178
1179       goto found;
1180     }
1181
1182   /* Failing everything above, allocate a new small page.  */
1183
1184   entry = alloc_small_page (zone);
1185   entry->next = zone->pages;
1186   zone->pages = entry;
1187
1188   /* Mark the first chunk in the new page.  */
1189   entry->alloc_bits[0] = 1;
1190
1191   result = entry->common.page;
1192   if (size < SMALL_PAGE_SIZE)
1193     {
1194       if (zone->cached_free_size)
1195         free_chunk (zone->cached_free, zone->cached_free_size, zone);
1196
1197       zone->cached_free = (char *) result + size;
1198       zone->cached_free_size = SMALL_PAGE_SIZE - size;
1199
1200       /* Mark the new free chunk as an object.  */
1201       zone_set_object_alloc_bit (zone->cached_free);
1202     }
1203
1204  found:
1205
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.  */
1210
1211   /* We'll probably write to this after we return.  */
1212   prefetchw (result);
1213
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
1221
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));
1226
1227   /* Keep track of how many bytes are being allocated.  This
1228      information is used in deciding when to collect.  */
1229   zone->allocated += size;
1230   
1231   timevar_ggc_mem_total += size;
1232
1233 #ifdef GATHER_STATISTICS
1234   ggc_record_overhead (orig_size, size - orig_size, result PASS_MEM_STAT);
1235
1236   {
1237     size_t object_size = size;
1238     size_t overhead = object_size - orig_size;
1239
1240     zone->stats.total_overhead += overhead;
1241     zone->stats.total_allocated += object_size;
1242
1243     if (orig_size <= 32)
1244       {
1245         zone->stats.total_overhead_under32 += overhead;
1246         zone->stats.total_allocated_under32 += object_size;
1247       }
1248     if (orig_size <= 64)
1249       {
1250         zone->stats.total_overhead_under64 += overhead;
1251         zone->stats.total_allocated_under64 += object_size;
1252       }
1253     if (orig_size <= 128)
1254       {
1255         zone->stats.total_overhead_under128 += overhead;
1256         zone->stats.total_allocated_under128 += object_size;
1257       }
1258   }
1259 #endif
1260
1261   if (GGC_DEBUG_LEVEL >= 3)
1262     fprintf (G.debug_file, "Allocating object, size=%lu at %p\n",
1263              (unsigned long) size, result);
1264
1265   return result;
1266 }
1267
1268 /* Allocate a SIZE of chunk memory of GTE type, into an appropriate zone
1269    for that type.  */
1270
1271 void *
1272 ggc_alloc_typed_stat (enum gt_types_enum gte, size_t size
1273                       MEM_STAT_DECL)
1274 {
1275   switch (gte)
1276     {
1277     case gt_ggc_e_14lang_tree_node:
1278       return ggc_alloc_zone_pass_stat (size, &tree_zone);
1279
1280     case gt_ggc_e_7rtx_def:
1281       return ggc_alloc_zone_pass_stat (size, &rtl_zone);
1282
1283     case gt_ggc_e_9rtvec_def:
1284       return ggc_alloc_zone_pass_stat (size, &rtl_zone);
1285
1286     default:
1287       return ggc_alloc_zone_pass_stat (size, &main_zone);
1288     }
1289 }
1290
1291 /* Normal ggc_alloc simply allocates into the main zone.  */
1292
1293 void *
1294 ggc_alloc_stat (size_t size MEM_STAT_DECL)
1295 {
1296   return ggc_alloc_zone_pass_stat (size, &main_zone);
1297 }
1298
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
1306
1307 /* Free the object at P.  */
1308
1309 void
1310 ggc_free (void *p)
1311 {
1312   struct page_entry *page;
1313
1314 #ifdef GATHER_STATISTICS
1315   ggc_free_overhead (p);
1316 #endif
1317
1318   poison_region (p, ggc_get_size (p));
1319
1320   page = zone_get_object_page (p);
1321
1322   if (page->large_p)
1323     {
1324       struct large_page_entry *large_page
1325         = (struct large_page_entry *) page;
1326
1327       /* Remove the page from the linked list.  */
1328       if (large_page->prev)
1329         large_page->prev->next = large_page->next;
1330       else
1331         {
1332           gcc_assert (large_page->common.zone->large_pages == large_page);
1333           large_page->common.zone->large_pages = large_page->next;
1334         }
1335       if (large_page->next)
1336         large_page->next->prev = large_page->prev;
1337
1338       large_page->common.zone->allocated -= large_page->bytes;
1339
1340       /* Release the memory associated with this object.  */
1341       free_large_page (large_page);
1342     }
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.  */
1346     ;
1347   else
1348     {
1349       size_t size = ggc_get_size (p);
1350
1351       page->zone->allocated -= size;
1352
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);
1356     }
1357 }
1358
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.  */
1362
1363 int
1364 ggc_set_mark (const void *p)
1365 {
1366   struct page_entry *page;
1367   const char *ptr = (const char *) p;
1368
1369   page = zone_get_object_page (p);
1370
1371   if (page->pch_p)
1372     {
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));
1377       
1378       if (pch_zone.mark_bits[mark_word] & (1 << mark_bit))
1379         return 1;
1380       pch_zone.mark_bits[mark_word] |= (1 << mark_bit);
1381     }
1382   else if (page->large_p)
1383     {
1384       struct large_page_entry *large_page
1385         = (struct large_page_entry *) page;
1386
1387       if (large_page->mark_p)
1388         return 1;
1389       large_page->mark_p = true;
1390     }
1391   else
1392     {
1393       struct small_page_entry *small_page
1394         = (struct small_page_entry *) page;
1395
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));
1401     }
1402
1403   if (GGC_DEBUG_LEVEL >= 4)
1404     fprintf (G.debug_file, "Marking %p\n", p);
1405
1406   return 0;
1407 }
1408
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.  */
1412
1413 int
1414 ggc_marked_p (const void *p)
1415 {
1416   struct page_entry *page;
1417   const char *ptr = p;
1418
1419   page = zone_get_object_page (p);
1420
1421   if (page->pch_p)
1422     {
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));
1427       
1428       return (pch_zone.mark_bits[mark_word] & (1 << mark_bit)) != 0;
1429     }
1430
1431   if (page->large_p)
1432     {
1433       struct large_page_entry *large_page
1434         = (struct large_page_entry *) page;
1435
1436       return large_page->mark_p;
1437     }
1438   else
1439     {
1440       struct small_page_entry *small_page
1441         = (struct small_page_entry *) page;
1442
1443       return 0 != (small_page->mark_bits[zone_get_object_mark_word (p)]
1444                    & (1 << zone_get_object_mark_bit (p)));
1445     }
1446 }
1447
1448 /* Return the size of the gc-able object P.  */
1449
1450 size_t
1451 ggc_get_size (const void *p)
1452 {
1453   struct page_entry *page;
1454   const char *ptr = (const char *) p;
1455
1456   page = zone_get_object_page (p);
1457
1458   if (page->pch_p)
1459     {
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);
1467     }
1468
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);
1473 }
1474
1475 /* Initialize the ggc-zone-mmap allocator.  */
1476 void
1477 init_ggc (void)
1478 {
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.  */
1482
1483   gcc_assert (FREE_BIN_DELTA == MAX_ALIGNMENT);
1484
1485   /* Set up the main zone by hand.  */
1486   main_zone.name = "Main zone";
1487   G.zones = &main_zone;
1488
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");
1493
1494   G.pagesize = getpagesize();
1495   G.lg_pagesize = exact_log2 (G.pagesize);
1496   G.page_mask = ~(G.pagesize - 1);
1497
1498   /* Require the system page size to be a multiple of GGC_PAGE_SIZE.  */
1499   gcc_assert ((G.pagesize & (GGC_PAGE_SIZE - 1)) == 0);
1500
1501   /* Allocate 16 system pages at a time.  */
1502   G.quire_size = 16 * G.pagesize / GGC_PAGE_SIZE;
1503
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); */
1510
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
1515
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
1522
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.  */
1528   {
1529     char *p = alloc_anon (NULL, G.pagesize, &main_zone);
1530     struct small_page_entry *e;
1531     if ((size_t)p & (G.pagesize - 1))
1532       {
1533         /* How losing.  Discard this one and try another.  If we still
1534            can't get something useful, give up.  */
1535
1536         p = alloc_anon (NULL, G.pagesize, &main_zone);
1537         gcc_assert (!((size_t)p & (G.pagesize - 1)));
1538       }
1539
1540     if (GGC_PAGE_SIZE == G.pagesize)
1541       {
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;
1549       }
1550     else
1551       {
1552         munmap (p, G.pagesize);
1553       }
1554   }
1555 #endif
1556 }
1557
1558 /* Start a new GGC zone.  */
1559
1560 static void
1561 new_ggc_zone_1 (struct alloc_zone *new_zone, const char * name)
1562 {
1563   new_zone->name = name;
1564   new_zone->next_zone = G.zones->next_zone;
1565   G.zones->next_zone = new_zone;
1566 }
1567
1568 struct alloc_zone *
1569 new_ggc_zone (const char * name)
1570 {
1571   struct alloc_zone *new_zone = xcalloc (1, sizeof (struct alloc_zone));
1572   new_ggc_zone_1 (new_zone, name);
1573   return new_zone;
1574 }
1575
1576 /* Destroy a GGC zone.  */
1577 void
1578 destroy_ggc_zone (struct alloc_zone * dead_zone)
1579 {
1580   struct alloc_zone *z;
1581
1582   for (z = G.zones; z && z->next_zone != dead_zone; z = z->next_zone)
1583     /* Just find that zone.  */
1584     continue;
1585
1586   /* We should have found the zone in the list.  Anything else is fatal.  */
1587   gcc_assert (z);
1588
1589   /* z is dead, baby. z is dead.  */
1590   z->dead = true;
1591 }
1592
1593 /* Free all empty pages and objects within a page for a given zone  */
1594
1595 static void
1596 sweep_pages (struct alloc_zone *zone)
1597 {
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;
1603
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;
1610
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)
1615     {
1616       gcc_assert (lp->common.large_p);
1617
1618       lnext = lp->next;
1619
1620 #ifdef GATHER_STATISTICS
1621       /* This page has now survived another collection.  */
1622       lp->common.survived++;
1623 #endif
1624
1625       if (lp->mark_p)
1626         {
1627           lp->mark_p = false;
1628           allocated += lp->bytes;
1629           lpp = &lp->next;
1630         }
1631       else
1632         {
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);
1643         }
1644     }
1645
1646   spp = &zone->pages;
1647   for (sp = zone->pages; sp != NULL; sp = snext)
1648     {
1649       char *object, *last_object;
1650       char *end;
1651       alloc_type *alloc_word_p;
1652       mark_type *mark_word_p;
1653
1654       gcc_assert (!sp->common.large_p);
1655
1656       snext = sp->next;
1657
1658 #ifdef GATHER_STATISTICS
1659       /* This page has now survived another collection.  */
1660       sp->common.survived++;
1661 #endif
1662
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.  */
1666
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;
1673
1674       gcc_assert (BYTES_PER_ALLOC_BIT == BYTES_PER_MARK_BIT);
1675
1676       object = sp->common.page;
1677       do
1678         {
1679           unsigned int i, n;
1680           alloc_type alloc_word;
1681           mark_type mark_word;
1682
1683           alloc_word = *alloc_word_p++;
1684           mark_word = *mark_word_p++;
1685
1686           if (mark_word)
1687             nomarksinpage = false;
1688
1689           /* There ought to be some way to do this without looping...  */
1690           i = 0;
1691           while ((n = alloc_ffs (alloc_word)) != 0)
1692             {
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);
1699
1700               if (mark_word & 1)
1701                 {
1702                   if (last_free)
1703                     {
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;
1710                     }
1711                   else
1712                     allocated += object - last_object;
1713                   last_object = object;
1714                 }
1715               else
1716                 {
1717                   if (last_free == NULL)
1718                     {
1719                       last_free = object;
1720                       allocated += object - last_object;
1721                     }
1722                   else
1723                     zone_clear_object_alloc_bit (sp, object);
1724                 }
1725
1726               /* Shift to just after the alloc bit we handled.  */
1727               alloc_word >>= 1;
1728               mark_word >>= 1;
1729               object += BYTES_PER_MARK_BIT;
1730
1731               i += n;
1732             }
1733
1734           object += BYTES_PER_MARK_BIT * (8 * sizeof (alloc_type) - i);
1735         }
1736       while (object < end);
1737
1738       if (nomarksinpage)
1739         {
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;
1748         }
1749       else if (last_free)
1750         {
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);
1755         }
1756       else
1757         allocated += object - last_object;
1758
1759       spp = &sp->next;
1760     }
1761
1762   zone->allocated = allocated;
1763 }
1764
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.  */
1769
1770 static bool
1771 ggc_collect_1 (struct alloc_zone *zone, bool need_marking)
1772 {
1773 #if 0
1774   /* */
1775   {
1776     int i;
1777     for (i = 0; i < NUM_FREE_BINS + 1; i++)
1778       {
1779         struct alloc_chunk *chunk;
1780         int n, tot;
1781
1782         n = 0;
1783         tot = 0;
1784         chunk = zone->free_chunks[i];
1785         while (chunk)
1786           {
1787             n++;
1788             tot += chunk->size;
1789             chunk = chunk->next_free;
1790           }
1791         fprintf (stderr, "Bin %d: %d free chunks (%d bytes)\n",
1792                  i, n, tot);
1793       }
1794   }
1795   /* */
1796 #endif
1797
1798   if (!quiet_flag)
1799     fprintf (stderr, " {%s GC %luk -> ",
1800              zone->name, (unsigned long) zone->allocated / 1024);
1801
1802   /* Zero the total allocated bytes.  This will be recalculated in the
1803      sweep phase.  */
1804   zone->allocated = 0;
1805
1806   /* Release the pages we freed the last time we collected, but didn't
1807      reuse in the interim.  */
1808   release_pages (zone);
1809
1810   if (need_marking)
1811     {
1812       zone_allocate_marks ();
1813       ggc_mark_roots ();
1814 #ifdef GATHER_STATISTICS
1815       ggc_prune_overhead_list ();
1816 #endif
1817     }
1818   
1819   sweep_pages (zone);
1820   zone->was_collected = true;
1821   zone->allocated_last_gc = zone->allocated;
1822
1823   if (!quiet_flag)
1824     fprintf (stderr, "%luk}", (unsigned long) zone->allocated / 1024);
1825   return true;
1826 }
1827
1828 #ifdef GATHER_STATISTICS
1829 /* Calculate the average page survival rate in terms of number of
1830    collections.  */
1831
1832 static float
1833 calculate_average_page_survival (struct alloc_zone *zone)
1834 {
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)
1840     {
1841       count += 1.0;
1842       survival += p->common.survived;
1843     }
1844   for (lp = zone->large_pages; lp; lp = lp->next)
1845     {
1846       count += 1.0;
1847       survival += lp->common.survived;
1848     }
1849   return survival/count;
1850 }
1851 #endif
1852
1853 /* Top level collection routine.  */
1854
1855 void
1856 ggc_collect (void)
1857 {
1858   struct alloc_zone *zone;
1859   bool marked = false;
1860
1861   timevar_push (TV_GC);
1862
1863   if (!ggc_force_collect)
1864     {
1865       float allocated_last_gc = 0, allocated = 0, min_expand;
1866
1867       for (zone = G.zones; zone; zone = zone->next_zone)
1868         {
1869           allocated_last_gc += zone->allocated_last_gc;
1870           allocated += zone->allocated;
1871         }
1872
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;
1877
1878       if (allocated < allocated_last_gc + min_expand)
1879         {
1880           timevar_pop (TV_GC);
1881           return;
1882         }
1883     }
1884
1885   /* Start by possibly collecting the main zone.  */
1886   main_zone.was_collected = false;
1887   marked |= ggc_collect_1 (&main_zone, true);
1888
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.  */
1899
1900   if (main_zone.was_collected)
1901     {
1902       struct alloc_zone *zone;
1903
1904       for (zone = main_zone.next_zone; zone; zone = zone->next_zone)
1905         {
1906           zone->was_collected = false;
1907           marked |= ggc_collect_1 (zone, !marked);
1908         }
1909     }
1910
1911 #ifdef GATHER_STATISTICS
1912   /* Print page survival stats, if someone wants them.  */
1913   if (GGC_DEBUG_LEVEL >= 2)
1914     {
1915       for (zone = G.zones; zone; zone = zone->next_zone)
1916         {
1917           if (zone->was_collected)
1918             {
1919               float f = calculate_average_page_survival (zone);
1920               printf ("Average page survival in zone `%s' is %f\n",
1921                       zone->name, f);
1922             }
1923         }
1924     }
1925 #endif
1926
1927   if (marked)
1928     zone_free_marks ();
1929
1930   /* Free dead zones.  */
1931   for (zone = G.zones; zone && zone->next_zone; zone = zone->next_zone)
1932     {
1933       if (zone->next_zone->dead)
1934         {
1935           struct alloc_zone *dead_zone = zone->next_zone;
1936
1937           printf ("Zone `%s' is dead and will be freed.\n", dead_zone->name);
1938
1939           /* The zone must be empty.  */
1940           gcc_assert (!dead_zone->allocated);
1941
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);
1946         }
1947     }
1948
1949   timevar_pop (TV_GC);
1950 }
1951
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'))
1959
1960 void
1961 ggc_print_statistics (void)
1962 {
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;
1967
1968   /* Clear the statistics.  */
1969   memset (&stats, 0, sizeof (stats));
1970
1971   /* Make sure collection will really occur.  */
1972   ggc_force_collect = true;
1973
1974   /* Collect and print the statistics common across collectors.  */
1975   ggc_print_common_statistics (stderr, &stats);
1976
1977   ggc_force_collect = false;
1978
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);
1983
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");
1988
1989   fprintf (stderr, "%20s %10s  %10s  %10s\n",
1990            "Zone", "Allocated", "Used", "Overhead");
1991   for (zone = G.zones; zone; zone = zone->next_zone)
1992     {
1993       struct large_page_entry *large_page;
1994       size_t overhead, allocated, in_use;
1995
1996       /* Skip empty zones.  */
1997       if (!zone->pages && !zone->large_pages)
1998         continue;
1999
2000       allocated = in_use = 0;
2001
2002       overhead = sizeof (struct alloc_zone);
2003
2004       for (large_page = zone->large_pages; large_page != NULL;
2005            large_page = large_page->next)
2006         {
2007           allocated += large_page->bytes;
2008           in_use += large_page->bytes;
2009           overhead += sizeof (struct large_page_entry);
2010         }
2011
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.  */
2015
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;
2019
2020       for (i = 0; i <= NUM_FREE_BINS; i++)
2021         {
2022           struct alloc_chunk *chunk = zone->free_chunks[i];
2023           while (chunk)
2024             {
2025               in_use -= ggc_get_size (chunk);
2026               chunk = chunk->next_free;
2027             }
2028         }
2029       
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));
2035
2036       gcc_assert (in_use == zone->allocated);
2037
2038       total_overhead += overhead;
2039       total_allocated += zone->allocated;
2040       total_bytes_mapped += zone->bytes_mapped;
2041     }
2042
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
2050   {
2051     page_table table = G.lookup;
2052     pte_overhead = 0;
2053     while (table)
2054       {
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;
2060       }
2061   }
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;
2066
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));
2071
2072 #ifdef GATHER_STATISTICS  
2073   {
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;
2078
2079     fprintf (stderr, "\nTotal allocations and overheads during the compilation process\n");
2080
2081     for (zone = G.zones; zone; zone = zone->next_zone)
2082       {
2083         all_overhead += zone->stats.total_overhead;
2084         all_allocated += zone->stats.total_allocated;
2085
2086         all_allocated_under32 += zone->stats.total_allocated_under32;
2087         all_overhead_under32 += zone->stats.total_overhead_under32;
2088
2089         all_allocated_under64 += zone->stats.total_allocated_under64;
2090         all_overhead_under64 += zone->stats.total_overhead_under64;
2091         
2092         all_allocated_under128 += zone->stats.total_allocated_under128;
2093         all_overhead_under128 += zone->stats.total_overhead_under128;
2094
2095         fprintf (stderr, "%20s:                  %10lld\n",
2096                  zone->name, zone->stats.total_allocated);
2097       }
2098
2099     fprintf (stderr, "\n");
2100
2101     fprintf (stderr, "Total Overhead:                        %10lld\n",
2102              all_overhead);
2103     fprintf (stderr, "Total Allocated:                       %10lld\n",
2104              all_allocated);
2105
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);
2118   }
2119 #endif
2120 }
2121
2122 /* Precompiled header support.  */
2123
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.  */
2128
2129 #define NUM_PCH_BUCKETS         (gt_types_enum_last + 3)
2130
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)
2134
2135 struct ggc_pch_ondisk
2136 {
2137   size_t total;
2138   size_t type_totals[NUM_PCH_BUCKETS];
2139 };
2140
2141 struct ggc_pch_data
2142 {
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;
2150 };
2151
2152 /* Initialize the PCH data structure.  */
2153
2154 struct ggc_pch_data *
2155 init_ggc_pch (void)
2156 {
2157   return xcalloc (sizeof (struct ggc_pch_data), 1);
2158 }
2159
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.  */
2164
2165 static int
2166 pch_bucket (void *x, enum gt_types_enum type,
2167             bool is_string)
2168 {
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)
2175     {
2176       if (is_string)
2177         return STRING_BUCKET;
2178       return OTHER_BUCKET;
2179     }
2180   return type;
2181 }
2182
2183 /* Add the size of object X to the size of the PCH data.  */
2184
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)
2188 {
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.  */
2192
2193   d->d.type_totals[pch_bucket (x, type, is_string)] += size;
2194 }
2195
2196 /* Return the total size of the PCH data.  */
2197
2198 size_t
2199 ggc_pch_total_size (struct ggc_pch_data *d)
2200 {
2201   enum gt_types_enum i;
2202   size_t alloc_size, total_size;
2203
2204   total_size = 0;
2205   for (i = 0; i < NUM_PCH_BUCKETS; i++)
2206     {
2207       d->d.type_totals[i] = ROUND_UP (d->d.type_totals[i], GGC_PAGE_SIZE);
2208       total_size += d->d.type_totals[i];
2209     }
2210   d->d.total = total_size;
2211
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;
2216
2217   return d->d.total + alloc_size;
2218 }
2219
2220 /* Set the base address for the objects in the PCH file.  */
2221
2222 void
2223 ggc_pch_this_base (struct ggc_pch_data *d, void *base_)
2224 {
2225   int i;
2226   size_t base = (size_t) base_;
2227
2228   d->base = d->orig_base = base;
2229   for (i = 0; i < NUM_PCH_BUCKETS; i++)
2230     {
2231       d->type_bases[i] = base;
2232       base += d->d.type_totals[i];
2233     }
2234
2235   if (d->alloc_bits == NULL)
2236     d->alloc_bits = xcalloc (1, d->alloc_size);
2237 }
2238
2239 /* Allocate a place for object X of size SIZE in the PCH file.  */
2240
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)
2245 {
2246   size_t alloc_word, alloc_bit;
2247   char *result;
2248   int bucket = pch_bucket (x, type, is_string);
2249
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;
2260
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;
2265 }
2266
2267 /* Prepare to write out the PCH data to file F.  */
2268
2269 void
2270 ggc_pch_prepare_write (struct ggc_pch_data *d,
2271                        FILE *f)
2272 {
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);
2277 }
2278
2279 /* Write out object X of SIZE to file F.  */
2280
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)
2285 {
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");
2288
2289   if (fwrite (x, size, 1, f) != 1)
2290     fatal_error ("can't write PCH file: %m");
2291 }
2292
2293 void
2294 ggc_pch_finish (struct ggc_pch_data *d, FILE *f)
2295 {
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");
2299
2300   if (fwrite (d->alloc_bits, d->alloc_size, 1, f) != 1)
2301     fatal_error ("can't write PCH fle: %m");
2302
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");
2306
2307   free (d->alloc_bits);
2308   free (d);
2309 }
2310
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.  */
2313
2314 void
2315 ggc_pch_read (FILE *f, void *addr)
2316 {
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;
2322
2323   if (fread (&d, sizeof (d), 1, f) != 1)
2324     fatal_error ("can't read PCH file: %m");
2325
2326   alloc_size = CEIL (d.total, BYTES_PER_ALLOC_BIT * 8);
2327   alloc_size = ROUND_UP (alloc_size, MAX_ALIGNMENT);
2328
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;
2333
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)
2337     {
2338       struct small_page_entry *page, *next_page;
2339       struct large_page_entry *large_page, *next_large_page;
2340
2341       zone->allocated = 0;
2342
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;
2348
2349       /* Move all the small pages onto the free list.  */
2350       for (page = zone->pages; page != NULL; page = next_page)
2351         {
2352           next_page = page->next;
2353           memset (page->alloc_bits, 0,
2354                   G.small_page_overhead - PAGE_OVERHEAD);
2355           free_small_page (page);
2356         }
2357
2358       /* Discard all the large pages.  */
2359       for (large_page = zone->large_pages; large_page != NULL;
2360            large_page = next_large_page)
2361         {
2362           next_large_page = large_page->next;
2363           free_large_page (large_page);
2364         }
2365
2366       zone->pages = NULL;
2367       zone->large_pages = NULL;
2368     }
2369
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;
2375
2376   for (p = pch_zone.page; p < pch_zone.end; p += GGC_PAGE_SIZE)
2377     set_page_table_entry (p, pch_page);
2378 }