OSDN Git Service

2009-05-26 Basile Starynkevitch <basile@starynkevitch.net>
[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, 2008
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 #include "plugin.h"
40
41 /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
42    file open.  Prefer either to valloc.  */
43 #ifdef HAVE_MMAP_ANON
44 # undef HAVE_MMAP_DEV_ZERO
45
46 # include <sys/mman.h>
47 # ifndef MAP_FAILED
48 #  define MAP_FAILED -1
49 # endif
50 # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
51 #  define MAP_ANONYMOUS MAP_ANON
52 # endif
53 # define USING_MMAP
54 #endif
55
56 #ifdef HAVE_MMAP_DEV_ZERO
57 # include <sys/mman.h>
58 # ifndef MAP_FAILED
59 #  define MAP_FAILED -1
60 # endif
61 # define USING_MMAP
62 #endif
63
64 #ifndef USING_MMAP
65 #error Zone collector requires mmap
66 #endif
67
68 #if (GCC_VERSION < 3001)
69 #define prefetch(X) ((void) X)
70 #define prefetchw(X) ((void) X)
71 #else
72 #define prefetch(X) __builtin_prefetch (X)
73 #define prefetchw(X) __builtin_prefetch (X, 1, 3)
74 #endif
75
76 /* FUTURE NOTES:
77
78    If we track inter-zone pointers, we can mark single zones at a
79    time.
80
81    If we have a zone where we guarantee no inter-zone pointers, we
82    could mark that zone separately.
83
84    The garbage zone should not be marked, and we should return 1 in
85    ggc_set_mark for any object in the garbage zone, which cuts off
86    marking quickly.  */
87
88 /* Strategy:
89
90    This garbage-collecting allocator segregates objects into zones.
91    It also segregates objects into "large" and "small" bins.  Large
92    objects are greater than page size.
93
94    Pages for small objects are broken up into chunks.  The page has
95    a bitmap which marks the start position of each chunk (whether
96    allocated or free).  Free chunks are on one of the zone's free
97    lists and contain a pointer to the next free chunk.  Chunks in
98    most of the free lists have a fixed size determined by the
99    free list.  Chunks in the "other" sized free list have their size
100    stored right after their chain pointer.
101
102    Empty pages (of all sizes) are kept on a single page cache list,
103    and are considered first when new pages are required; they are
104    deallocated at the start of the next collection if they haven't
105    been recycled by then.  The free page list is currently per-zone.  */
106
107 /* Define GGC_DEBUG_LEVEL to print debugging information.
108      0: No debugging output.
109      1: GC statistics only.
110      2: Page-entry allocations/deallocations as well.
111      3: Object allocations as well.
112      4: Object marks as well.  */
113 #define GGC_DEBUG_LEVEL (0)
114
115 #ifndef HOST_BITS_PER_PTR
116 #define HOST_BITS_PER_PTR  HOST_BITS_PER_LONG
117 #endif
118
119 /* This structure manages small free chunks.  The SIZE field is only
120    initialized if the chunk is in the "other" sized free list.  Large
121    chunks are allocated one at a time to their own page, and so don't
122    come in here.  */
123
124 struct alloc_chunk {
125   struct alloc_chunk *next_free;
126   unsigned int size;
127 };
128
129 /* The size of the fixed-size portion of a small page descriptor.  */
130 #define PAGE_OVERHEAD   (offsetof (struct small_page_entry, alloc_bits))
131
132 /* The collector's idea of the page size.  This must be a power of two
133    no larger than the system page size, because pages must be aligned
134    to this amount and are tracked at this granularity in the page
135    table.  We choose a size at compile time for efficiency.
136
137    We could make a better guess at compile time if PAGE_SIZE is a
138    constant in system headers, and PAGE_SHIFT is defined...  */
139 #define GGC_PAGE_SIZE   4096
140 #define GGC_PAGE_MASK   (GGC_PAGE_SIZE - 1)
141 #define GGC_PAGE_SHIFT  12
142
143 #if 0
144 /* Alternative definitions which use the runtime page size.  */
145 #define GGC_PAGE_SIZE   G.pagesize
146 #define GGC_PAGE_MASK   G.page_mask
147 #define GGC_PAGE_SHIFT  G.lg_pagesize
148 #endif
149
150 /* The size of a small page managed by the garbage collector.  This
151    must currently be GGC_PAGE_SIZE, but with a few changes could
152    be any multiple of it to reduce certain kinds of overhead.  */
153 #define SMALL_PAGE_SIZE GGC_PAGE_SIZE
154
155 /* Free bin information.  These numbers may be in need of re-tuning.
156    In general, decreasing the number of free bins would seem to
157    increase the time it takes to allocate... */
158
159 /* FIXME: We can't use anything but MAX_ALIGNMENT for the bin size
160    today.  */
161
162 #define NUM_FREE_BINS           64
163 #define FREE_BIN_DELTA          MAX_ALIGNMENT
164 #define SIZE_BIN_DOWN(SIZE)     ((SIZE) / FREE_BIN_DELTA)
165
166 /* Allocation and marking parameters.  */
167
168 /* The smallest allocatable unit to keep track of.  */
169 #define BYTES_PER_ALLOC_BIT     MAX_ALIGNMENT
170
171 /* The smallest markable unit.  If we require each allocated object
172    to contain at least two allocatable units, we can use half as many
173    bits for the mark bitmap.  But this adds considerable complexity
174    to sweeping.  */
175 #define BYTES_PER_MARK_BIT      BYTES_PER_ALLOC_BIT
176
177 #define BYTES_PER_MARK_WORD     (8 * BYTES_PER_MARK_BIT * sizeof (mark_type))
178
179 /* We use this structure to determine the alignment required for
180    allocations.
181
182    There are several things wrong with this estimation of alignment.
183
184    The maximum alignment for a structure is often less than the
185    maximum alignment for a basic data type; for instance, on some
186    targets long long must be aligned to sizeof (int) in a structure
187    and sizeof (long long) in a variable.  i386-linux is one example;
188    Darwin is another (sometimes, depending on the compiler in use).
189
190    Also, long double is not included.  Nothing in GCC uses long
191    double, so we assume that this is OK.  On powerpc-darwin, adding
192    long double would bring the maximum alignment up to 16 bytes,
193    and until we need long double (or to vectorize compiler operations)
194    that's painfully wasteful.  This will need to change, some day.  */
195
196 struct max_alignment {
197   char c;
198   union {
199     HOST_WIDEST_INT i;
200     double d;
201   } u;
202 };
203
204 /* The biggest alignment required.  */
205
206 #define MAX_ALIGNMENT (offsetof (struct max_alignment, u))
207
208 /* Compute the smallest multiple of F that is >= X.  */
209
210 #define ROUND_UP(x, f) (CEIL (x, f) * (f))
211
212 /* Types to use for the allocation and mark bitmaps.  It might be
213    a good idea to add ffsl to libiberty and use unsigned long
214    instead; that could speed us up where long is wider than int.  */
215
216 typedef unsigned int alloc_type;
217 typedef unsigned int mark_type;
218 #define alloc_ffs(x) ffs(x)
219
220 /* A page_entry records the status of an allocation page.  This is the
221    common data between all three kinds of pages - small, large, and
222    PCH.  */
223 typedef struct page_entry
224 {
225   /* The address at which the memory is allocated.  */
226   char *page;
227
228   /* The zone that this page entry belongs to.  */
229   struct alloc_zone *zone;
230
231 #ifdef GATHER_STATISTICS
232   /* How many collections we've survived.  */
233   size_t survived;
234 #endif
235
236   /* Does this page contain small objects, or one large object?  */
237   bool large_p;
238
239   /* Is this page part of the loaded PCH?  */
240   bool pch_p;
241 } page_entry;
242
243 /* Additional data needed for small pages.  */
244 struct small_page_entry
245 {
246   struct page_entry common;
247
248   /* The next small page entry, or NULL if this is the last.  */
249   struct small_page_entry *next;
250
251   /* If currently marking this zone, a pointer to the mark bits
252      for this page.  If we aren't currently marking this zone,
253      this pointer may be stale (pointing to freed memory).  */
254   mark_type *mark_bits;
255
256   /* The allocation bitmap.  This array extends far enough to have
257      one bit for every BYTES_PER_ALLOC_BIT bytes in the page.  */
258   alloc_type alloc_bits[1];
259 };
260
261 /* Additional data needed for large pages.  */
262 struct large_page_entry
263 {
264   struct page_entry common;
265
266   /* The next large page entry, or NULL if this is the last.  */
267   struct large_page_entry *next;
268
269   /* The number of bytes allocated, not including the page entry.  */
270   size_t bytes;
271
272   /* The previous page in the list, so that we can unlink this one.  */
273   struct large_page_entry *prev;
274
275   /* During marking, is this object marked?  */
276   bool mark_p;
277 };
278
279 /* A two-level tree is used to look up the page-entry for a given
280    pointer.  Two chunks of the pointer's bits are extracted to index
281    the first and second levels of the tree, as follows:
282
283                                    HOST_PAGE_SIZE_BITS
284                            32           |      |
285        msb +----------------+----+------+------+ lsb
286                             |    |      |
287                          PAGE_L1_BITS   |
288                                  |      |
289                                PAGE_L2_BITS
290
291    The bottommost HOST_PAGE_SIZE_BITS are ignored, since page-entry
292    pages are aligned on system page boundaries.  The next most
293    significant PAGE_L2_BITS and PAGE_L1_BITS are the second and first
294    index values in the lookup table, respectively.
295
296    For 32-bit architectures and the settings below, there are no
297    leftover bits.  For architectures with wider pointers, the lookup
298    tree points to a list of pages, which must be scanned to find the
299    correct one.  */
300
301 #define PAGE_L1_BITS    (8)
302 #define PAGE_L2_BITS    (32 - PAGE_L1_BITS - GGC_PAGE_SHIFT)
303 #define PAGE_L1_SIZE    ((size_t) 1 << PAGE_L1_BITS)
304 #define PAGE_L2_SIZE    ((size_t) 1 << PAGE_L2_BITS)
305
306 #define LOOKUP_L1(p) \
307   (((size_t) (p) >> (32 - PAGE_L1_BITS)) & ((1 << PAGE_L1_BITS) - 1))
308
309 #define LOOKUP_L2(p) \
310   (((size_t) (p) >> GGC_PAGE_SHIFT) & ((1 << PAGE_L2_BITS) - 1))
311
312 #if HOST_BITS_PER_PTR <= 32
313
314 /* On 32-bit hosts, we use a two level page table, as pictured above.  */
315 typedef page_entry **page_table[PAGE_L1_SIZE];
316
317 #else
318
319 /* On 64-bit hosts, we use the same two level page tables plus a linked
320    list that disambiguates the top 32-bits.  There will almost always be
321    exactly one entry in the list.  */
322 typedef struct page_table_chain
323 {
324   struct page_table_chain *next;
325   size_t high_bits;
326   page_entry **table[PAGE_L1_SIZE];
327 } *page_table;
328
329 #endif
330
331 /* The global variables.  */
332 static struct globals
333 {
334   /* The linked list of zones.  */
335   struct alloc_zone *zones;
336
337   /* Lookup table for associating allocation pages with object addresses.  */
338   page_table lookup;
339
340   /* The system's page size, and related constants.  */
341   size_t pagesize;
342   size_t lg_pagesize;
343   size_t page_mask;
344
345   /* The size to allocate for a small page entry.  This includes
346      the size of the structure and the size of the allocation
347      bitmap.  */
348   size_t small_page_overhead;
349
350 #if defined (HAVE_MMAP_DEV_ZERO)
351   /* A file descriptor open to /dev/zero for reading.  */
352   int dev_zero_fd;
353 #endif
354
355   /* Allocate pages in chunks of this size, to throttle calls to memory
356      allocation routines.  The first page is used, the rest go onto the
357      free list.  */
358   size_t quire_size;
359
360   /* The file descriptor for debugging output.  */
361   FILE *debug_file;
362 } G;
363
364 /* A zone allocation structure.  There is one of these for every
365    distinct allocation zone.  */
366 struct alloc_zone
367 {
368   /* The most recent free chunk is saved here, instead of in the linked
369      free list, to decrease list manipulation.  It is most likely that we
370      will want this one.  */
371   char *cached_free;
372   size_t cached_free_size;
373
374   /* Linked lists of free storage.  Slots 1 ... NUM_FREE_BINS have chunks of size
375      FREE_BIN_DELTA.  All other chunks are in slot 0.  */
376   struct alloc_chunk *free_chunks[NUM_FREE_BINS + 1];
377
378   /* The highest bin index which might be non-empty.  It may turn out
379      to be empty, in which case we have to search downwards.  */
380   size_t high_free_bin;
381
382   /* Bytes currently allocated in this zone.  */
383   size_t allocated;
384
385   /* Linked list of the small pages in this zone.  */
386   struct small_page_entry *pages;
387
388   /* Doubly linked list of large pages in this zone.  */
389   struct large_page_entry *large_pages;
390
391   /* If we are currently marking this zone, a pointer to the mark bits.  */
392   mark_type *mark_bits;
393
394   /* Name of the zone.  */
395   const char *name;
396
397   /* The number of small pages currently allocated in this zone.  */
398   size_t n_small_pages;
399
400   /* Bytes allocated at the end of the last collection.  */
401   size_t allocated_last_gc;
402
403   /* Total amount of memory mapped.  */
404   size_t bytes_mapped;
405
406   /* A cache of free system pages.  */
407   struct small_page_entry *free_pages;
408
409   /* Next zone in the linked list of zones.  */
410   struct alloc_zone *next_zone;
411
412   /* True if this zone was collected during this collection.  */
413   bool was_collected;
414
415   /* True if this zone should be destroyed after the next collection.  */
416   bool dead;
417
418 #ifdef GATHER_STATISTICS
419   struct
420   {
421     /* Total memory allocated with ggc_alloc.  */
422     unsigned long long total_allocated;
423     /* Total overhead for memory to be allocated with ggc_alloc.  */
424     unsigned long long total_overhead;
425
426     /* Total allocations and overhead for sizes less than 32, 64 and 128.
427        These sizes are interesting because they are typical cache line
428        sizes.  */
429    
430     unsigned long long total_allocated_under32;
431     unsigned long long total_overhead_under32;
432   
433     unsigned long long total_allocated_under64;
434     unsigned long long total_overhead_under64;
435   
436     unsigned long long total_allocated_under128;
437     unsigned long long total_overhead_under128;
438   } stats;
439 #endif
440 } main_zone;
441
442 /* Some default zones.  */
443 struct alloc_zone rtl_zone;
444 struct alloc_zone tree_zone;
445 struct alloc_zone tree_id_zone;
446
447 /* The PCH zone does not need a normal zone structure, and it does
448    not live on the linked list of zones.  */
449 struct pch_zone
450 {
451   /* The start of the PCH zone.  NULL if there is none.  */
452   char *page;
453
454   /* The end of the PCH zone.  NULL if there is none.  */
455   char *end;
456
457   /* The size of the PCH zone.  0 if there is none.  */
458   size_t bytes;
459
460   /* The allocation bitmap for the PCH zone.  */
461   alloc_type *alloc_bits;
462
463   /* If we are currently marking, the mark bitmap for the PCH zone.
464      When it is first read in, we could avoid marking the PCH,
465      because it will not contain any pointers to GC memory outside
466      of the PCH; however, the PCH is currently mapped as writable,
467      so we must mark it in case new pointers are added.  */
468   mark_type *mark_bits;
469 } pch_zone;
470
471 #ifdef USING_MMAP
472 static char *alloc_anon (char *, size_t, struct alloc_zone *);
473 #endif
474 static struct small_page_entry * alloc_small_page (struct alloc_zone *);
475 static struct large_page_entry * alloc_large_page (size_t, struct alloc_zone *);
476 static void free_chunk (char *, size_t, struct alloc_zone *);
477 static void free_small_page (struct small_page_entry *);
478 static void free_large_page (struct large_page_entry *);
479 static void release_pages (struct alloc_zone *);
480 static void sweep_pages (struct alloc_zone *);
481 static bool ggc_collect_1 (struct alloc_zone *, bool);
482 static void new_ggc_zone_1 (struct alloc_zone *, const char *);
483
484 /* Traverse the page table and find the entry for a page.
485    Die (probably) if the object wasn't allocated via GC.  */
486
487 static inline page_entry *
488 lookup_page_table_entry (const void *p)
489 {
490   page_entry ***base;
491   size_t L1, L2;
492
493 #if HOST_BITS_PER_PTR <= 32
494   base = &G.lookup[0];
495 #else
496   page_table table = G.lookup;
497   size_t high_bits = (size_t) p & ~ (size_t) 0xffffffff;
498   while (table->high_bits != high_bits)
499     table = table->next;
500   base = &table->table[0];
501 #endif
502
503   /* Extract the level 1 and 2 indices.  */
504   L1 = LOOKUP_L1 (p);
505   L2 = LOOKUP_L2 (p);
506
507   return base[L1][L2];
508 }
509
510 /* Traverse the page table and find the entry for a page.
511    Return NULL if the object wasn't allocated via the GC.  */
512
513 static inline page_entry *
514 lookup_page_table_if_allocated (const void *p)
515 {
516   page_entry ***base;
517   size_t L1, L2;
518
519 #if HOST_BITS_PER_PTR <= 32
520   base = &G.lookup[0];
521 #else
522   page_table table = G.lookup;
523   size_t high_bits = (size_t) p & ~ (size_t) 0xffffffff;
524   while (1)
525     {
526       if (table == NULL)
527         return NULL;
528       if (table->high_bits == high_bits)
529         break;
530       table = table->next;
531     }
532   base = &table->table[0];
533 #endif
534
535   /* Extract the level 1 and 2 indices.  */
536   L1 = LOOKUP_L1 (p);
537   if (! base[L1])
538     return NULL;
539
540   L2 = LOOKUP_L2 (p);
541   if (L2 >= PAGE_L2_SIZE)
542     return NULL;
543   /* We might have a page entry which does not correspond exactly to a
544      system page.  */
545   if (base[L1][L2] && (const char *) p < base[L1][L2]->page)
546     return NULL;
547
548   return base[L1][L2];
549 }
550
551 /* Set the page table entry for the page that starts at P.  If ENTRY
552    is NULL, clear the entry.  */
553
554 static void
555 set_page_table_entry (void *p, page_entry *entry)
556 {
557   page_entry ***base;
558   size_t L1, L2;
559
560 #if HOST_BITS_PER_PTR <= 32
561   base = &G.lookup[0];
562 #else
563   page_table table;
564   size_t high_bits = (size_t) p & ~ (size_t) 0xffffffff;
565   for (table = G.lookup; table; table = table->next)
566     if (table->high_bits == high_bits)
567       goto found;
568
569   /* Not found -- allocate a new table.  */
570   table = XCNEW (struct page_table_chain);
571   table->next = G.lookup;
572   table->high_bits = high_bits;
573   G.lookup = table;
574 found:
575   base = &table->table[0];
576 #endif
577
578   /* Extract the level 1 and 2 indices.  */
579   L1 = LOOKUP_L1 (p);
580   L2 = LOOKUP_L2 (p);
581
582   if (base[L1] == NULL)
583     base[L1] = XCNEWVEC (page_entry *, PAGE_L2_SIZE);
584
585   base[L1][L2] = entry;
586 }
587
588 /* Find the page table entry associated with OBJECT.  */
589
590 static inline struct page_entry *
591 zone_get_object_page (const void *object)
592 {
593   return lookup_page_table_entry (object);
594 }
595
596 /* Find which element of the alloc_bits array OBJECT should be
597    recorded in.  */
598 static inline unsigned int
599 zone_get_object_alloc_word (const void *object)
600 {
601   return (((size_t) object & (GGC_PAGE_SIZE - 1))
602           / (8 * sizeof (alloc_type) * BYTES_PER_ALLOC_BIT));
603 }
604
605 /* Find which bit of the appropriate word in the alloc_bits array
606    OBJECT should be recorded in.  */
607 static inline unsigned int
608 zone_get_object_alloc_bit (const void *object)
609 {
610   return (((size_t) object / BYTES_PER_ALLOC_BIT)
611           % (8 * sizeof (alloc_type)));
612 }
613
614 /* Find which element of the mark_bits array OBJECT should be recorded
615    in.  */
616 static inline unsigned int
617 zone_get_object_mark_word (const void *object)
618 {
619   return (((size_t) object & (GGC_PAGE_SIZE - 1))
620           / (8 * sizeof (mark_type) * BYTES_PER_MARK_BIT));
621 }
622
623 /* Find which bit of the appropriate word in the mark_bits array
624    OBJECT should be recorded in.  */
625 static inline unsigned int
626 zone_get_object_mark_bit (const void *object)
627 {
628   return (((size_t) object / BYTES_PER_MARK_BIT)
629           % (8 * sizeof (mark_type)));
630 }
631
632 /* Set the allocation bit corresponding to OBJECT in its page's
633    bitmap.  Used to split this object from the preceding one.  */
634 static inline void
635 zone_set_object_alloc_bit (const void *object)
636 {
637   struct small_page_entry *page
638     = (struct small_page_entry *) zone_get_object_page (object);
639   unsigned int start_word = zone_get_object_alloc_word (object);
640   unsigned int start_bit = zone_get_object_alloc_bit (object);
641
642   page->alloc_bits[start_word] |= 1L << start_bit;
643 }
644
645 /* Clear the allocation bit corresponding to OBJECT in PAGE's
646    bitmap.  Used to coalesce this object with the preceding
647    one.  */
648 static inline void
649 zone_clear_object_alloc_bit (struct small_page_entry *page,
650                              const void *object)
651 {
652   unsigned int start_word = zone_get_object_alloc_word (object);
653   unsigned int start_bit = zone_get_object_alloc_bit (object);
654
655   /* Would xor be quicker?  */
656   page->alloc_bits[start_word] &= ~(1L << start_bit);
657 }
658
659 /* Find the size of the object which starts at START_WORD and
660    START_BIT in ALLOC_BITS, which is at most MAX_SIZE bytes.
661    Helper function for ggc_get_size and zone_find_object_size.  */
662
663 static inline size_t
664 zone_object_size_1 (alloc_type *alloc_bits,
665                     size_t start_word, size_t start_bit,
666                     size_t max_size)
667 {
668   size_t size;
669   alloc_type alloc_word;
670   int indx;
671
672   /* Load the first word.  */
673   alloc_word = alloc_bits[start_word++];
674
675   /* If that was the last bit in this word, we'll want to continue
676      with the next word.  Otherwise, handle the rest of this word.  */
677   if (start_bit)
678     {
679       indx = alloc_ffs (alloc_word >> start_bit);
680       if (indx)
681         /* indx is 1-based.  We started at the bit after the object's
682            start, but we also ended at the bit after the object's end.
683            It cancels out.  */
684         return indx * BYTES_PER_ALLOC_BIT;
685
686       /* The extra 1 accounts for the starting unit, before start_bit.  */
687       size = (sizeof (alloc_type) * 8 - start_bit + 1) * BYTES_PER_ALLOC_BIT;
688
689       if (size >= max_size)
690         return max_size;
691
692       alloc_word = alloc_bits[start_word++];
693     }
694   else
695     size = BYTES_PER_ALLOC_BIT;
696
697   while (alloc_word == 0)
698     {
699       size += sizeof (alloc_type) * 8 * BYTES_PER_ALLOC_BIT;
700       if (size >= max_size)
701         return max_size;
702       alloc_word = alloc_bits[start_word++];
703     }
704
705   indx = alloc_ffs (alloc_word);
706   return size + (indx - 1) * BYTES_PER_ALLOC_BIT;
707 }
708
709 /* Find the size of OBJECT on small page PAGE.  */
710
711 static inline size_t
712 zone_find_object_size (struct small_page_entry *page,
713                        const void *object)
714 {
715   const char *object_midptr = (const char *) object + BYTES_PER_ALLOC_BIT;
716   unsigned int start_word = zone_get_object_alloc_word (object_midptr);
717   unsigned int start_bit = zone_get_object_alloc_bit (object_midptr);
718   size_t max_size = (page->common.page + SMALL_PAGE_SIZE
719                      - (const char *) object);
720
721   return zone_object_size_1 (page->alloc_bits, start_word, start_bit,
722                              max_size);
723 }
724
725 /* highest_bit assumes that alloc_type is 32 bits.  */
726 extern char check_alloc_type_size[(sizeof (alloc_type) == 4) ? 1 : -1];
727
728 /* Find the highest set bit in VALUE.  Returns the bit number of that
729    bit, using the same values as ffs.  */
730 static inline alloc_type
731 highest_bit (alloc_type value)
732 {
733   /* This also assumes that alloc_type is unsigned.  */
734   value |= value >> 1;
735   value |= value >> 2;
736   value |= value >> 4;
737   value |= value >> 8;
738   value |= value >> 16;
739   value = value ^ (value >> 1);
740   return alloc_ffs (value);
741 }
742
743 /* Find the offset from the start of an object to P, which may point
744    into the interior of the object.  */
745
746 static unsigned long
747 zone_find_object_offset (alloc_type *alloc_bits, size_t start_word,
748                          size_t start_bit)
749 {
750   unsigned int offset_in_bits;
751   alloc_type alloc_word = alloc_bits[start_word];
752
753   /* Mask off any bits after the initial bit, but make sure to include
754      the initial bit in the result.  Note that START_BIT is
755      0-based.  */
756   if (start_bit < 8 * sizeof (alloc_type) - 1)
757     alloc_word &= (1 << (start_bit + 1)) - 1;
758   offset_in_bits = start_bit;
759
760   /* Search for the start of the object.  */
761   while (alloc_word == 0 && start_word > 0)
762     {
763       alloc_word = alloc_bits[--start_word];
764       offset_in_bits += 8 * sizeof (alloc_type);
765     }
766   /* We must always find a set bit.  */
767   gcc_assert (alloc_word != 0);
768   /* Note that the result of highest_bit is 1-based.  */
769   offset_in_bits -= highest_bit (alloc_word) - 1;
770
771   return BYTES_PER_ALLOC_BIT * offset_in_bits;
772 }
773
774 /* Allocate the mark bits for every zone, and set the pointers on each
775    page.  */
776 static void
777 zone_allocate_marks (void)
778 {
779   struct alloc_zone *zone;
780
781   for (zone = G.zones; zone; zone = zone->next_zone)
782     {
783       struct small_page_entry *page;
784       mark_type *cur_marks;
785       size_t mark_words, mark_words_per_page;
786 #ifdef ENABLE_CHECKING
787       size_t n = 0;
788 #endif
789
790       mark_words_per_page
791         = (GGC_PAGE_SIZE + BYTES_PER_MARK_WORD - 1) / BYTES_PER_MARK_WORD;
792       mark_words = zone->n_small_pages * mark_words_per_page;
793       zone->mark_bits = (mark_type *) xcalloc (sizeof (mark_type),
794                                                    mark_words);
795       cur_marks = zone->mark_bits;
796       for (page = zone->pages; page; page = page->next)
797         {
798           page->mark_bits = cur_marks;
799           cur_marks += mark_words_per_page;
800 #ifdef ENABLE_CHECKING
801           n++;
802 #endif
803         }
804 #ifdef ENABLE_CHECKING
805       gcc_assert (n == zone->n_small_pages);
806 #endif
807     }
808
809   /* We don't collect the PCH zone, but we do have to mark it
810      (for now).  */
811   if (pch_zone.bytes)
812     pch_zone.mark_bits
813       = (mark_type *) xcalloc (sizeof (mark_type),
814                                CEIL (pch_zone.bytes, BYTES_PER_MARK_WORD));
815 }
816
817 /* After marking and sweeping, release the memory used for mark bits.  */
818 static void
819 zone_free_marks (void)
820 {
821   struct alloc_zone *zone;
822
823   for (zone = G.zones; zone; zone = zone->next_zone)
824     if (zone->mark_bits)
825       {
826         free (zone->mark_bits);
827         zone->mark_bits = NULL;
828       }
829
830   if (pch_zone.bytes)
831     {
832       free (pch_zone.mark_bits);
833       pch_zone.mark_bits = NULL;
834     }
835 }
836
837 #ifdef USING_MMAP
838 /* Allocate SIZE bytes of anonymous memory, preferably near PREF,
839    (if non-null).  The ifdef structure here is intended to cause a
840    compile error unless exactly one of the HAVE_* is defined.  */
841
842 static inline char *
843 alloc_anon (char *pref ATTRIBUTE_UNUSED, size_t size, struct alloc_zone *zone)
844 {
845 #ifdef HAVE_MMAP_ANON
846   char *page = (char *) mmap (pref, size, PROT_READ | PROT_WRITE,
847                               MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
848 #endif
849 #ifdef HAVE_MMAP_DEV_ZERO
850   char *page = (char *) mmap (pref, size, PROT_READ | PROT_WRITE,
851                               MAP_PRIVATE, G.dev_zero_fd, 0);
852 #endif
853
854   if (page == (char *) MAP_FAILED)
855     {
856       perror ("virtual memory exhausted");
857       exit (FATAL_EXIT_CODE);
858     }
859
860   /* Remember that we allocated this memory.  */
861   zone->bytes_mapped += size;
862
863   /* Pretend we don't have access to the allocated pages.  We'll enable
864      access to smaller pieces of the area in ggc_alloc.  Discard the
865      handle to avoid handle leak.  */
866   VALGRIND_DISCARD (VALGRIND_MAKE_MEM_NOACCESS (page, size));
867
868   return page;
869 }
870 #endif
871
872 /* Allocate a new page for allocating small objects in ZONE, and
873    return an entry for it.  */
874
875 static struct small_page_entry *
876 alloc_small_page (struct alloc_zone *zone)
877 {
878   struct small_page_entry *entry;
879
880   /* Check the list of free pages for one we can use.  */
881   entry = zone->free_pages;
882   if (entry != NULL)
883     {
884       /* Recycle the allocated memory from this page ...  */
885       zone->free_pages = entry->next;
886     }
887   else
888     {
889       /* We want just one page.  Allocate a bunch of them and put the
890          extras on the freelist.  (Can only do this optimization with
891          mmap for backing store.)  */
892       struct small_page_entry *e, *f = zone->free_pages;
893       int i;
894       char *page;
895
896       page = alloc_anon (NULL, GGC_PAGE_SIZE * G.quire_size, zone);
897
898       /* This loop counts down so that the chain will be in ascending
899          memory order.  */
900       for (i = G.quire_size - 1; i >= 1; i--)
901         {
902           e = XCNEWVAR (struct small_page_entry, G.small_page_overhead);
903           e->common.page = page + (i << GGC_PAGE_SHIFT);
904           e->common.zone = zone;
905           e->next = f;
906           f = e;
907           set_page_table_entry (e->common.page, &e->common);
908         }
909
910       zone->free_pages = f;
911
912       entry = XCNEWVAR (struct small_page_entry, G.small_page_overhead);
913       entry->common.page = page;
914       entry->common.zone = zone;
915       set_page_table_entry (page, &entry->common);
916     }
917
918   zone->n_small_pages++;
919
920   if (GGC_DEBUG_LEVEL >= 2)
921     fprintf (G.debug_file,
922              "Allocating %s page at %p, data %p-%p\n",
923              entry->common.zone->name, (PTR) entry, entry->common.page,
924              entry->common.page + SMALL_PAGE_SIZE - 1);
925
926   return entry;
927 }
928
929 /* Allocate a large page of size SIZE in ZONE.  */
930
931 static struct large_page_entry *
932 alloc_large_page (size_t size, struct alloc_zone *zone)
933 {
934   struct large_page_entry *entry;
935   char *page;
936   size_t needed_size;
937
938   needed_size = size + sizeof (struct large_page_entry);
939   page = XNEWVAR (char, needed_size);
940
941   entry = (struct large_page_entry *) page;
942
943   entry->next = NULL;
944   entry->common.page = page + sizeof (struct large_page_entry);
945   entry->common.large_p = true;
946   entry->common.pch_p = false;
947   entry->common.zone = zone;
948 #ifdef GATHER_STATISTICS
949   entry->common.survived = 0;
950 #endif
951   entry->mark_p = false;
952   entry->bytes = size;
953   entry->prev = NULL;
954
955   set_page_table_entry (entry->common.page, &entry->common);
956
957   if (GGC_DEBUG_LEVEL >= 2)
958     fprintf (G.debug_file,
959              "Allocating %s large page at %p, data %p-%p\n",
960              entry->common.zone->name, (PTR) entry, entry->common.page,
961              entry->common.page + SMALL_PAGE_SIZE - 1);
962
963   return entry;
964 }
965
966
967 /* For a page that is no longer needed, put it on the free page list.  */
968
969 static inline void
970 free_small_page (struct small_page_entry *entry)
971 {
972   if (GGC_DEBUG_LEVEL >= 2)
973     fprintf (G.debug_file,
974              "Deallocating %s page at %p, data %p-%p\n",
975              entry->common.zone->name, (PTR) entry,
976              entry->common.page, entry->common.page + SMALL_PAGE_SIZE - 1);
977
978   gcc_assert (!entry->common.large_p);
979
980   /* Mark the page as inaccessible.  Discard the handle to
981      avoid handle leak.  */
982   VALGRIND_DISCARD (VALGRIND_MAKE_MEM_NOACCESS (entry->common.page,
983                                                 SMALL_PAGE_SIZE));
984
985   entry->next = entry->common.zone->free_pages;
986   entry->common.zone->free_pages = entry;
987   entry->common.zone->n_small_pages--;
988 }
989
990 /* Release a large page that is no longer needed.  */
991
992 static inline void
993 free_large_page (struct large_page_entry *entry)
994 {
995   if (GGC_DEBUG_LEVEL >= 2)
996     fprintf (G.debug_file,
997              "Deallocating %s page at %p, data %p-%p\n",
998              entry->common.zone->name, (PTR) entry,
999              entry->common.page, entry->common.page + SMALL_PAGE_SIZE - 1);
1000
1001   gcc_assert (entry->common.large_p);
1002
1003   set_page_table_entry (entry->common.page, NULL);
1004   free (entry);
1005 }
1006
1007 /* Release the free page cache to the system.  */
1008
1009 static void
1010 release_pages (struct alloc_zone *zone)
1011 {
1012 #ifdef USING_MMAP
1013   struct small_page_entry *p, *next;
1014   char *start;
1015   size_t len;
1016
1017   /* Gather up adjacent pages so they are unmapped together.  */
1018   p = zone->free_pages;
1019
1020   while (p)
1021     {
1022       start = p->common.page;
1023       next = p->next;
1024       len = SMALL_PAGE_SIZE;
1025       set_page_table_entry (p->common.page, NULL);
1026       p = next;
1027
1028       while (p && p->common.page == start + len)
1029         {
1030           next = p->next;
1031           len += SMALL_PAGE_SIZE;
1032           set_page_table_entry (p->common.page, NULL);
1033           p = next;
1034         }
1035
1036       munmap (start, len);
1037       zone->bytes_mapped -= len;
1038     }
1039
1040   zone->free_pages = NULL;
1041 #endif
1042 }
1043
1044 /* Place the block at PTR of size SIZE on the free list for ZONE.  */
1045
1046 static inline void
1047 free_chunk (char *ptr, size_t size, struct alloc_zone *zone)
1048 {
1049   struct alloc_chunk *chunk = (struct alloc_chunk *) ptr;
1050   size_t bin = 0;
1051
1052   bin = SIZE_BIN_DOWN (size);
1053   gcc_assert (bin != 0);
1054   if (bin > NUM_FREE_BINS)
1055     {
1056       bin = 0;
1057       VALGRIND_DISCARD (VALGRIND_MAKE_MEM_UNDEFINED (chunk,
1058                                                      sizeof (struct
1059                                                              alloc_chunk)));
1060       chunk->size = size;
1061       chunk->next_free = zone->free_chunks[bin];
1062       VALGRIND_DISCARD (VALGRIND_MAKE_MEM_NOACCESS (ptr
1063                                                     + sizeof (struct
1064                                                               alloc_chunk),
1065                                                     size
1066                                                     - sizeof (struct
1067                                                               alloc_chunk)));
1068     }
1069   else
1070     {
1071       VALGRIND_DISCARD (VALGRIND_MAKE_MEM_UNDEFINED (chunk,
1072                                                      sizeof (struct
1073                                                              alloc_chunk *)));
1074       chunk->next_free = zone->free_chunks[bin];
1075       VALGRIND_DISCARD (VALGRIND_MAKE_MEM_NOACCESS (ptr
1076                                                     + sizeof (struct
1077                                                               alloc_chunk *),
1078                                                     size
1079                                                     - sizeof (struct
1080                                                               alloc_chunk *)));
1081     }
1082
1083   zone->free_chunks[bin] = chunk;
1084   if (bin > zone->high_free_bin)
1085     zone->high_free_bin = bin;
1086   if (GGC_DEBUG_LEVEL >= 3)
1087     fprintf (G.debug_file, "Deallocating object, chunk=%p\n", (void *)chunk);
1088 }
1089
1090 /* Allocate a chunk of memory of at least ORIG_SIZE bytes, in ZONE.  */
1091
1092 void *
1093 ggc_alloc_zone_stat (size_t orig_size, struct alloc_zone *zone
1094                      MEM_STAT_DECL)
1095 {
1096   size_t bin;
1097   size_t csize;
1098   struct small_page_entry *entry;
1099   struct alloc_chunk *chunk, **pp;
1100   void *result;
1101   size_t size = orig_size;
1102
1103   /* Make sure that zero-sized allocations get a unique and freeable
1104      pointer.  */
1105   if (size == 0)
1106     size = MAX_ALIGNMENT;
1107   else
1108     size = (size + MAX_ALIGNMENT - 1) & -MAX_ALIGNMENT;
1109
1110   /* Try to allocate the object from several different sources.  Each
1111      of these cases is responsible for setting RESULT and SIZE to
1112      describe the allocated block, before jumping to FOUND.  If a
1113      chunk is split, the allocate bit for the new chunk should also be
1114      set.
1115
1116      Large objects are handled specially.  However, they'll just fail
1117      the next couple of conditions, so we can wait to check for them
1118      below.  The large object case is relatively rare (< 1%), so this
1119      is a win.  */
1120
1121   /* First try to split the last chunk we allocated.  For best
1122      fragmentation behavior it would be better to look for a
1123      free bin of the appropriate size for a small object.  However,
1124      we're unlikely (1% - 7%) to find one, and this gives better
1125      locality behavior anyway.  This case handles the lion's share
1126      of all calls to this function.  */
1127   if (size <= zone->cached_free_size)
1128     {
1129       result = zone->cached_free;
1130
1131       zone->cached_free_size -= size;
1132       if (zone->cached_free_size)
1133         {
1134           zone->cached_free += size;
1135           zone_set_object_alloc_bit (zone->cached_free);
1136         }
1137
1138       goto found;
1139     }
1140
1141   /* Next, try to find a free bin of the exactly correct size.  */
1142
1143   /* We want to round SIZE up, rather than down, but we know it's
1144      already aligned to at least FREE_BIN_DELTA, so we can just
1145      shift.  */
1146   bin = SIZE_BIN_DOWN (size);
1147
1148   if (bin <= NUM_FREE_BINS
1149       && (chunk = zone->free_chunks[bin]) != NULL)
1150     {
1151       /* We have a chunk of the right size.  Pull it off the free list
1152          and use it.  */
1153
1154       zone->free_chunks[bin] = chunk->next_free;
1155
1156       /* NOTE: SIZE is only guaranteed to be right if MAX_ALIGNMENT
1157          == FREE_BIN_DELTA.  */
1158       result = chunk;
1159
1160       /* The allocation bits are already set correctly.  HIGH_FREE_BIN
1161          may now be wrong, if this was the last chunk in the high bin.
1162          Rather than fixing it up now, wait until we need to search
1163          the free bins.  */
1164
1165       goto found;
1166     }
1167
1168   /* Next, if there wasn't a chunk of the ideal size, look for a chunk
1169      to split.  We can find one in the too-big bin, or in the largest
1170      sized bin with a chunk in it.  Try the largest normal-sized bin
1171      first.  */
1172
1173   if (zone->high_free_bin > bin)
1174     {
1175       /* Find the highest numbered free bin.  It will be at or below
1176          the watermark.  */
1177       while (zone->high_free_bin > bin
1178              && zone->free_chunks[zone->high_free_bin] == NULL)
1179         zone->high_free_bin--;
1180
1181       if (zone->high_free_bin > bin)
1182         {
1183           size_t tbin = zone->high_free_bin;
1184           chunk = zone->free_chunks[tbin];
1185
1186           /* Remove the chunk from its previous bin.  */
1187           zone->free_chunks[tbin] = chunk->next_free;
1188
1189           result = (char *) chunk;
1190
1191           /* Save the rest of the chunk for future allocation.  */
1192           if (zone->cached_free_size)
1193             free_chunk (zone->cached_free, zone->cached_free_size, zone);
1194
1195           chunk = (struct alloc_chunk *) ((char *) result + size);
1196           zone->cached_free = (char *) chunk;
1197           zone->cached_free_size = (tbin - bin) * FREE_BIN_DELTA;
1198
1199           /* Mark the new free chunk as an object, so that we can
1200              find the size of the newly allocated object.  */
1201           zone_set_object_alloc_bit (chunk);
1202
1203           /* HIGH_FREE_BIN may now be wrong, if this was the last
1204              chunk in the high bin.  Rather than fixing it up now,
1205              wait until we need to search the free bins.  */
1206
1207           goto found;
1208         }
1209     }
1210
1211   /* Failing that, look through the "other" bucket for a chunk
1212      that is large enough.  */
1213   pp = &(zone->free_chunks[0]);
1214   chunk = *pp;
1215   while (chunk && chunk->size < size)
1216     {
1217       pp = &chunk->next_free;
1218       chunk = *pp;
1219     }
1220
1221   if (chunk)
1222     {
1223       /* Remove the chunk from its previous bin.  */
1224       *pp = chunk->next_free;
1225
1226       result = (char *) chunk;
1227
1228       /* Save the rest of the chunk for future allocation, if there's any
1229          left over.  */
1230       csize = chunk->size;
1231       if (csize > size)
1232         {
1233           if (zone->cached_free_size)
1234             free_chunk (zone->cached_free, zone->cached_free_size, zone);
1235
1236           chunk = (struct alloc_chunk *) ((char *) result + size);
1237           zone->cached_free = (char *) chunk;
1238           zone->cached_free_size = csize - size;
1239
1240           /* Mark the new free chunk as an object.  */
1241           zone_set_object_alloc_bit (chunk);
1242         }
1243
1244       goto found;
1245     }
1246
1247   /* Handle large allocations.  We could choose any threshold between
1248      GGC_PAGE_SIZE - sizeof (struct large_page_entry) and
1249      GGC_PAGE_SIZE.  It can't be smaller, because then it wouldn't
1250      be guaranteed to have a unique entry in the lookup table.  Large
1251      allocations will always fall through to here.  */
1252   if (size > GGC_PAGE_SIZE)
1253     {
1254       struct large_page_entry *entry = alloc_large_page (size, zone);
1255
1256 #ifdef GATHER_STATISTICS
1257       entry->common.survived = 0;
1258 #endif
1259
1260       entry->next = zone->large_pages;
1261       if (zone->large_pages)
1262         zone->large_pages->prev = entry;
1263       zone->large_pages = entry;
1264
1265       result = entry->common.page;
1266
1267       goto found;
1268     }
1269
1270   /* Failing everything above, allocate a new small page.  */
1271
1272   entry = alloc_small_page (zone);
1273   entry->next = zone->pages;
1274   zone->pages = entry;
1275
1276   /* Mark the first chunk in the new page.  */
1277   entry->alloc_bits[0] = 1;
1278
1279   result = entry->common.page;
1280   if (size < SMALL_PAGE_SIZE)
1281     {
1282       if (zone->cached_free_size)
1283         free_chunk (zone->cached_free, zone->cached_free_size, zone);
1284
1285       zone->cached_free = (char *) result + size;
1286       zone->cached_free_size = SMALL_PAGE_SIZE - size;
1287
1288       /* Mark the new free chunk as an object.  */
1289       zone_set_object_alloc_bit (zone->cached_free);
1290     }
1291
1292  found:
1293
1294   /* We could save TYPE in the chunk, but we don't use that for
1295      anything yet.  If we wanted to, we could do it by adding it
1296      either before the beginning of the chunk or after its end,
1297      and adjusting the size and pointer appropriately.  */
1298
1299   /* We'll probably write to this after we return.  */
1300   prefetchw (result);
1301
1302 #ifdef ENABLE_GC_CHECKING
1303   /* `Poison' the entire allocated object.  */
1304   VALGRIND_DISCARD (VALGRIND_MAKE_MEM_UNDEFINED (result, size));
1305   memset (result, 0xaf, size);
1306   VALGRIND_DISCARD (VALGRIND_MAKE_MEM_NOACCESS (result + orig_size,
1307                                                 size - orig_size));
1308 #endif
1309
1310   /* Tell Valgrind that the memory is there, but its content isn't
1311      defined.  The bytes at the end of the object are still marked
1312      unaccessible.  */
1313   VALGRIND_DISCARD (VALGRIND_MAKE_MEM_UNDEFINED (result, orig_size));
1314
1315   /* Keep track of how many bytes are being allocated.  This
1316      information is used in deciding when to collect.  */
1317   zone->allocated += size;
1318   
1319   timevar_ggc_mem_total += size;
1320
1321 #ifdef GATHER_STATISTICS
1322   ggc_record_overhead (orig_size, size - orig_size, result PASS_MEM_STAT);
1323
1324   {
1325     size_t object_size = size;
1326     size_t overhead = object_size - orig_size;
1327
1328     zone->stats.total_overhead += overhead;
1329     zone->stats.total_allocated += object_size;
1330
1331     if (orig_size <= 32)
1332       {
1333         zone->stats.total_overhead_under32 += overhead;
1334         zone->stats.total_allocated_under32 += object_size;
1335       }
1336     if (orig_size <= 64)
1337       {
1338         zone->stats.total_overhead_under64 += overhead;
1339         zone->stats.total_allocated_under64 += object_size;
1340       }
1341     if (orig_size <= 128)
1342       {
1343         zone->stats.total_overhead_under128 += overhead;
1344         zone->stats.total_allocated_under128 += object_size;
1345       }
1346   }
1347 #endif
1348
1349   if (GGC_DEBUG_LEVEL >= 3)
1350     fprintf (G.debug_file, "Allocating object, size=%lu at %p\n",
1351              (unsigned long) size, result);
1352
1353   return result;
1354 }
1355
1356 /* Allocate a SIZE of chunk memory of GTE type, into an appropriate zone
1357    for that type.  */
1358
1359 void *
1360 ggc_alloc_typed_stat (enum gt_types_enum gte, size_t size
1361                       MEM_STAT_DECL)
1362 {
1363   switch (gte)
1364     {
1365     case gt_ggc_e_14lang_tree_node:
1366       return ggc_alloc_zone_pass_stat (size, &tree_zone);
1367
1368     case gt_ggc_e_7rtx_def:
1369       return ggc_alloc_zone_pass_stat (size, &rtl_zone);
1370
1371     case gt_ggc_e_9rtvec_def:
1372       return ggc_alloc_zone_pass_stat (size, &rtl_zone);
1373
1374     default:
1375       return ggc_alloc_zone_pass_stat (size, &main_zone);
1376     }
1377 }
1378
1379 /* Normal ggc_alloc simply allocates into the main zone.  */
1380
1381 void *
1382 ggc_alloc_stat (size_t size MEM_STAT_DECL)
1383 {
1384   return ggc_alloc_zone_pass_stat (size, &main_zone);
1385 }
1386
1387 /* Poison the chunk.  */
1388 #ifdef ENABLE_GC_CHECKING
1389 #define poison_region(PTR, SIZE) \
1390   memset ((PTR), 0xa5, (SIZE))
1391 #else
1392 #define poison_region(PTR, SIZE)
1393 #endif
1394
1395 /* Free the object at P.  */
1396
1397 void
1398 ggc_free (void *p)
1399 {
1400   struct page_entry *page;
1401
1402 #ifdef GATHER_STATISTICS
1403   ggc_free_overhead (p);
1404 #endif
1405
1406   poison_region (p, ggc_get_size (p));
1407
1408   page = zone_get_object_page (p);
1409
1410   if (page->large_p)
1411     {
1412       struct large_page_entry *large_page
1413         = (struct large_page_entry *) page;
1414
1415       /* Remove the page from the linked list.  */
1416       if (large_page->prev)
1417         large_page->prev->next = large_page->next;
1418       else
1419         {
1420           gcc_assert (large_page->common.zone->large_pages == large_page);
1421           large_page->common.zone->large_pages = large_page->next;
1422         }
1423       if (large_page->next)
1424         large_page->next->prev = large_page->prev;
1425
1426       large_page->common.zone->allocated -= large_page->bytes;
1427
1428       /* Release the memory associated with this object.  */
1429       free_large_page (large_page);
1430     }
1431   else if (page->pch_p)
1432     /* Don't do anything.  We won't allocate a new object from the
1433        PCH zone so there's no point in releasing anything.  */
1434     ;
1435   else
1436     {
1437       size_t size = ggc_get_size (p);
1438
1439       page->zone->allocated -= size;
1440
1441       /* Add the chunk to the free list.  We don't bother with coalescing,
1442          since we are likely to want a chunk of this size again.  */
1443       free_chunk ((char *)p, size, page->zone);
1444     }
1445 }
1446
1447 /* Mark function for strings.  */
1448
1449 void
1450 gt_ggc_m_S (const void *p)
1451 {
1452   page_entry *entry;
1453   unsigned long offset;
1454
1455   if (!p)
1456     return;
1457
1458   /* Look up the page on which the object is alloced.  .  */
1459   entry = lookup_page_table_if_allocated (p);
1460   if (! entry)
1461     return;
1462
1463   if (entry->pch_p)
1464     {
1465       size_t alloc_word, alloc_bit, t;
1466       t = ((const char *) p - pch_zone.page) / BYTES_PER_ALLOC_BIT;
1467       alloc_word = t / (8 * sizeof (alloc_type));
1468       alloc_bit = t % (8 * sizeof (alloc_type));
1469       offset = zone_find_object_offset (pch_zone.alloc_bits, alloc_word,
1470                                         alloc_bit);
1471     }
1472   else if (entry->large_p)
1473     {
1474       struct large_page_entry *le = (struct large_page_entry *) entry;
1475       offset = ((const char *) p) - entry->page;
1476       gcc_assert (offset < le->bytes);
1477     }
1478   else
1479     {
1480       struct small_page_entry *se = (struct small_page_entry *) entry;
1481       unsigned int start_word = zone_get_object_alloc_word (p);
1482       unsigned int start_bit = zone_get_object_alloc_bit (p);
1483       offset = zone_find_object_offset (se->alloc_bits, start_word, start_bit);
1484
1485       /* On some platforms a char* will not necessarily line up on an
1486          allocation boundary, so we have to update the offset to
1487          account for the leftover bytes.  */
1488       offset += (size_t) p % BYTES_PER_ALLOC_BIT;
1489     }
1490
1491   if (offset)
1492     {
1493       /* Here we've seen a char* which does not point to the beginning
1494          of an allocated object.  We assume it points to the middle of
1495          a STRING_CST.  */
1496       gcc_assert (offset == offsetof (struct tree_string, str));
1497       p = ((const char *) p) - offset;
1498       gt_ggc_mx_lang_tree_node (CONST_CAST(void *, p));
1499       return;
1500     }
1501
1502   /* Inefficient, but also unlikely to matter.  */
1503   ggc_set_mark (p);
1504 }
1505
1506 /* If P is not marked, mark it and return false.  Otherwise return true.
1507    P must have been allocated by the GC allocator; it mustn't point to
1508    static objects, stack variables, or memory allocated with malloc.  */
1509
1510 int
1511 ggc_set_mark (const void *p)
1512 {
1513   struct page_entry *page;
1514   const char *ptr = (const char *) p;
1515
1516   page = zone_get_object_page (p);
1517
1518   if (page->pch_p)
1519     {
1520       size_t mark_word, mark_bit, offset;
1521       offset = (ptr - pch_zone.page) / BYTES_PER_MARK_BIT;
1522       mark_word = offset / (8 * sizeof (mark_type));
1523       mark_bit = offset % (8 * sizeof (mark_type));
1524       
1525       if (pch_zone.mark_bits[mark_word] & (1 << mark_bit))
1526         return 1;
1527       pch_zone.mark_bits[mark_word] |= (1 << mark_bit);
1528     }
1529   else if (page->large_p)
1530     {
1531       struct large_page_entry *large_page
1532         = (struct large_page_entry *) page;
1533
1534       if (large_page->mark_p)
1535         return 1;
1536       large_page->mark_p = true;
1537     }
1538   else
1539     {
1540       struct small_page_entry *small_page
1541         = (struct small_page_entry *) page;
1542
1543       if (small_page->mark_bits[zone_get_object_mark_word (p)]
1544           & (1 << zone_get_object_mark_bit (p)))
1545         return 1;
1546       small_page->mark_bits[zone_get_object_mark_word (p)]
1547         |= (1 << zone_get_object_mark_bit (p));
1548     }
1549
1550   if (GGC_DEBUG_LEVEL >= 4)
1551     fprintf (G.debug_file, "Marking %p\n", p);
1552
1553   return 0;
1554 }
1555
1556 /* Return 1 if P has been marked, zero otherwise.
1557    P must have been allocated by the GC allocator; it mustn't point to
1558    static objects, stack variables, or memory allocated with malloc.  */
1559
1560 int
1561 ggc_marked_p (const void *p)
1562 {
1563   struct page_entry *page;
1564   const char *ptr = (const char *) p;
1565
1566   page = zone_get_object_page (p);
1567
1568   if (page->pch_p)
1569     {
1570       size_t mark_word, mark_bit, offset;
1571       offset = (ptr - pch_zone.page) / BYTES_PER_MARK_BIT;
1572       mark_word = offset / (8 * sizeof (mark_type));
1573       mark_bit = offset % (8 * sizeof (mark_type));
1574       
1575       return (pch_zone.mark_bits[mark_word] & (1 << mark_bit)) != 0;
1576     }
1577
1578   if (page->large_p)
1579     {
1580       struct large_page_entry *large_page
1581         = (struct large_page_entry *) page;
1582
1583       return large_page->mark_p;
1584     }
1585   else
1586     {
1587       struct small_page_entry *small_page
1588         = (struct small_page_entry *) page;
1589
1590       return 0 != (small_page->mark_bits[zone_get_object_mark_word (p)]
1591                    & (1 << zone_get_object_mark_bit (p)));
1592     }
1593 }
1594
1595 /* Return the size of the gc-able object P.  */
1596
1597 size_t
1598 ggc_get_size (const void *p)
1599 {
1600   struct page_entry *page;
1601   const char *ptr = (const char *) p;
1602
1603   page = zone_get_object_page (p);
1604
1605   if (page->pch_p)
1606     {
1607       size_t alloc_word, alloc_bit, offset, max_size;
1608       offset = (ptr - pch_zone.page) / BYTES_PER_ALLOC_BIT + 1;
1609       alloc_word = offset / (8 * sizeof (alloc_type));
1610       alloc_bit = offset % (8 * sizeof (alloc_type));
1611       max_size = pch_zone.bytes - (ptr - pch_zone.page);
1612       return zone_object_size_1 (pch_zone.alloc_bits, alloc_word, alloc_bit,
1613                                  max_size);
1614     }
1615
1616   if (page->large_p)
1617     return ((struct large_page_entry *)page)->bytes;
1618   else
1619     return zone_find_object_size ((struct small_page_entry *) page, p);
1620 }
1621
1622 /* Initialize the ggc-zone-mmap allocator.  */
1623 void
1624 init_ggc (void)
1625 {
1626   /* The allocation size must be greater than BYTES_PER_MARK_BIT, and
1627      a multiple of both BYTES_PER_ALLOC_BIT and FREE_BIN_DELTA, for
1628      the current assumptions to hold.  */
1629
1630   gcc_assert (FREE_BIN_DELTA == MAX_ALIGNMENT);
1631
1632   /* Set up the main zone by hand.  */
1633   main_zone.name = "Main zone";
1634   G.zones = &main_zone;
1635
1636   /* Allocate the default zones.  */
1637   new_ggc_zone_1 (&rtl_zone, "RTL zone");
1638   new_ggc_zone_1 (&tree_zone, "Tree zone");
1639   new_ggc_zone_1 (&tree_id_zone, "Tree identifier zone");
1640
1641   G.pagesize = getpagesize();
1642   G.lg_pagesize = exact_log2 (G.pagesize);
1643   G.page_mask = ~(G.pagesize - 1);
1644
1645   /* Require the system page size to be a multiple of GGC_PAGE_SIZE.  */
1646   gcc_assert ((G.pagesize & (GGC_PAGE_SIZE - 1)) == 0);
1647
1648   /* Allocate 16 system pages at a time.  */
1649   G.quire_size = 16 * G.pagesize / GGC_PAGE_SIZE;
1650
1651   /* Calculate the size of the allocation bitmap and other overhead.  */
1652   /* Right now we allocate bits for the page header and bitmap.  These
1653      are wasted, but a little tricky to eliminate.  */
1654   G.small_page_overhead
1655     = PAGE_OVERHEAD + (GGC_PAGE_SIZE / BYTES_PER_ALLOC_BIT / 8);
1656   /* G.small_page_overhead = ROUND_UP (G.small_page_overhead, MAX_ALIGNMENT); */
1657
1658 #ifdef HAVE_MMAP_DEV_ZERO
1659   G.dev_zero_fd = open ("/dev/zero", O_RDONLY);
1660   gcc_assert (G.dev_zero_fd != -1);
1661 #endif
1662
1663 #if 0
1664   G.debug_file = fopen ("ggc-mmap.debug", "w");
1665   setlinebuf (G.debug_file);
1666 #else
1667   G.debug_file = stdout;
1668 #endif
1669
1670 #ifdef USING_MMAP
1671   /* StunOS has an amazing off-by-one error for the first mmap allocation
1672      after fiddling with RLIMIT_STACK.  The result, as hard as it is to
1673      believe, is an unaligned page allocation, which would cause us to
1674      hork badly if we tried to use it.  */
1675   {
1676     char *p = alloc_anon (NULL, G.pagesize, &main_zone);
1677     struct small_page_entry *e;
1678     if ((size_t)p & (G.pagesize - 1))
1679       {
1680         /* How losing.  Discard this one and try another.  If we still
1681            can't get something useful, give up.  */
1682
1683         p = alloc_anon (NULL, G.pagesize, &main_zone);
1684         gcc_assert (!((size_t)p & (G.pagesize - 1)));
1685       }
1686
1687     if (GGC_PAGE_SIZE == G.pagesize)
1688       {
1689         /* We have a good page, might as well hold onto it...  */
1690         e = XCNEWVAR (struct small_page_entry, G.small_page_overhead);
1691         e->common.page = p;
1692         e->common.zone = &main_zone;
1693         e->next = main_zone.free_pages;
1694         set_page_table_entry (e->common.page, &e->common);
1695         main_zone.free_pages = e;
1696       }
1697     else
1698       {
1699         munmap (p, G.pagesize);
1700       }
1701   }
1702 #endif
1703 }
1704
1705 /* Start a new GGC zone.  */
1706
1707 static void
1708 new_ggc_zone_1 (struct alloc_zone *new_zone, const char * name)
1709 {
1710   new_zone->name = name;
1711   new_zone->next_zone = G.zones->next_zone;
1712   G.zones->next_zone = new_zone;
1713 }
1714
1715 struct alloc_zone *
1716 new_ggc_zone (const char * name)
1717 {
1718   struct alloc_zone *new_zone = XCNEW (struct alloc_zone);
1719   new_ggc_zone_1 (new_zone, name);
1720   return new_zone;
1721 }
1722
1723 /* Destroy a GGC zone.  */
1724 void
1725 destroy_ggc_zone (struct alloc_zone * dead_zone)
1726 {
1727   struct alloc_zone *z;
1728
1729   for (z = G.zones; z && z->next_zone != dead_zone; z = z->next_zone)
1730     /* Just find that zone.  */
1731     continue;
1732
1733   /* We should have found the zone in the list.  Anything else is fatal.  */
1734   gcc_assert (z);
1735
1736   /* z is dead, baby. z is dead.  */
1737   z->dead = true;
1738 }
1739
1740 /* Free all empty pages and objects within a page for a given zone  */
1741
1742 static void
1743 sweep_pages (struct alloc_zone *zone)
1744 {
1745   struct large_page_entry **lpp, *lp, *lnext;
1746   struct small_page_entry **spp, *sp, *snext;
1747   char *last_free;
1748   size_t allocated = 0;
1749   bool nomarksinpage;
1750
1751   /* First, reset the free_chunks lists, since we are going to
1752      re-free free chunks in hopes of coalescing them into large chunks.  */
1753   memset (zone->free_chunks, 0, sizeof (zone->free_chunks));
1754   zone->high_free_bin = 0;
1755   zone->cached_free = NULL;
1756   zone->cached_free_size = 0;
1757
1758   /* Large pages are all or none affairs. Either they are completely
1759      empty, or they are completely full.  */
1760   lpp = &zone->large_pages;
1761   for (lp = zone->large_pages; lp != NULL; lp = lnext)
1762     {
1763       gcc_assert (lp->common.large_p);
1764
1765       lnext = lp->next;
1766
1767 #ifdef GATHER_STATISTICS
1768       /* This page has now survived another collection.  */
1769       lp->common.survived++;
1770 #endif
1771
1772       if (lp->mark_p)
1773         {
1774           lp->mark_p = false;
1775           allocated += lp->bytes;
1776           lpp = &lp->next;
1777         }
1778       else
1779         {
1780           *lpp = lnext;
1781 #ifdef ENABLE_GC_CHECKING
1782           /* Poison the page.  */
1783           memset (lp->common.page, 0xb5, SMALL_PAGE_SIZE);
1784 #endif
1785           if (lp->prev)
1786             lp->prev->next = lp->next;
1787           if (lp->next)
1788             lp->next->prev = lp->prev;
1789           free_large_page (lp);
1790         }
1791     }
1792
1793   spp = &zone->pages;
1794   for (sp = zone->pages; sp != NULL; sp = snext)
1795     {
1796       char *object, *last_object;
1797       char *end;
1798       alloc_type *alloc_word_p;
1799       mark_type *mark_word_p;
1800
1801       gcc_assert (!sp->common.large_p);
1802
1803       snext = sp->next;
1804
1805 #ifdef GATHER_STATISTICS
1806       /* This page has now survived another collection.  */
1807       sp->common.survived++;
1808 #endif
1809
1810       /* Step through all chunks, consolidate those that are free and
1811          insert them into the free lists.  Note that consolidation
1812          slows down collection slightly.  */
1813
1814       last_object = object = sp->common.page;
1815       end = sp->common.page + SMALL_PAGE_SIZE;
1816       last_free = NULL;
1817       nomarksinpage = true;
1818       mark_word_p = sp->mark_bits;
1819       alloc_word_p = sp->alloc_bits;
1820
1821       gcc_assert (BYTES_PER_ALLOC_BIT == BYTES_PER_MARK_BIT);
1822
1823       object = sp->common.page;
1824       do
1825         {
1826           unsigned int i, n;
1827           alloc_type alloc_word;
1828           mark_type mark_word;
1829
1830           alloc_word = *alloc_word_p++;
1831           mark_word = *mark_word_p++;
1832
1833           if (mark_word)
1834             nomarksinpage = false;
1835
1836           /* There ought to be some way to do this without looping...  */
1837           i = 0;
1838           while ((n = alloc_ffs (alloc_word)) != 0)
1839             {
1840               /* Extend the current state for n - 1 bits.  We can't
1841                  shift alloc_word by n, even though it isn't used in the
1842                  loop, in case only the highest bit was set.  */
1843               alloc_word >>= n - 1;
1844               mark_word >>= n - 1;
1845               object += BYTES_PER_MARK_BIT * (n - 1);
1846
1847               if (mark_word & 1)
1848                 {
1849                   if (last_free)
1850                     {
1851                       VALGRIND_DISCARD (VALGRIND_MAKE_MEM_UNDEFINED (last_free,
1852                                                                      object
1853                                                                      - last_free));
1854                       poison_region (last_free, object - last_free);
1855                       free_chunk (last_free, object - last_free, zone);
1856                       last_free = NULL;
1857                     }
1858                   else
1859                     allocated += object - last_object;
1860                   last_object = object;
1861                 }
1862               else
1863                 {
1864                   if (last_free == NULL)
1865                     {
1866                       last_free = object;
1867                       allocated += object - last_object;
1868                     }
1869                   else
1870                     zone_clear_object_alloc_bit (sp, object);
1871                 }
1872
1873               /* Shift to just after the alloc bit we handled.  */
1874               alloc_word >>= 1;
1875               mark_word >>= 1;
1876               object += BYTES_PER_MARK_BIT;
1877
1878               i += n;
1879             }
1880
1881           object += BYTES_PER_MARK_BIT * (8 * sizeof (alloc_type) - i);
1882         }
1883       while (object < end);
1884
1885       if (nomarksinpage)
1886         {
1887           *spp = snext;
1888 #ifdef ENABLE_GC_CHECKING
1889           VALGRIND_DISCARD (VALGRIND_MAKE_MEM_UNDEFINED (sp->common.page,
1890                                                          SMALL_PAGE_SIZE));
1891           /* Poison the page.  */
1892           memset (sp->common.page, 0xb5, SMALL_PAGE_SIZE);
1893 #endif
1894           free_small_page (sp);
1895           continue;
1896         }
1897       else if (last_free)
1898         {
1899           VALGRIND_DISCARD (VALGRIND_MAKE_MEM_UNDEFINED (last_free,
1900                                                          object - last_free));
1901           poison_region (last_free, object - last_free);
1902           free_chunk (last_free, object - last_free, zone);
1903         }
1904       else
1905         allocated += object - last_object;
1906
1907       spp = &sp->next;
1908     }
1909
1910   zone->allocated = allocated;
1911 }
1912
1913 /* mark-and-sweep routine for collecting a single zone.  NEED_MARKING
1914    is true if we need to mark before sweeping, false if some other
1915    zone collection has already performed marking for us.  Returns true
1916    if we collected, false otherwise.  */
1917
1918 static bool
1919 ggc_collect_1 (struct alloc_zone *zone, bool need_marking)
1920 {
1921 #if 0
1922   /* */
1923   {
1924     int i;
1925     for (i = 0; i < NUM_FREE_BINS + 1; i++)
1926       {
1927         struct alloc_chunk *chunk;
1928         int n, tot;
1929
1930         n = 0;
1931         tot = 0;
1932         chunk = zone->free_chunks[i];
1933         while (chunk)
1934           {
1935             n++;
1936             tot += chunk->size;
1937             chunk = chunk->next_free;
1938           }
1939         fprintf (stderr, "Bin %d: %d free chunks (%d bytes)\n",
1940                  i, n, tot);
1941       }
1942   }
1943   /* */
1944 #endif
1945
1946   if (!quiet_flag)
1947     fprintf (stderr, " {%s GC %luk -> ",
1948              zone->name, (unsigned long) zone->allocated / 1024);
1949
1950   /* Zero the total allocated bytes.  This will be recalculated in the
1951      sweep phase.  */
1952   zone->allocated = 0;
1953
1954   /* Release the pages we freed the last time we collected, but didn't
1955      reuse in the interim.  */
1956   release_pages (zone);
1957
1958   if (need_marking)
1959     {
1960       zone_allocate_marks ();
1961       ggc_mark_roots ();
1962 #ifdef GATHER_STATISTICS
1963       ggc_prune_overhead_list ();
1964 #endif
1965     }
1966   
1967   sweep_pages (zone);
1968   zone->was_collected = true;
1969   zone->allocated_last_gc = zone->allocated;
1970
1971   if (!quiet_flag)
1972     fprintf (stderr, "%luk}", (unsigned long) zone->allocated / 1024);
1973   return true;
1974 }
1975
1976 #ifdef GATHER_STATISTICS
1977 /* Calculate the average page survival rate in terms of number of
1978    collections.  */
1979
1980 static float
1981 calculate_average_page_survival (struct alloc_zone *zone)
1982 {
1983   float count = 0.0;
1984   float survival = 0.0;
1985   struct small_page_entry *p;
1986   struct large_page_entry *lp;
1987   for (p = zone->pages; p; p = p->next)
1988     {
1989       count += 1.0;
1990       survival += p->common.survived;
1991     }
1992   for (lp = zone->large_pages; lp; lp = lp->next)
1993     {
1994       count += 1.0;
1995       survival += lp->common.survived;
1996     }
1997   return survival/count;
1998 }
1999 #endif
2000
2001 /* Top level collection routine.  */
2002
2003 void
2004 ggc_collect (void)
2005 {
2006   struct alloc_zone *zone;
2007   bool marked = false;
2008
2009   timevar_push (TV_GC);
2010
2011   if (!ggc_force_collect)
2012     {
2013       float allocated_last_gc = 0, allocated = 0, min_expand;
2014
2015       for (zone = G.zones; zone; zone = zone->next_zone)
2016         {
2017           allocated_last_gc += zone->allocated_last_gc;
2018           allocated += zone->allocated;
2019         }
2020
2021       allocated_last_gc =
2022         MAX (allocated_last_gc,
2023              (size_t) PARAM_VALUE (GGC_MIN_HEAPSIZE) * 1024);
2024       min_expand = allocated_last_gc * PARAM_VALUE (GGC_MIN_EXPAND) / 100;
2025
2026       if (allocated < allocated_last_gc + min_expand)
2027         {
2028           timevar_pop (TV_GC);
2029           return;
2030         }
2031     }
2032
2033   invoke_plugin_callbacks (PLUGIN_GGC_START, NULL);
2034
2035   /* Start by possibly collecting the main zone.  */
2036   main_zone.was_collected = false;
2037   marked |= ggc_collect_1 (&main_zone, true);
2038
2039   /* In order to keep the number of collections down, we don't
2040      collect other zones unless we are collecting the main zone.  This
2041      gives us roughly the same number of collections as we used to
2042      have with the old gc.  The number of collection is important
2043      because our main slowdown (according to profiling) is now in
2044      marking.  So if we mark twice as often as we used to, we'll be
2045      twice as slow.  Hopefully we'll avoid this cost when we mark
2046      zone-at-a-time.  */
2047   /* NOTE drow/2004-07-28: We now always collect the main zone, but
2048      keep this code in case the heuristics are further refined.  */
2049
2050   if (main_zone.was_collected)
2051     {
2052       struct alloc_zone *zone;
2053
2054       for (zone = main_zone.next_zone; zone; zone = zone->next_zone)
2055         {
2056           zone->was_collected = false;
2057           marked |= ggc_collect_1 (zone, !marked);
2058         }
2059     }
2060
2061 #ifdef GATHER_STATISTICS
2062   /* Print page survival stats, if someone wants them.  */
2063   if (GGC_DEBUG_LEVEL >= 2)
2064     {
2065       for (zone = G.zones; zone; zone = zone->next_zone)
2066         {
2067           if (zone->was_collected)
2068             {
2069               float f = calculate_average_page_survival (zone);
2070               printf ("Average page survival in zone `%s' is %f\n",
2071                       zone->name, f);
2072             }
2073         }
2074     }
2075 #endif
2076
2077   if (marked)
2078     zone_free_marks ();
2079
2080   /* Free dead zones.  */
2081   for (zone = G.zones; zone && zone->next_zone; zone = zone->next_zone)
2082     {
2083       if (zone->next_zone->dead)
2084         {
2085           struct alloc_zone *dead_zone = zone->next_zone;
2086
2087           printf ("Zone `%s' is dead and will be freed.\n", dead_zone->name);
2088
2089           /* The zone must be empty.  */
2090           gcc_assert (!dead_zone->allocated);
2091
2092           /* Unchain the dead zone, release all its pages and free it.  */
2093           zone->next_zone = zone->next_zone->next_zone;
2094           release_pages (dead_zone);
2095           free (dead_zone);
2096         }
2097     }
2098
2099   invoke_plugin_callbacks (PLUGIN_GGC_END, NULL);
2100
2101   timevar_pop (TV_GC);
2102 }
2103
2104 /* Print allocation statistics.  */
2105 #define SCALE(x) ((unsigned long) ((x) < 1024*10 \
2106                   ? (x) \
2107                   : ((x) < 1024*1024*10 \
2108                      ? (x) / 1024 \
2109                      : (x) / (1024*1024))))
2110 #define LABEL(x) ((x) < 1024*10 ? ' ' : ((x) < 1024*1024*10 ? 'k' : 'M'))
2111
2112 void
2113 ggc_print_statistics (void)
2114 {
2115   struct alloc_zone *zone;
2116   struct ggc_statistics stats;
2117   size_t total_overhead = 0, total_allocated = 0, total_bytes_mapped = 0;
2118   size_t pte_overhead, i;
2119
2120   /* Clear the statistics.  */
2121   memset (&stats, 0, sizeof (stats));
2122
2123   /* Make sure collection will really occur.  */
2124   ggc_force_collect = true;
2125
2126   /* Collect and print the statistics common across collectors.  */
2127   ggc_print_common_statistics (stderr, &stats);
2128
2129   ggc_force_collect = false;
2130
2131   /* Release free pages so that we will not count the bytes allocated
2132      there as part of the total allocated memory.  */
2133   for (zone = G.zones; zone; zone = zone->next_zone)
2134     release_pages (zone);
2135
2136   /* Collect some information about the various sizes of
2137      allocation.  */
2138   fprintf (stderr,
2139            "Memory still allocated at the end of the compilation process\n");
2140
2141   fprintf (stderr, "%20s %10s  %10s  %10s\n",
2142            "Zone", "Allocated", "Used", "Overhead");
2143   for (zone = G.zones; zone; zone = zone->next_zone)
2144     {
2145       struct large_page_entry *large_page;
2146       size_t overhead, allocated, in_use;
2147
2148       /* Skip empty zones.  */
2149       if (!zone->pages && !zone->large_pages)
2150         continue;
2151
2152       allocated = in_use = 0;
2153
2154       overhead = sizeof (struct alloc_zone);
2155
2156       for (large_page = zone->large_pages; large_page != NULL;
2157            large_page = large_page->next)
2158         {
2159           allocated += large_page->bytes;
2160           in_use += large_page->bytes;
2161           overhead += sizeof (struct large_page_entry);
2162         }
2163
2164       /* There's no easy way to walk through the small pages finding
2165          used and unused objects.  Instead, add all the pages, and
2166          subtract out the free list.  */
2167
2168       allocated += GGC_PAGE_SIZE * zone->n_small_pages;
2169       in_use += GGC_PAGE_SIZE * zone->n_small_pages;
2170       overhead += G.small_page_overhead * zone->n_small_pages;
2171
2172       for (i = 0; i <= NUM_FREE_BINS; i++)
2173         {
2174           struct alloc_chunk *chunk = zone->free_chunks[i];
2175           while (chunk)
2176             {
2177               in_use -= ggc_get_size (chunk);
2178               chunk = chunk->next_free;
2179             }
2180         }
2181       
2182       fprintf (stderr, "%20s %10lu%c %10lu%c %10lu%c\n",
2183                zone->name,
2184                SCALE (allocated), LABEL (allocated),
2185                SCALE (in_use), LABEL (in_use),
2186                SCALE (overhead), LABEL (overhead));
2187
2188       gcc_assert (in_use == zone->allocated);
2189
2190       total_overhead += overhead;
2191       total_allocated += zone->allocated;
2192       total_bytes_mapped += zone->bytes_mapped;
2193     }
2194
2195   /* Count the size of the page table as best we can.  */
2196 #if HOST_BITS_PER_PTR <= 32
2197   pte_overhead = sizeof (G.lookup);
2198   for (i = 0; i < PAGE_L1_SIZE; i++)
2199     if (G.lookup[i])
2200       pte_overhead += PAGE_L2_SIZE * sizeof (struct page_entry *);
2201 #else
2202   {
2203     page_table table = G.lookup;
2204     pte_overhead = 0;
2205     while (table)
2206       {
2207         pte_overhead += sizeof (*table);
2208         for (i = 0; i < PAGE_L1_SIZE; i++)
2209           if (table->table[i])
2210             pte_overhead += PAGE_L2_SIZE * sizeof (struct page_entry *);
2211         table = table->next;
2212       }
2213   }
2214 #endif
2215   fprintf (stderr, "%20s %11s %11s %10lu%c\n", "Page Table",
2216            "", "", SCALE (pte_overhead), LABEL (pte_overhead));
2217   total_overhead += pte_overhead;
2218
2219   fprintf (stderr, "%20s %10lu%c %10lu%c %10lu%c\n", "Total",
2220            SCALE (total_bytes_mapped), LABEL (total_bytes_mapped),
2221            SCALE (total_allocated), LABEL(total_allocated),
2222            SCALE (total_overhead), LABEL (total_overhead));
2223
2224 #ifdef GATHER_STATISTICS  
2225   {
2226     unsigned long long all_overhead = 0, all_allocated = 0;
2227     unsigned long long all_overhead_under32 = 0, all_allocated_under32 = 0;
2228     unsigned long long all_overhead_under64 = 0, all_allocated_under64 = 0;
2229     unsigned long long all_overhead_under128 = 0, all_allocated_under128 = 0;
2230
2231     fprintf (stderr, "\nTotal allocations and overheads during the compilation process\n");
2232
2233     for (zone = G.zones; zone; zone = zone->next_zone)
2234       {
2235         all_overhead += zone->stats.total_overhead;
2236         all_allocated += zone->stats.total_allocated;
2237
2238         all_allocated_under32 += zone->stats.total_allocated_under32;
2239         all_overhead_under32 += zone->stats.total_overhead_under32;
2240
2241         all_allocated_under64 += zone->stats.total_allocated_under64;
2242         all_overhead_under64 += zone->stats.total_overhead_under64;
2243         
2244         all_allocated_under128 += zone->stats.total_allocated_under128;
2245         all_overhead_under128 += zone->stats.total_overhead_under128;
2246
2247         fprintf (stderr, "%20s:                  %10lld\n",
2248                  zone->name, zone->stats.total_allocated);
2249       }
2250
2251     fprintf (stderr, "\n");
2252
2253     fprintf (stderr, "Total Overhead:                        %10lld\n",
2254              all_overhead);
2255     fprintf (stderr, "Total Allocated:                       %10lld\n",
2256              all_allocated);
2257
2258     fprintf (stderr, "Total Overhead  under  32B:            %10lld\n",
2259              all_overhead_under32);
2260     fprintf (stderr, "Total Allocated under  32B:            %10lld\n",
2261              all_allocated_under32);
2262     fprintf (stderr, "Total Overhead  under  64B:            %10lld\n",
2263              all_overhead_under64);
2264     fprintf (stderr, "Total Allocated under  64B:            %10lld\n",
2265              all_allocated_under64);
2266     fprintf (stderr, "Total Overhead  under 128B:            %10lld\n",
2267              all_overhead_under128);
2268     fprintf (stderr, "Total Allocated under 128B:            %10lld\n",
2269              all_allocated_under128);
2270   }
2271 #endif
2272 }
2273
2274 /* Precompiled header support.  */
2275
2276 /* For precompiled headers, we sort objects based on their type.  We
2277    also sort various objects into their own buckets; currently this
2278    covers strings and IDENTIFIER_NODE trees.  The choices of how
2279    to sort buckets have not yet been tuned.  */
2280
2281 #define NUM_PCH_BUCKETS         (gt_types_enum_last + 3)
2282
2283 #define OTHER_BUCKET            (gt_types_enum_last + 0)
2284 #define IDENTIFIER_BUCKET       (gt_types_enum_last + 1)
2285 #define STRING_BUCKET           (gt_types_enum_last + 2)
2286
2287 struct ggc_pch_ondisk
2288 {
2289   size_t total;
2290   size_t type_totals[NUM_PCH_BUCKETS];
2291 };
2292
2293 struct ggc_pch_data
2294 {
2295   struct ggc_pch_ondisk d;
2296   size_t base;
2297   size_t orig_base;
2298   size_t alloc_size;
2299   alloc_type *alloc_bits;
2300   size_t type_bases[NUM_PCH_BUCKETS];
2301   size_t start_offset;
2302 };
2303
2304 /* Initialize the PCH data structure.  */
2305
2306 struct ggc_pch_data *
2307 init_ggc_pch (void)
2308 {
2309   return XCNEW (struct ggc_pch_data);
2310 }
2311
2312 /* Return which of the page-aligned buckets the object at X, with type
2313    TYPE, should be sorted into in the PCH.  Strings will have
2314    IS_STRING set and TYPE will be gt_types_enum_last.  Other objects
2315    of unknown type will also have TYPE equal to gt_types_enum_last.  */
2316
2317 static int
2318 pch_bucket (void *x, enum gt_types_enum type,
2319             bool is_string)
2320 {
2321   /* Sort identifiers into their own bucket, to improve locality
2322      when searching the identifier hash table.  */
2323   if (type == gt_ggc_e_14lang_tree_node
2324       && TREE_CODE ((tree) x) == IDENTIFIER_NODE)
2325     return IDENTIFIER_BUCKET;
2326   else if (type == gt_types_enum_last)
2327     {
2328       if (is_string)
2329         return STRING_BUCKET;
2330       return OTHER_BUCKET;
2331     }
2332   return type;
2333 }
2334
2335 /* Add the size of object X to the size of the PCH data.  */
2336
2337 void
2338 ggc_pch_count_object (struct ggc_pch_data *d, void *x ATTRIBUTE_UNUSED,
2339                       size_t size, bool is_string, enum gt_types_enum type)
2340 {
2341   /* NOTE: Right now we don't need to align up the size of any objects.
2342      Strings can be unaligned, and everything else is allocated to a
2343      MAX_ALIGNMENT boundary already.  */
2344
2345   d->d.type_totals[pch_bucket (x, type, is_string)] += size;
2346 }
2347
2348 /* Return the total size of the PCH data.  */
2349
2350 size_t
2351 ggc_pch_total_size (struct ggc_pch_data *d)
2352 {
2353   enum gt_types_enum i;
2354   size_t alloc_size, total_size;
2355
2356   total_size = 0;
2357   for (i = 0; i < NUM_PCH_BUCKETS; i++)
2358     {
2359       d->d.type_totals[i] = ROUND_UP (d->d.type_totals[i], GGC_PAGE_SIZE);
2360       total_size += d->d.type_totals[i];
2361     }
2362   d->d.total = total_size;
2363
2364   /* Include the size of the allocation bitmap.  */
2365   alloc_size = CEIL (d->d.total, BYTES_PER_ALLOC_BIT * 8);
2366   alloc_size = ROUND_UP (alloc_size, MAX_ALIGNMENT);
2367   d->alloc_size = alloc_size;
2368
2369   return d->d.total + alloc_size;
2370 }
2371
2372 /* Set the base address for the objects in the PCH file.  */
2373
2374 void
2375 ggc_pch_this_base (struct ggc_pch_data *d, void *base_)
2376 {
2377   int i;
2378   size_t base = (size_t) base_;
2379
2380   d->base = d->orig_base = base;
2381   for (i = 0; i < NUM_PCH_BUCKETS; i++)
2382     {
2383       d->type_bases[i] = base;
2384       base += d->d.type_totals[i];
2385     }
2386
2387   if (d->alloc_bits == NULL)
2388     d->alloc_bits = XCNEWVAR (alloc_type, d->alloc_size);
2389 }
2390
2391 /* Allocate a place for object X of size SIZE in the PCH file.  */
2392
2393 char *
2394 ggc_pch_alloc_object (struct ggc_pch_data *d, void *x,
2395                       size_t size, bool is_string,
2396                       enum gt_types_enum type)
2397 {
2398   size_t alloc_word, alloc_bit;
2399   char *result;
2400   int bucket = pch_bucket (x, type, is_string);
2401
2402   /* Record the start of the object in the allocation bitmap.  We
2403      can't assert that the allocation bit is previously clear, because
2404      strings may violate the invariant that they are at least
2405      BYTES_PER_ALLOC_BIT long.  This is harmless - ggc_get_size
2406      should not be called for strings.  */
2407   alloc_word = ((d->type_bases[bucket] - d->orig_base)
2408                 / (8 * sizeof (alloc_type) * BYTES_PER_ALLOC_BIT));
2409   alloc_bit = ((d->type_bases[bucket] - d->orig_base)
2410                / BYTES_PER_ALLOC_BIT) % (8 * sizeof (alloc_type));
2411   d->alloc_bits[alloc_word] |= 1L << alloc_bit;
2412
2413   /* Place the object at the current pointer for this bucket.  */
2414   result = (char *) d->type_bases[bucket];
2415   d->type_bases[bucket] += size;
2416   return result;
2417 }
2418
2419 /* Prepare to write out the PCH data to file F.  */
2420
2421 void
2422 ggc_pch_prepare_write (struct ggc_pch_data *d,
2423                        FILE *f)
2424 {
2425   /* We seek around a lot while writing.  Record where the end
2426      of the padding in the PCH file is, so that we can
2427      locate each object's offset.  */
2428   d->start_offset = ftell (f);
2429 }
2430
2431 /* Write out object X of SIZE to file F.  */
2432
2433 void
2434 ggc_pch_write_object (struct ggc_pch_data *d,
2435                       FILE *f, void *x, void *newx,
2436                       size_t size, bool is_string ATTRIBUTE_UNUSED)
2437 {
2438   if (fseek (f, (size_t) newx - d->orig_base + d->start_offset, SEEK_SET) != 0)
2439     fatal_error ("can't seek PCH file: %m");
2440
2441   if (fwrite (x, size, 1, f) != 1)
2442     fatal_error ("can't write PCH file: %m");
2443 }
2444
2445 void
2446 ggc_pch_finish (struct ggc_pch_data *d, FILE *f)
2447 {
2448   /* Write out the allocation bitmap.  */
2449   if (fseek (f, d->start_offset + d->d.total, SEEK_SET) != 0)
2450     fatal_error ("can't seek PCH file: %m");
2451
2452   if (fwrite (d->alloc_bits, d->alloc_size, 1, f) != 1)
2453     fatal_error ("can't write PCH file: %m");
2454
2455   /* Done with the PCH, so write out our footer.  */
2456   if (fwrite (&d->d, sizeof (d->d), 1, f) != 1)
2457     fatal_error ("can't write PCH file: %m");
2458
2459   free (d->alloc_bits);
2460   free (d);
2461 }
2462
2463 /* The PCH file from F has been mapped at ADDR.  Read in any
2464    additional data from the file and set up the GC state.  */
2465
2466 void
2467 ggc_pch_read (FILE *f, void *addr)
2468 {
2469   struct ggc_pch_ondisk d;
2470   size_t alloc_size;
2471   struct alloc_zone *zone;
2472   struct page_entry *pch_page;
2473   char *p;
2474
2475   if (fread (&d, sizeof (d), 1, f) != 1)
2476     fatal_error ("can't read PCH file: %m");
2477
2478   alloc_size = CEIL (d.total, BYTES_PER_ALLOC_BIT * 8);
2479   alloc_size = ROUND_UP (alloc_size, MAX_ALIGNMENT);
2480
2481   pch_zone.bytes = d.total;
2482   pch_zone.alloc_bits = (alloc_type *) ((char *) addr + pch_zone.bytes);
2483   pch_zone.page = (char *) addr;
2484   pch_zone.end = (char *) pch_zone.alloc_bits;
2485
2486   /* We've just read in a PCH file.  So, every object that used to be
2487      allocated is now free.  */
2488   for (zone = G.zones; zone; zone = zone->next_zone)
2489     {
2490       struct small_page_entry *page, *next_page;
2491       struct large_page_entry *large_page, *next_large_page;
2492
2493       zone->allocated = 0;
2494
2495       /* Clear the zone's free chunk list.  */
2496       memset (zone->free_chunks, 0, sizeof (zone->free_chunks));
2497       zone->high_free_bin = 0;
2498       zone->cached_free = NULL;
2499       zone->cached_free_size = 0;
2500
2501       /* Move all the small pages onto the free list.  */
2502       for (page = zone->pages; page != NULL; page = next_page)
2503         {
2504           next_page = page->next;
2505           memset (page->alloc_bits, 0,
2506                   G.small_page_overhead - PAGE_OVERHEAD);
2507           free_small_page (page);
2508         }
2509
2510       /* Discard all the large pages.  */
2511       for (large_page = zone->large_pages; large_page != NULL;
2512            large_page = next_large_page)
2513         {
2514           next_large_page = large_page->next;
2515           free_large_page (large_page);
2516         }
2517
2518       zone->pages = NULL;
2519       zone->large_pages = NULL;
2520     }
2521
2522   /* Allocate the dummy page entry for the PCH, and set all pages
2523      mapped into the PCH to reference it.  */
2524   pch_page = XCNEW (struct page_entry);
2525   pch_page->page = pch_zone.page;
2526   pch_page->pch_p = true;
2527
2528   for (p = pch_zone.page; p < pch_zone.end; p += GGC_PAGE_SIZE)
2529     set_page_table_entry (p, pch_page);
2530 }