OSDN Git Service

2006-06-19 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / ggc-page.c
1 /* "Bag-of-pages" garbage collector for the GNU compiler.
2    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
3    Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "toplev.h"
30 #include "flags.h"
31 #include "ggc.h"
32 #include "timevar.h"
33 #include "params.h"
34 #include "tree-flow.h"
35 #ifdef ENABLE_VALGRIND_CHECKING
36 # ifdef HAVE_VALGRIND_MEMCHECK_H
37 #  include <valgrind/memcheck.h>
38 # elif defined HAVE_MEMCHECK_H
39 #  include <memcheck.h>
40 # else
41 #  include <valgrind.h>
42 # endif
43 #else
44 /* Avoid #ifdef:s when we can help it.  */
45 #define VALGRIND_DISCARD(x)
46 #endif
47
48 /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
49    file open.  Prefer either to valloc.  */
50 #ifdef HAVE_MMAP_ANON
51 # undef HAVE_MMAP_DEV_ZERO
52
53 # include <sys/mman.h>
54 # ifndef MAP_FAILED
55 #  define MAP_FAILED -1
56 # endif
57 # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
58 #  define MAP_ANONYMOUS MAP_ANON
59 # endif
60 # define USING_MMAP
61
62 #endif
63
64 #ifdef HAVE_MMAP_DEV_ZERO
65
66 # include <sys/mman.h>
67 # ifndef MAP_FAILED
68 #  define MAP_FAILED -1
69 # endif
70 # define USING_MMAP
71
72 #endif
73
74 #ifndef USING_MMAP
75 #define USING_MALLOC_PAGE_GROUPS
76 #endif
77
78 /* Strategy:
79
80    This garbage-collecting allocator allocates objects on one of a set
81    of pages.  Each page can allocate objects of a single size only;
82    available sizes are powers of two starting at four bytes.  The size
83    of an allocation request is rounded up to the next power of two
84    (`order'), and satisfied from the appropriate page.
85
86    Each page is recorded in a page-entry, which also maintains an
87    in-use bitmap of object positions on the page.  This allows the
88    allocation state of a particular object to be flipped without
89    touching the page itself.
90
91    Each page-entry also has a context depth, which is used to track
92    pushing and popping of allocation contexts.  Only objects allocated
93    in the current (highest-numbered) context may be collected.
94
95    Page entries are arranged in an array of singly-linked lists.  The
96    array is indexed by the allocation size, in bits, of the pages on
97    it; i.e. all pages on a list allocate objects of the same size.
98    Pages are ordered on the list such that all non-full pages precede
99    all full pages, with non-full pages arranged in order of decreasing
100    context depth.
101
102    Empty pages (of all orders) 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.  */
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 \f
115 #ifndef HOST_BITS_PER_PTR
116 #define HOST_BITS_PER_PTR  HOST_BITS_PER_LONG
117 #endif
118
119 \f
120 /* A two-level tree is used to look up the page-entry for a given
121    pointer.  Two chunks of the pointer's bits are extracted to index
122    the first and second levels of the tree, as follows:
123
124                                    HOST_PAGE_SIZE_BITS
125                            32           |      |
126        msb +----------------+----+------+------+ lsb
127                             |    |      |
128                          PAGE_L1_BITS   |
129                                  |      |
130                                PAGE_L2_BITS
131
132    The bottommost HOST_PAGE_SIZE_BITS are ignored, since page-entry
133    pages are aligned on system page boundaries.  The next most
134    significant PAGE_L2_BITS and PAGE_L1_BITS are the second and first
135    index values in the lookup table, respectively.
136
137    For 32-bit architectures and the settings below, there are no
138    leftover bits.  For architectures with wider pointers, the lookup
139    tree points to a list of pages, which must be scanned to find the
140    correct one.  */
141
142 #define PAGE_L1_BITS    (8)
143 #define PAGE_L2_BITS    (32 - PAGE_L1_BITS - G.lg_pagesize)
144 #define PAGE_L1_SIZE    ((size_t) 1 << PAGE_L1_BITS)
145 #define PAGE_L2_SIZE    ((size_t) 1 << PAGE_L2_BITS)
146
147 #define LOOKUP_L1(p) \
148   (((size_t) (p) >> (32 - PAGE_L1_BITS)) & ((1 << PAGE_L1_BITS) - 1))
149
150 #define LOOKUP_L2(p) \
151   (((size_t) (p) >> G.lg_pagesize) & ((1 << PAGE_L2_BITS) - 1))
152
153 /* The number of objects per allocation page, for objects on a page of
154    the indicated ORDER.  */
155 #define OBJECTS_PER_PAGE(ORDER) objects_per_page_table[ORDER]
156
157 /* The number of objects in P.  */
158 #define OBJECTS_IN_PAGE(P) ((P)->bytes / OBJECT_SIZE ((P)->order))
159
160 /* The size of an object on a page of the indicated ORDER.  */
161 #define OBJECT_SIZE(ORDER) object_size_table[ORDER]
162
163 /* For speed, we avoid doing a general integer divide to locate the
164    offset in the allocation bitmap, by precalculating numbers M, S
165    such that (O * M) >> S == O / Z (modulo 2^32), for any offset O
166    within the page which is evenly divisible by the object size Z.  */
167 #define DIV_MULT(ORDER) inverse_table[ORDER].mult
168 #define DIV_SHIFT(ORDER) inverse_table[ORDER].shift
169 #define OFFSET_TO_BIT(OFFSET, ORDER) \
170   (((OFFSET) * DIV_MULT (ORDER)) >> DIV_SHIFT (ORDER))
171
172 /* The number of extra orders, not corresponding to power-of-two sized
173    objects.  */
174
175 #define NUM_EXTRA_ORDERS ARRAY_SIZE (extra_order_size_table)
176
177 #define RTL_SIZE(NSLOTS) \
178   (RTX_HDR_SIZE + (NSLOTS) * sizeof (rtunion))
179
180 #define TREE_EXP_SIZE(OPS) \
181   (sizeof (struct tree_exp) + ((OPS) - 1) * sizeof (tree))
182
183 /* The Ith entry is the maximum size of an object to be stored in the
184    Ith extra order.  Adding a new entry to this array is the *only*
185    thing you need to do to add a new special allocation size.  */
186
187 static const size_t extra_order_size_table[] = {
188   sizeof (struct stmt_ann_d),
189   sizeof (struct tree_decl_non_common),
190   sizeof (struct tree_field_decl),
191   sizeof (struct tree_parm_decl),
192   sizeof (struct tree_var_decl),
193   sizeof (struct tree_list),
194   sizeof (struct function),
195   sizeof (struct basic_block_def),
196   TREE_EXP_SIZE (2),
197   RTL_SIZE (2),                 /* MEM, PLUS, etc.  */
198   RTL_SIZE (9),                 /* INSN */
199 };
200
201 /* The total number of orders.  */
202
203 #define NUM_ORDERS (HOST_BITS_PER_PTR + NUM_EXTRA_ORDERS)
204
205 /* We use this structure to determine the alignment required for
206    allocations.  For power-of-two sized allocations, that's not a
207    problem, but it does matter for odd-sized allocations.  */
208
209 struct max_alignment {
210   char c;
211   union {
212     HOST_WIDEST_INT i;
213     long double d;
214   } u;
215 };
216
217 /* The biggest alignment required.  */
218
219 #define MAX_ALIGNMENT (offsetof (struct max_alignment, u))
220
221 /* Compute the smallest nonnegative number which when added to X gives
222    a multiple of F.  */
223
224 #define ROUND_UP_VALUE(x, f) ((f) - 1 - ((f) - 1 + (x)) % (f))
225
226 /* Compute the smallest multiple of F that is >= X.  */
227
228 #define ROUND_UP(x, f) (CEIL (x, f) * (f))
229
230 /* The Ith entry is the number of objects on a page or order I.  */
231
232 static unsigned objects_per_page_table[NUM_ORDERS];
233
234 /* The Ith entry is the size of an object on a page of order I.  */
235
236 static size_t object_size_table[NUM_ORDERS];
237
238 /* The Ith entry is a pair of numbers (mult, shift) such that
239    ((k * mult) >> shift) mod 2^32 == (k / OBJECT_SIZE(I)) mod 2^32,
240    for all k evenly divisible by OBJECT_SIZE(I).  */
241
242 static struct
243 {
244   size_t mult;
245   unsigned int shift;
246 }
247 inverse_table[NUM_ORDERS];
248
249 /* A page_entry records the status of an allocation page.  This
250    structure is dynamically sized to fit the bitmap in_use_p.  */
251 typedef struct page_entry
252 {
253   /* The next page-entry with objects of the same size, or NULL if
254      this is the last page-entry.  */
255   struct page_entry *next;
256
257   /* The previous page-entry with objects of the same size, or NULL if
258      this is the first page-entry.   The PREV pointer exists solely to
259      keep the cost of ggc_free manageable.  */
260   struct page_entry *prev;
261
262   /* The number of bytes allocated.  (This will always be a multiple
263      of the host system page size.)  */
264   size_t bytes;
265
266   /* The address at which the memory is allocated.  */
267   char *page;
268
269 #ifdef USING_MALLOC_PAGE_GROUPS
270   /* Back pointer to the page group this page came from.  */
271   struct page_group *group;
272 #endif
273
274   /* This is the index in the by_depth varray where this page table
275      can be found.  */
276   unsigned long index_by_depth;
277
278   /* Context depth of this page.  */
279   unsigned short context_depth;
280
281   /* The number of free objects remaining on this page.  */
282   unsigned short num_free_objects;
283
284   /* A likely candidate for the bit position of a free object for the
285      next allocation from this page.  */
286   unsigned short next_bit_hint;
287
288   /* The lg of size of objects allocated from this page.  */
289   unsigned char order;
290
291   /* A bit vector indicating whether or not objects are in use.  The
292      Nth bit is one if the Nth object on this page is allocated.  This
293      array is dynamically sized.  */
294   unsigned long in_use_p[1];
295 } page_entry;
296
297 #ifdef USING_MALLOC_PAGE_GROUPS
298 /* A page_group describes a large allocation from malloc, from which
299    we parcel out aligned pages.  */
300 typedef struct page_group
301 {
302   /* A linked list of all extant page groups.  */
303   struct page_group *next;
304
305   /* The address we received from malloc.  */
306   char *allocation;
307
308   /* The size of the block.  */
309   size_t alloc_size;
310
311   /* A bitmask of pages in use.  */
312   unsigned int in_use;
313 } page_group;
314 #endif
315
316 #if HOST_BITS_PER_PTR <= 32
317
318 /* On 32-bit hosts, we use a two level page table, as pictured above.  */
319 typedef page_entry **page_table[PAGE_L1_SIZE];
320
321 #else
322
323 /* On 64-bit hosts, we use the same two level page tables plus a linked
324    list that disambiguates the top 32-bits.  There will almost always be
325    exactly one entry in the list.  */
326 typedef struct page_table_chain
327 {
328   struct page_table_chain *next;
329   size_t high_bits;
330   page_entry **table[PAGE_L1_SIZE];
331 } *page_table;
332
333 #endif
334
335 /* The rest of the global variables.  */
336 static struct globals
337 {
338   /* The Nth element in this array is a page with objects of size 2^N.
339      If there are any pages with free objects, they will be at the
340      head of the list.  NULL if there are no page-entries for this
341      object size.  */
342   page_entry *pages[NUM_ORDERS];
343
344   /* The Nth element in this array is the last page with objects of
345      size 2^N.  NULL if there are no page-entries for this object
346      size.  */
347   page_entry *page_tails[NUM_ORDERS];
348
349   /* Lookup table for associating allocation pages with object addresses.  */
350   page_table lookup;
351
352   /* The system's page size.  */
353   size_t pagesize;
354   size_t lg_pagesize;
355
356   /* Bytes currently allocated.  */
357   size_t allocated;
358
359   /* Bytes currently allocated at the end of the last collection.  */
360   size_t allocated_last_gc;
361
362   /* Total amount of memory mapped.  */
363   size_t bytes_mapped;
364
365   /* Bit N set if any allocations have been done at context depth N.  */
366   unsigned long context_depth_allocations;
367
368   /* Bit N set if any collections have been done at context depth N.  */
369   unsigned long context_depth_collections;
370
371   /* The current depth in the context stack.  */
372   unsigned short context_depth;
373
374   /* A file descriptor open to /dev/zero for reading.  */
375 #if defined (HAVE_MMAP_DEV_ZERO)
376   int dev_zero_fd;
377 #endif
378
379   /* A cache of free system pages.  */
380   page_entry *free_pages;
381
382 #ifdef USING_MALLOC_PAGE_GROUPS
383   page_group *page_groups;
384 #endif
385
386   /* The file descriptor for debugging output.  */
387   FILE *debug_file;
388
389   /* Current number of elements in use in depth below.  */
390   unsigned int depth_in_use;
391
392   /* Maximum number of elements that can be used before resizing.  */
393   unsigned int depth_max;
394
395   /* Each element of this arry is an index in by_depth where the given
396      depth starts.  This structure is indexed by that given depth we
397      are interested in.  */
398   unsigned int *depth;
399
400   /* Current number of elements in use in by_depth below.  */
401   unsigned int by_depth_in_use;
402
403   /* Maximum number of elements that can be used before resizing.  */
404   unsigned int by_depth_max;
405
406   /* Each element of this array is a pointer to a page_entry, all
407      page_entries can be found in here by increasing depth.
408      index_by_depth in the page_entry is the index into this data
409      structure where that page_entry can be found.  This is used to
410      speed up finding all page_entries at a particular depth.  */
411   page_entry **by_depth;
412
413   /* Each element is a pointer to the saved in_use_p bits, if any,
414      zero otherwise.  We allocate them all together, to enable a
415      better runtime data access pattern.  */
416   unsigned long **save_in_use;
417
418 #ifdef ENABLE_GC_ALWAYS_COLLECT
419   /* List of free objects to be verified as actually free on the
420      next collection.  */
421   struct free_object
422   {
423     void *object;
424     struct free_object *next;
425   } *free_object_list;
426 #endif
427
428 #ifdef GATHER_STATISTICS
429   struct
430   {
431     /* Total memory allocated with ggc_alloc.  */
432     unsigned long long total_allocated;
433     /* Total overhead for memory to be allocated with ggc_alloc.  */
434     unsigned long long total_overhead;
435
436     /* Total allocations and overhead for sizes less than 32, 64 and 128.
437        These sizes are interesting because they are typical cache line
438        sizes.  */
439    
440     unsigned long long total_allocated_under32;
441     unsigned long long total_overhead_under32;
442   
443     unsigned long long total_allocated_under64;
444     unsigned long long total_overhead_under64;
445   
446     unsigned long long total_allocated_under128;
447     unsigned long long total_overhead_under128;
448   
449     /* The allocations for each of the allocation orders.  */
450     unsigned long long total_allocated_per_order[NUM_ORDERS];
451
452     /* The overhead for each of the allocation orders.  */
453     unsigned long long total_overhead_per_order[NUM_ORDERS];
454   } stats;
455 #endif
456 } G;
457
458 /* The size in bytes required to maintain a bitmap for the objects
459    on a page-entry.  */
460 #define BITMAP_SIZE(Num_objects) \
461   (CEIL ((Num_objects), HOST_BITS_PER_LONG) * sizeof(long))
462
463 /* Allocate pages in chunks of this size, to throttle calls to memory
464    allocation routines.  The first page is used, the rest go onto the
465    free list.  This cannot be larger than HOST_BITS_PER_INT for the
466    in_use bitmask for page_group.  Hosts that need a different value
467    can override this by defining GGC_QUIRE_SIZE explicitly.  */
468 #ifndef GGC_QUIRE_SIZE
469 # ifdef USING_MMAP
470 #  define GGC_QUIRE_SIZE 256
471 # else
472 #  define GGC_QUIRE_SIZE 16
473 # endif
474 #endif
475
476 /* Initial guess as to how many page table entries we might need.  */
477 #define INITIAL_PTE_COUNT 128
478 \f
479 static int ggc_allocated_p (const void *);
480 static page_entry *lookup_page_table_entry (const void *);
481 static void set_page_table_entry (void *, page_entry *);
482 #ifdef USING_MMAP
483 static char *alloc_anon (char *, size_t);
484 #endif
485 #ifdef USING_MALLOC_PAGE_GROUPS
486 static size_t page_group_index (char *, char *);
487 static void set_page_group_in_use (page_group *, char *);
488 static void clear_page_group_in_use (page_group *, char *);
489 #endif
490 static struct page_entry * alloc_page (unsigned);
491 static void free_page (struct page_entry *);
492 static void release_pages (void);
493 static void clear_marks (void);
494 static void sweep_pages (void);
495 static void ggc_recalculate_in_use_p (page_entry *);
496 static void compute_inverse (unsigned);
497 static inline void adjust_depth (void);
498 static void move_ptes_to_front (int, int);
499
500 void debug_print_page_list (int);
501 static void push_depth (unsigned int);
502 static void push_by_depth (page_entry *, unsigned long *);
503
504 /* Push an entry onto G.depth.  */
505
506 inline static void
507 push_depth (unsigned int i)
508 {
509   if (G.depth_in_use >= G.depth_max)
510     {
511       G.depth_max *= 2;
512       G.depth = xrealloc (G.depth, G.depth_max * sizeof (unsigned int));
513     }
514   G.depth[G.depth_in_use++] = i;
515 }
516
517 /* Push an entry onto G.by_depth and G.save_in_use.  */
518
519 inline static void
520 push_by_depth (page_entry *p, unsigned long *s)
521 {
522   if (G.by_depth_in_use >= G.by_depth_max)
523     {
524       G.by_depth_max *= 2;
525       G.by_depth = xrealloc (G.by_depth,
526                              G.by_depth_max * sizeof (page_entry *));
527       G.save_in_use = xrealloc (G.save_in_use,
528                                 G.by_depth_max * sizeof (unsigned long *));
529     }
530   G.by_depth[G.by_depth_in_use] = p;
531   G.save_in_use[G.by_depth_in_use++] = s;
532 }
533
534 #if (GCC_VERSION < 3001)
535 #define prefetch(X) ((void) X)
536 #else
537 #define prefetch(X) __builtin_prefetch (X)
538 #endif
539
540 #define save_in_use_p_i(__i) \
541   (G.save_in_use[__i])
542 #define save_in_use_p(__p) \
543   (save_in_use_p_i (__p->index_by_depth))
544
545 /* Returns nonzero if P was allocated in GC'able memory.  */
546
547 static inline int
548 ggc_allocated_p (const void *p)
549 {
550   page_entry ***base;
551   size_t L1, L2;
552
553 #if HOST_BITS_PER_PTR <= 32
554   base = &G.lookup[0];
555 #else
556   page_table table = G.lookup;
557   size_t high_bits = (size_t) p & ~ (size_t) 0xffffffff;
558   while (1)
559     {
560       if (table == NULL)
561         return 0;
562       if (table->high_bits == high_bits)
563         break;
564       table = table->next;
565     }
566   base = &table->table[0];
567 #endif
568
569   /* Extract the level 1 and 2 indices.  */
570   L1 = LOOKUP_L1 (p);
571   L2 = LOOKUP_L2 (p);
572
573   return base[L1] && base[L1][L2];
574 }
575
576 /* Traverse the page table and find the entry for a page.
577    Die (probably) if the object wasn't allocated via GC.  */
578
579 static inline page_entry *
580 lookup_page_table_entry (const void *p)
581 {
582   page_entry ***base;
583   size_t L1, L2;
584
585 #if HOST_BITS_PER_PTR <= 32
586   base = &G.lookup[0];
587 #else
588   page_table table = G.lookup;
589   size_t high_bits = (size_t) p & ~ (size_t) 0xffffffff;
590   while (table->high_bits != high_bits)
591     table = table->next;
592   base = &table->table[0];
593 #endif
594
595   /* Extract the level 1 and 2 indices.  */
596   L1 = LOOKUP_L1 (p);
597   L2 = LOOKUP_L2 (p);
598
599   return base[L1][L2];
600 }
601
602 /* Set the page table entry for a page.  */
603
604 static void
605 set_page_table_entry (void *p, page_entry *entry)
606 {
607   page_entry ***base;
608   size_t L1, L2;
609
610 #if HOST_BITS_PER_PTR <= 32
611   base = &G.lookup[0];
612 #else
613   page_table table;
614   size_t high_bits = (size_t) p & ~ (size_t) 0xffffffff;
615   for (table = G.lookup; table; table = table->next)
616     if (table->high_bits == high_bits)
617       goto found;
618
619   /* Not found -- allocate a new table.  */
620   table = xcalloc (1, sizeof(*table));
621   table->next = G.lookup;
622   table->high_bits = high_bits;
623   G.lookup = table;
624 found:
625   base = &table->table[0];
626 #endif
627
628   /* Extract the level 1 and 2 indices.  */
629   L1 = LOOKUP_L1 (p);
630   L2 = LOOKUP_L2 (p);
631
632   if (base[L1] == NULL)
633     base[L1] = XCNEWVEC (page_entry *, PAGE_L2_SIZE);
634
635   base[L1][L2] = entry;
636 }
637
638 /* Prints the page-entry for object size ORDER, for debugging.  */
639
640 void
641 debug_print_page_list (int order)
642 {
643   page_entry *p;
644   printf ("Head=%p, Tail=%p:\n", (void *) G.pages[order],
645           (void *) G.page_tails[order]);
646   p = G.pages[order];
647   while (p != NULL)
648     {
649       printf ("%p(%1d|%3d) -> ", (void *) p, p->context_depth,
650               p->num_free_objects);
651       p = p->next;
652     }
653   printf ("NULL\n");
654   fflush (stdout);
655 }
656
657 #ifdef USING_MMAP
658 /* Allocate SIZE bytes of anonymous memory, preferably near PREF,
659    (if non-null).  The ifdef structure here is intended to cause a
660    compile error unless exactly one of the HAVE_* is defined.  */
661
662 static inline char *
663 alloc_anon (char *pref ATTRIBUTE_UNUSED, size_t size)
664 {
665 #ifdef HAVE_MMAP_ANON
666   char *page = mmap (pref, size, PROT_READ | PROT_WRITE,
667                      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
668 #endif
669 #ifdef HAVE_MMAP_DEV_ZERO
670   char *page = mmap (pref, size, PROT_READ | PROT_WRITE,
671                      MAP_PRIVATE, G.dev_zero_fd, 0);
672 #endif
673
674   if (page == (char *) MAP_FAILED)
675     {
676       perror ("virtual memory exhausted");
677       exit (FATAL_EXIT_CODE);
678     }
679
680   /* Remember that we allocated this memory.  */
681   G.bytes_mapped += size;
682
683   /* Pretend we don't have access to the allocated pages.  We'll enable
684      access to smaller pieces of the area in ggc_alloc.  Discard the
685      handle to avoid handle leak.  */
686   VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (page, size));
687
688   return page;
689 }
690 #endif
691 #ifdef USING_MALLOC_PAGE_GROUPS
692 /* Compute the index for this page into the page group.  */
693
694 static inline size_t
695 page_group_index (char *allocation, char *page)
696 {
697   return (size_t) (page - allocation) >> G.lg_pagesize;
698 }
699
700 /* Set and clear the in_use bit for this page in the page group.  */
701
702 static inline void
703 set_page_group_in_use (page_group *group, char *page)
704 {
705   group->in_use |= 1 << page_group_index (group->allocation, page);
706 }
707
708 static inline void
709 clear_page_group_in_use (page_group *group, char *page)
710 {
711   group->in_use &= ~(1 << page_group_index (group->allocation, page));
712 }
713 #endif
714
715 /* Allocate a new page for allocating objects of size 2^ORDER,
716    and return an entry for it.  The entry is not added to the
717    appropriate page_table list.  */
718
719 static inline struct page_entry *
720 alloc_page (unsigned order)
721 {
722   struct page_entry *entry, *p, **pp;
723   char *page;
724   size_t num_objects;
725   size_t bitmap_size;
726   size_t page_entry_size;
727   size_t entry_size;
728 #ifdef USING_MALLOC_PAGE_GROUPS
729   page_group *group;
730 #endif
731
732   num_objects = OBJECTS_PER_PAGE (order);
733   bitmap_size = BITMAP_SIZE (num_objects + 1);
734   page_entry_size = sizeof (page_entry) - sizeof (long) + bitmap_size;
735   entry_size = num_objects * OBJECT_SIZE (order);
736   if (entry_size < G.pagesize)
737     entry_size = G.pagesize;
738
739   entry = NULL;
740   page = NULL;
741
742   /* Check the list of free pages for one we can use.  */
743   for (pp = &G.free_pages, p = *pp; p; pp = &p->next, p = *pp)
744     if (p->bytes == entry_size)
745       break;
746
747   if (p != NULL)
748     {
749       /* Recycle the allocated memory from this page ...  */
750       *pp = p->next;
751       page = p->page;
752
753 #ifdef USING_MALLOC_PAGE_GROUPS
754       group = p->group;
755 #endif
756
757       /* ... and, if possible, the page entry itself.  */
758       if (p->order == order)
759         {
760           entry = p;
761           memset (entry, 0, page_entry_size);
762         }
763       else
764         free (p);
765     }
766 #ifdef USING_MMAP
767   else if (entry_size == G.pagesize)
768     {
769       /* We want just one page.  Allocate a bunch of them and put the
770          extras on the freelist.  (Can only do this optimization with
771          mmap for backing store.)  */
772       struct page_entry *e, *f = G.free_pages;
773       int i;
774
775       page = alloc_anon (NULL, G.pagesize * GGC_QUIRE_SIZE);
776
777       /* This loop counts down so that the chain will be in ascending
778          memory order.  */
779       for (i = GGC_QUIRE_SIZE - 1; i >= 1; i--)
780         {
781           e = xcalloc (1, page_entry_size);
782           e->order = order;
783           e->bytes = G.pagesize;
784           e->page = page + (i << G.lg_pagesize);
785           e->next = f;
786           f = e;
787         }
788
789       G.free_pages = f;
790     }
791   else
792     page = alloc_anon (NULL, entry_size);
793 #endif
794 #ifdef USING_MALLOC_PAGE_GROUPS
795   else
796     {
797       /* Allocate a large block of memory and serve out the aligned
798          pages therein.  This results in much less memory wastage
799          than the traditional implementation of valloc.  */
800
801       char *allocation, *a, *enda;
802       size_t alloc_size, head_slop, tail_slop;
803       int multiple_pages = (entry_size == G.pagesize);
804
805       if (multiple_pages)
806         alloc_size = GGC_QUIRE_SIZE * G.pagesize;
807       else
808         alloc_size = entry_size + G.pagesize - 1;
809       allocation = xmalloc (alloc_size);
810
811       page = (char *) (((size_t) allocation + G.pagesize - 1) & -G.pagesize);
812       head_slop = page - allocation;
813       if (multiple_pages)
814         tail_slop = ((size_t) allocation + alloc_size) & (G.pagesize - 1);
815       else
816         tail_slop = alloc_size - entry_size - head_slop;
817       enda = allocation + alloc_size - tail_slop;
818
819       /* We allocated N pages, which are likely not aligned, leaving
820          us with N-1 usable pages.  We plan to place the page_group
821          structure somewhere in the slop.  */
822       if (head_slop >= sizeof (page_group))
823         group = (page_group *)page - 1;
824       else
825         {
826           /* We magically got an aligned allocation.  Too bad, we have
827              to waste a page anyway.  */
828           if (tail_slop == 0)
829             {
830               enda -= G.pagesize;
831               tail_slop += G.pagesize;
832             }
833           gcc_assert (tail_slop >= sizeof (page_group));
834           group = (page_group *)enda;
835           tail_slop -= sizeof (page_group);
836         }
837
838       /* Remember that we allocated this memory.  */
839       group->next = G.page_groups;
840       group->allocation = allocation;
841       group->alloc_size = alloc_size;
842       group->in_use = 0;
843       G.page_groups = group;
844       G.bytes_mapped += alloc_size;
845
846       /* If we allocated multiple pages, put the rest on the free list.  */
847       if (multiple_pages)
848         {
849           struct page_entry *e, *f = G.free_pages;
850           for (a = enda - G.pagesize; a != page; a -= G.pagesize)
851             {
852               e = xcalloc (1, page_entry_size);
853               e->order = order;
854               e->bytes = G.pagesize;
855               e->page = a;
856               e->group = group;
857               e->next = f;
858               f = e;
859             }
860           G.free_pages = f;
861         }
862     }
863 #endif
864
865   if (entry == NULL)
866     entry = xcalloc (1, page_entry_size);
867
868   entry->bytes = entry_size;
869   entry->page = page;
870   entry->context_depth = G.context_depth;
871   entry->order = order;
872   entry->num_free_objects = num_objects;
873   entry->next_bit_hint = 1;
874
875   G.context_depth_allocations |= (unsigned long)1 << G.context_depth;
876
877 #ifdef USING_MALLOC_PAGE_GROUPS
878   entry->group = group;
879   set_page_group_in_use (group, page);
880 #endif
881
882   /* Set the one-past-the-end in-use bit.  This acts as a sentry as we
883      increment the hint.  */
884   entry->in_use_p[num_objects / HOST_BITS_PER_LONG]
885     = (unsigned long) 1 << (num_objects % HOST_BITS_PER_LONG);
886
887   set_page_table_entry (page, entry);
888
889   if (GGC_DEBUG_LEVEL >= 2)
890     fprintf (G.debug_file,
891              "Allocating page at %p, object size=%lu, data %p-%p\n",
892              (void *) entry, (unsigned long) OBJECT_SIZE (order), page,
893              page + entry_size - 1);
894
895   return entry;
896 }
897
898 /* Adjust the size of G.depth so that no index greater than the one
899    used by the top of the G.by_depth is used.  */
900
901 static inline void
902 adjust_depth (void)
903 {
904   page_entry *top;
905
906   if (G.by_depth_in_use)
907     {
908       top = G.by_depth[G.by_depth_in_use-1];
909
910       /* Peel back indices in depth that index into by_depth, so that
911          as new elements are added to by_depth, we note the indices
912          of those elements, if they are for new context depths.  */
913       while (G.depth_in_use > (size_t)top->context_depth+1)
914         --G.depth_in_use;
915     }
916 }
917
918 /* For a page that is no longer needed, put it on the free page list.  */
919
920 static void
921 free_page (page_entry *entry)
922 {
923   if (GGC_DEBUG_LEVEL >= 2)
924     fprintf (G.debug_file,
925              "Deallocating page at %p, data %p-%p\n", (void *) entry,
926              entry->page, entry->page + entry->bytes - 1);
927
928   /* Mark the page as inaccessible.  Discard the handle to avoid handle
929      leak.  */
930   VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (entry->page, entry->bytes));
931
932   set_page_table_entry (entry->page, NULL);
933
934 #ifdef USING_MALLOC_PAGE_GROUPS
935   clear_page_group_in_use (entry->group, entry->page);
936 #endif
937
938   if (G.by_depth_in_use > 1)
939     {
940       page_entry *top = G.by_depth[G.by_depth_in_use-1];
941       int i = entry->index_by_depth;
942
943       /* We cannot free a page from a context deeper than the current
944          one.  */
945       gcc_assert (entry->context_depth == top->context_depth);
946       
947       /* Put top element into freed slot.  */
948       G.by_depth[i] = top;
949       G.save_in_use[i] = G.save_in_use[G.by_depth_in_use-1];
950       top->index_by_depth = i;
951     }
952   --G.by_depth_in_use;
953
954   adjust_depth ();
955
956   entry->next = G.free_pages;
957   G.free_pages = entry;
958 }
959
960 /* Release the free page cache to the system.  */
961
962 static void
963 release_pages (void)
964 {
965 #ifdef USING_MMAP
966   page_entry *p, *next;
967   char *start;
968   size_t len;
969
970   /* Gather up adjacent pages so they are unmapped together.  */
971   p = G.free_pages;
972
973   while (p)
974     {
975       start = p->page;
976       next = p->next;
977       len = p->bytes;
978       free (p);
979       p = next;
980
981       while (p && p->page == start + len)
982         {
983           next = p->next;
984           len += p->bytes;
985           free (p);
986           p = next;
987         }
988
989       munmap (start, len);
990       G.bytes_mapped -= len;
991     }
992
993   G.free_pages = NULL;
994 #endif
995 #ifdef USING_MALLOC_PAGE_GROUPS
996   page_entry **pp, *p;
997   page_group **gp, *g;
998
999   /* Remove all pages from free page groups from the list.  */
1000   pp = &G.free_pages;
1001   while ((p = *pp) != NULL)
1002     if (p->group->in_use == 0)
1003       {
1004         *pp = p->next;
1005         free (p);
1006       }
1007     else
1008       pp = &p->next;
1009
1010   /* Remove all free page groups, and release the storage.  */
1011   gp = &G.page_groups;
1012   while ((g = *gp) != NULL)
1013     if (g->in_use == 0)
1014       {
1015         *gp = g->next;
1016         G.bytes_mapped -= g->alloc_size;
1017         free (g->allocation);
1018       }
1019     else
1020       gp = &g->next;
1021 #endif
1022 }
1023
1024 /* This table provides a fast way to determine ceil(log_2(size)) for
1025    allocation requests.  The minimum allocation size is eight bytes.  */
1026
1027 static unsigned char size_lookup[511] =
1028 {
1029   3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
1030   4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1031   5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
1032   6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
1033   6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
1034   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
1035   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
1036   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
1037   7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
1038   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
1039   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
1040   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
1041   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
1042   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
1043   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
1044   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
1045   8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1046   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1047   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1048   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1049   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1050   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1051   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1052   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1053   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1054   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1055   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1056   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1057   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1058   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1059   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
1060   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
1061 };
1062
1063 /* Typed allocation function.  Does nothing special in this collector.  */
1064
1065 void *
1066 ggc_alloc_typed_stat (enum gt_types_enum type ATTRIBUTE_UNUSED, size_t size
1067                       MEM_STAT_DECL)
1068 {
1069   return ggc_alloc_stat (size PASS_MEM_STAT);
1070 }
1071
1072 /* Allocate a chunk of memory of SIZE bytes.  Its contents are undefined.  */
1073
1074 void *
1075 ggc_alloc_stat (size_t size MEM_STAT_DECL)
1076 {
1077   size_t order, word, bit, object_offset, object_size;
1078   struct page_entry *entry;
1079   void *result;
1080
1081   if (size < 512)
1082     {
1083       order = size_lookup[size];
1084       object_size = OBJECT_SIZE (order);
1085     }
1086   else
1087     {
1088       order = 10;
1089       while (size > (object_size = OBJECT_SIZE (order)))
1090         order++;
1091     }
1092
1093   /* If there are non-full pages for this size allocation, they are at
1094      the head of the list.  */
1095   entry = G.pages[order];
1096
1097   /* If there is no page for this object size, or all pages in this
1098      context are full, allocate a new page.  */
1099   if (entry == NULL || entry->num_free_objects == 0)
1100     {
1101       struct page_entry *new_entry;
1102       new_entry = alloc_page (order);
1103
1104       new_entry->index_by_depth = G.by_depth_in_use;
1105       push_by_depth (new_entry, 0);
1106
1107       /* We can skip context depths, if we do, make sure we go all the
1108          way to the new depth.  */
1109       while (new_entry->context_depth >= G.depth_in_use)
1110         push_depth (G.by_depth_in_use-1);
1111
1112       /* If this is the only entry, it's also the tail.  If it is not
1113          the only entry, then we must update the PREV pointer of the
1114          ENTRY (G.pages[order]) to point to our new page entry.  */
1115       if (entry == NULL)
1116         G.page_tails[order] = new_entry;
1117       else
1118         entry->prev = new_entry;
1119
1120       /* Put new pages at the head of the page list.  By definition the
1121          entry at the head of the list always has a NULL pointer.  */
1122       new_entry->next = entry;
1123       new_entry->prev = NULL;
1124       entry = new_entry;
1125       G.pages[order] = new_entry;
1126
1127       /* For a new page, we know the word and bit positions (in the
1128          in_use bitmap) of the first available object -- they're zero.  */
1129       new_entry->next_bit_hint = 1;
1130       word = 0;
1131       bit = 0;
1132       object_offset = 0;
1133     }
1134   else
1135     {
1136       /* First try to use the hint left from the previous allocation
1137          to locate a clear bit in the in-use bitmap.  We've made sure
1138          that the one-past-the-end bit is always set, so if the hint
1139          has run over, this test will fail.  */
1140       unsigned hint = entry->next_bit_hint;
1141       word = hint / HOST_BITS_PER_LONG;
1142       bit = hint % HOST_BITS_PER_LONG;
1143
1144       /* If the hint didn't work, scan the bitmap from the beginning.  */
1145       if ((entry->in_use_p[word] >> bit) & 1)
1146         {
1147           word = bit = 0;
1148           while (~entry->in_use_p[word] == 0)
1149             ++word;
1150
1151 #if GCC_VERSION >= 3004
1152           bit = __builtin_ctzl (~entry->in_use_p[word]);
1153 #else
1154           while ((entry->in_use_p[word] >> bit) & 1)
1155             ++bit;
1156 #endif
1157
1158           hint = word * HOST_BITS_PER_LONG + bit;
1159         }
1160
1161       /* Next time, try the next bit.  */
1162       entry->next_bit_hint = hint + 1;
1163
1164       object_offset = hint * object_size;
1165     }
1166
1167   /* Set the in-use bit.  */
1168   entry->in_use_p[word] |= ((unsigned long) 1 << bit);
1169
1170   /* Keep a running total of the number of free objects.  If this page
1171      fills up, we may have to move it to the end of the list if the
1172      next page isn't full.  If the next page is full, all subsequent
1173      pages are full, so there's no need to move it.  */
1174   if (--entry->num_free_objects == 0
1175       && entry->next != NULL
1176       && entry->next->num_free_objects > 0)
1177     {
1178       /* We have a new head for the list.  */
1179       G.pages[order] = entry->next;
1180
1181       /* We are moving ENTRY to the end of the page table list.
1182          The new page at the head of the list will have NULL in
1183          its PREV field and ENTRY will have NULL in its NEXT field.  */
1184       entry->next->prev = NULL;
1185       entry->next = NULL;
1186
1187       /* Append ENTRY to the tail of the list.  */
1188       entry->prev = G.page_tails[order];
1189       G.page_tails[order]->next = entry;
1190       G.page_tails[order] = entry;
1191     }
1192
1193   /* Calculate the object's address.  */
1194   result = entry->page + object_offset;
1195 #ifdef GATHER_STATISTICS
1196   ggc_record_overhead (OBJECT_SIZE (order), OBJECT_SIZE (order) - size,
1197                        result PASS_MEM_STAT);
1198 #endif
1199
1200 #ifdef ENABLE_GC_CHECKING
1201   /* Keep poisoning-by-writing-0xaf the object, in an attempt to keep the
1202      exact same semantics in presence of memory bugs, regardless of
1203      ENABLE_VALGRIND_CHECKING.  We override this request below.  Drop the
1204      handle to avoid handle leak.  */
1205   VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (result, object_size));
1206
1207   /* `Poison' the entire allocated object, including any padding at
1208      the end.  */
1209   memset (result, 0xaf, object_size);
1210
1211   /* Make the bytes after the end of the object unaccessible.  Discard the
1212      handle to avoid handle leak.  */
1213   VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS ((char *) result + size,
1214                                             object_size - size));
1215 #endif
1216
1217   /* Tell Valgrind that the memory is there, but its content isn't
1218      defined.  The bytes at the end of the object are still marked
1219      unaccessible.  */
1220   VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (result, size));
1221
1222   /* Keep track of how many bytes are being allocated.  This
1223      information is used in deciding when to collect.  */
1224   G.allocated += object_size;
1225
1226   /* For timevar statistics.  */
1227   timevar_ggc_mem_total += object_size;
1228
1229 #ifdef GATHER_STATISTICS
1230   {
1231     size_t overhead = object_size - size;
1232
1233     G.stats.total_overhead += overhead;
1234     G.stats.total_allocated += object_size;
1235     G.stats.total_overhead_per_order[order] += overhead;
1236     G.stats.total_allocated_per_order[order] += object_size;
1237
1238     if (size <= 32)
1239       {
1240         G.stats.total_overhead_under32 += overhead;
1241         G.stats.total_allocated_under32 += object_size;
1242       }
1243     if (size <= 64)
1244       {
1245         G.stats.total_overhead_under64 += overhead;
1246         G.stats.total_allocated_under64 += object_size;
1247       }
1248     if (size <= 128)
1249       {
1250         G.stats.total_overhead_under128 += overhead;
1251         G.stats.total_allocated_under128 += object_size;
1252       }
1253   }
1254 #endif
1255
1256   if (GGC_DEBUG_LEVEL >= 3)
1257     fprintf (G.debug_file,
1258              "Allocating object, requested size=%lu, actual=%lu at %p on %p\n",
1259              (unsigned long) size, (unsigned long) object_size, result,
1260              (void *) entry);
1261
1262   return result;
1263 }
1264
1265 /* If P is not marked, marks it and return false.  Otherwise return true.
1266    P must have been allocated by the GC allocator; it mustn't point to
1267    static objects, stack variables, or memory allocated with malloc.  */
1268
1269 int
1270 ggc_set_mark (const void *p)
1271 {
1272   page_entry *entry;
1273   unsigned bit, word;
1274   unsigned long mask;
1275
1276   /* Look up the page on which the object is alloced.  If the object
1277      wasn't allocated by the collector, we'll probably die.  */
1278   entry = lookup_page_table_entry (p);
1279   gcc_assert (entry);
1280
1281   /* Calculate the index of the object on the page; this is its bit
1282      position in the in_use_p bitmap.  */
1283   bit = OFFSET_TO_BIT (((const char *) p) - entry->page, entry->order);
1284   word = bit / HOST_BITS_PER_LONG;
1285   mask = (unsigned long) 1 << (bit % HOST_BITS_PER_LONG);
1286
1287   /* If the bit was previously set, skip it.  */
1288   if (entry->in_use_p[word] & mask)
1289     return 1;
1290
1291   /* Otherwise set it, and decrement the free object count.  */
1292   entry->in_use_p[word] |= mask;
1293   entry->num_free_objects -= 1;
1294
1295   if (GGC_DEBUG_LEVEL >= 4)
1296     fprintf (G.debug_file, "Marking %p\n", p);
1297
1298   return 0;
1299 }
1300
1301 /* Return 1 if P has been marked, zero otherwise.
1302    P must have been allocated by the GC allocator; it mustn't point to
1303    static objects, stack variables, or memory allocated with malloc.  */
1304
1305 int
1306 ggc_marked_p (const void *p)
1307 {
1308   page_entry *entry;
1309   unsigned bit, word;
1310   unsigned long mask;
1311
1312   /* Look up the page on which the object is alloced.  If the object
1313      wasn't allocated by the collector, we'll probably die.  */
1314   entry = lookup_page_table_entry (p);
1315   gcc_assert (entry);
1316
1317   /* Calculate the index of the object on the page; this is its bit
1318      position in the in_use_p bitmap.  */
1319   bit = OFFSET_TO_BIT (((const char *) p) - entry->page, entry->order);
1320   word = bit / HOST_BITS_PER_LONG;
1321   mask = (unsigned long) 1 << (bit % HOST_BITS_PER_LONG);
1322
1323   return (entry->in_use_p[word] & mask) != 0;
1324 }
1325
1326 /* Return the size of the gc-able object P.  */
1327
1328 size_t
1329 ggc_get_size (const void *p)
1330 {
1331   page_entry *pe = lookup_page_table_entry (p);
1332   return OBJECT_SIZE (pe->order);
1333 }
1334
1335 /* Release the memory for object P.  */
1336
1337 void
1338 ggc_free (void *p)
1339 {
1340   page_entry *pe = lookup_page_table_entry (p);
1341   size_t order = pe->order;
1342   size_t size = OBJECT_SIZE (order);
1343
1344 #ifdef GATHER_STATISTICS
1345   ggc_free_overhead (p);
1346 #endif
1347
1348   if (GGC_DEBUG_LEVEL >= 3)
1349     fprintf (G.debug_file,
1350              "Freeing object, actual size=%lu, at %p on %p\n",
1351              (unsigned long) size, p, (void *) pe);
1352
1353 #ifdef ENABLE_GC_CHECKING
1354   /* Poison the data, to indicate the data is garbage.  */
1355   VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (p, size));
1356   memset (p, 0xa5, size);
1357 #endif
1358   /* Let valgrind know the object is free.  */
1359   VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (p, size));
1360
1361 #ifdef ENABLE_GC_ALWAYS_COLLECT
1362   /* In the completely-anal-checking mode, we do *not* immediately free
1363      the data, but instead verify that the data is *actually* not 
1364      reachable the next time we collect.  */
1365   {
1366     struct free_object *fo = XNEW (struct free_object);
1367     fo->object = p;
1368     fo->next = G.free_object_list;
1369     G.free_object_list = fo;
1370   }
1371 #else
1372   {
1373     unsigned int bit_offset, word, bit;
1374
1375     G.allocated -= size;
1376
1377     /* Mark the object not-in-use.  */
1378     bit_offset = OFFSET_TO_BIT (((const char *) p) - pe->page, order);
1379     word = bit_offset / HOST_BITS_PER_LONG;
1380     bit = bit_offset % HOST_BITS_PER_LONG;
1381     pe->in_use_p[word] &= ~(1UL << bit);
1382
1383     if (pe->num_free_objects++ == 0)
1384       {
1385         page_entry *p, *q;
1386
1387         /* If the page is completely full, then it's supposed to
1388            be after all pages that aren't.  Since we've freed one
1389            object from a page that was full, we need to move the
1390            page to the head of the list. 
1391
1392            PE is the node we want to move.  Q is the previous node
1393            and P is the next node in the list.  */
1394         q = pe->prev;
1395         if (q && q->num_free_objects == 0)
1396           {
1397             p = pe->next;
1398
1399             q->next = p;
1400
1401             /* If PE was at the end of the list, then Q becomes the
1402                new end of the list.  If PE was not the end of the
1403                list, then we need to update the PREV field for P.  */
1404             if (!p)
1405               G.page_tails[order] = q;
1406             else
1407               p->prev = q;
1408
1409             /* Move PE to the head of the list.  */
1410             pe->next = G.pages[order];
1411             pe->prev = NULL;
1412             G.pages[order]->prev = pe;
1413             G.pages[order] = pe;
1414           }
1415
1416         /* Reset the hint bit to point to the only free object.  */
1417         pe->next_bit_hint = bit_offset;
1418       }
1419   }
1420 #endif
1421 }
1422 \f
1423 /* Subroutine of init_ggc which computes the pair of numbers used to
1424    perform division by OBJECT_SIZE (order) and fills in inverse_table[].
1425
1426    This algorithm is taken from Granlund and Montgomery's paper
1427    "Division by Invariant Integers using Multiplication"
1428    (Proc. SIGPLAN PLDI, 1994), section 9 (Exact division by
1429    constants).  */
1430
1431 static void
1432 compute_inverse (unsigned order)
1433 {
1434   size_t size, inv; 
1435   unsigned int e;
1436
1437   size = OBJECT_SIZE (order);
1438   e = 0;
1439   while (size % 2 == 0)
1440     {
1441       e++;
1442       size >>= 1;
1443     }
1444
1445   inv = size;
1446   while (inv * size != 1)
1447     inv = inv * (2 - inv*size);
1448
1449   DIV_MULT (order) = inv;
1450   DIV_SHIFT (order) = e;
1451 }
1452
1453 /* Initialize the ggc-mmap allocator.  */
1454 void
1455 init_ggc (void)
1456 {
1457   unsigned order;
1458
1459   G.pagesize = getpagesize();
1460   G.lg_pagesize = exact_log2 (G.pagesize);
1461
1462 #ifdef HAVE_MMAP_DEV_ZERO
1463   G.dev_zero_fd = open ("/dev/zero", O_RDONLY);
1464   if (G.dev_zero_fd == -1)
1465     internal_error ("open /dev/zero: %m");
1466 #endif
1467
1468 #if 0
1469   G.debug_file = fopen ("ggc-mmap.debug", "w");
1470 #else
1471   G.debug_file = stdout;
1472 #endif
1473
1474 #ifdef USING_MMAP
1475   /* StunOS has an amazing off-by-one error for the first mmap allocation
1476      after fiddling with RLIMIT_STACK.  The result, as hard as it is to
1477      believe, is an unaligned page allocation, which would cause us to
1478      hork badly if we tried to use it.  */
1479   {
1480     char *p = alloc_anon (NULL, G.pagesize);
1481     struct page_entry *e;
1482     if ((size_t)p & (G.pagesize - 1))
1483       {
1484         /* How losing.  Discard this one and try another.  If we still
1485            can't get something useful, give up.  */
1486
1487         p = alloc_anon (NULL, G.pagesize);
1488         gcc_assert (!((size_t)p & (G.pagesize - 1)));
1489       }
1490
1491     /* We have a good page, might as well hold onto it...  */
1492     e = XCNEW (struct page_entry);
1493     e->bytes = G.pagesize;
1494     e->page = p;
1495     e->next = G.free_pages;
1496     G.free_pages = e;
1497   }
1498 #endif
1499
1500   /* Initialize the object size table.  */
1501   for (order = 0; order < HOST_BITS_PER_PTR; ++order)
1502     object_size_table[order] = (size_t) 1 << order;
1503   for (order = HOST_BITS_PER_PTR; order < NUM_ORDERS; ++order)
1504     {
1505       size_t s = extra_order_size_table[order - HOST_BITS_PER_PTR];
1506
1507       /* If S is not a multiple of the MAX_ALIGNMENT, then round it up
1508          so that we're sure of getting aligned memory.  */
1509       s = ROUND_UP (s, MAX_ALIGNMENT);
1510       object_size_table[order] = s;
1511     }
1512
1513   /* Initialize the objects-per-page and inverse tables.  */
1514   for (order = 0; order < NUM_ORDERS; ++order)
1515     {
1516       objects_per_page_table[order] = G.pagesize / OBJECT_SIZE (order);
1517       if (objects_per_page_table[order] == 0)
1518         objects_per_page_table[order] = 1;
1519       compute_inverse (order);
1520     }
1521
1522   /* Reset the size_lookup array to put appropriately sized objects in
1523      the special orders.  All objects bigger than the previous power
1524      of two, but no greater than the special size, should go in the
1525      new order.  */
1526   for (order = HOST_BITS_PER_PTR; order < NUM_ORDERS; ++order)
1527     {
1528       int o;
1529       int i;
1530
1531       o = size_lookup[OBJECT_SIZE (order)];
1532       for (i = OBJECT_SIZE (order); size_lookup [i] == o; --i)
1533         size_lookup[i] = order;
1534     }
1535
1536   G.depth_in_use = 0;
1537   G.depth_max = 10;
1538   G.depth = XNEWVEC (unsigned int, G.depth_max);
1539
1540   G.by_depth_in_use = 0;
1541   G.by_depth_max = INITIAL_PTE_COUNT;
1542   G.by_depth = XNEWVEC (page_entry *, G.by_depth_max);
1543   G.save_in_use = XNEWVEC (unsigned long *, G.by_depth_max);
1544 }
1545
1546 /* Start a new GGC zone.  */
1547
1548 struct alloc_zone *
1549 new_ggc_zone (const char *name ATTRIBUTE_UNUSED)
1550 {
1551   return NULL;
1552 }
1553
1554 /* Destroy a GGC zone.  */
1555 void
1556 destroy_ggc_zone (struct alloc_zone *zone ATTRIBUTE_UNUSED)
1557 {
1558 }
1559
1560 /* Merge the SAVE_IN_USE_P and IN_USE_P arrays in P so that IN_USE_P
1561    reflects reality.  Recalculate NUM_FREE_OBJECTS as well.  */
1562
1563 static void
1564 ggc_recalculate_in_use_p (page_entry *p)
1565 {
1566   unsigned int i;
1567   size_t num_objects;
1568
1569   /* Because the past-the-end bit in in_use_p is always set, we
1570      pretend there is one additional object.  */
1571   num_objects = OBJECTS_IN_PAGE (p) + 1;
1572
1573   /* Reset the free object count.  */
1574   p->num_free_objects = num_objects;
1575
1576   /* Combine the IN_USE_P and SAVE_IN_USE_P arrays.  */
1577   for (i = 0;
1578        i < CEIL (BITMAP_SIZE (num_objects),
1579                  sizeof (*p->in_use_p));
1580        ++i)
1581     {
1582       unsigned long j;
1583
1584       /* Something is in use if it is marked, or if it was in use in a
1585          context further down the context stack.  */
1586       p->in_use_p[i] |= save_in_use_p (p)[i];
1587
1588       /* Decrement the free object count for every object allocated.  */
1589       for (j = p->in_use_p[i]; j; j >>= 1)
1590         p->num_free_objects -= (j & 1);
1591     }
1592
1593   gcc_assert (p->num_free_objects < num_objects);
1594 }
1595 \f
1596 /* Unmark all objects.  */
1597
1598 static void
1599 clear_marks (void)
1600 {
1601   unsigned order;
1602
1603   for (order = 2; order < NUM_ORDERS; order++)
1604     {
1605       page_entry *p;
1606
1607       for (p = G.pages[order]; p != NULL; p = p->next)
1608         {
1609           size_t num_objects = OBJECTS_IN_PAGE (p);
1610           size_t bitmap_size = BITMAP_SIZE (num_objects + 1);
1611
1612           /* The data should be page-aligned.  */
1613           gcc_assert (!((size_t) p->page & (G.pagesize - 1)));
1614
1615           /* Pages that aren't in the topmost context are not collected;
1616              nevertheless, we need their in-use bit vectors to store GC
1617              marks.  So, back them up first.  */
1618           if (p->context_depth < G.context_depth)
1619             {
1620               if (! save_in_use_p (p))
1621                 save_in_use_p (p) = xmalloc (bitmap_size);
1622               memcpy (save_in_use_p (p), p->in_use_p, bitmap_size);
1623             }
1624
1625           /* Reset reset the number of free objects and clear the
1626              in-use bits.  These will be adjusted by mark_obj.  */
1627           p->num_free_objects = num_objects;
1628           memset (p->in_use_p, 0, bitmap_size);
1629
1630           /* Make sure the one-past-the-end bit is always set.  */
1631           p->in_use_p[num_objects / HOST_BITS_PER_LONG]
1632             = ((unsigned long) 1 << (num_objects % HOST_BITS_PER_LONG));
1633         }
1634     }
1635 }
1636
1637 /* Free all empty pages.  Partially empty pages need no attention
1638    because the `mark' bit doubles as an `unused' bit.  */
1639
1640 static void
1641 sweep_pages (void)
1642 {
1643   unsigned order;
1644
1645   for (order = 2; order < NUM_ORDERS; order++)
1646     {
1647       /* The last page-entry to consider, regardless of entries
1648          placed at the end of the list.  */
1649       page_entry * const last = G.page_tails[order];
1650
1651       size_t num_objects;
1652       size_t live_objects;
1653       page_entry *p, *previous;
1654       int done;
1655
1656       p = G.pages[order];
1657       if (p == NULL)
1658         continue;
1659
1660       previous = NULL;
1661       do
1662         {
1663           page_entry *next = p->next;
1664
1665           /* Loop until all entries have been examined.  */
1666           done = (p == last);
1667
1668           num_objects = OBJECTS_IN_PAGE (p);
1669
1670           /* Add all live objects on this page to the count of
1671              allocated memory.  */
1672           live_objects = num_objects - p->num_free_objects;
1673
1674           G.allocated += OBJECT_SIZE (order) * live_objects;
1675
1676           /* Only objects on pages in the topmost context should get
1677              collected.  */
1678           if (p->context_depth < G.context_depth)
1679             ;
1680
1681           /* Remove the page if it's empty.  */
1682           else if (live_objects == 0)
1683             {
1684               /* If P was the first page in the list, then NEXT
1685                  becomes the new first page in the list, otherwise
1686                  splice P out of the forward pointers.  */
1687               if (! previous)
1688                 G.pages[order] = next;
1689               else
1690                 previous->next = next;
1691             
1692               /* Splice P out of the back pointers too.  */
1693               if (next)
1694                 next->prev = previous;
1695
1696               /* Are we removing the last element?  */
1697               if (p == G.page_tails[order])
1698                 G.page_tails[order] = previous;
1699               free_page (p);
1700               p = previous;
1701             }
1702
1703           /* If the page is full, move it to the end.  */
1704           else if (p->num_free_objects == 0)
1705             {
1706               /* Don't move it if it's already at the end.  */
1707               if (p != G.page_tails[order])
1708                 {
1709                   /* Move p to the end of the list.  */
1710                   p->next = NULL;
1711                   p->prev = G.page_tails[order];
1712                   G.page_tails[order]->next = p;
1713
1714                   /* Update the tail pointer...  */
1715                   G.page_tails[order] = p;
1716
1717                   /* ... and the head pointer, if necessary.  */
1718                   if (! previous)
1719                     G.pages[order] = next;
1720                   else
1721                     previous->next = next;
1722
1723                   /* And update the backpointer in NEXT if necessary.  */
1724                   if (next)
1725                     next->prev = previous;
1726
1727                   p = previous;
1728                 }
1729             }
1730
1731           /* If we've fallen through to here, it's a page in the
1732              topmost context that is neither full nor empty.  Such a
1733              page must precede pages at lesser context depth in the
1734              list, so move it to the head.  */
1735           else if (p != G.pages[order])
1736             {
1737               previous->next = p->next;
1738
1739               /* Update the backchain in the next node if it exists.  */
1740               if (p->next)
1741                 p->next->prev = previous;
1742
1743               /* Move P to the head of the list.  */
1744               p->next = G.pages[order];
1745               p->prev = NULL;
1746               G.pages[order]->prev = p;
1747
1748               /* Update the head pointer.  */
1749               G.pages[order] = p;
1750
1751               /* Are we moving the last element?  */
1752               if (G.page_tails[order] == p)
1753                 G.page_tails[order] = previous;
1754               p = previous;
1755             }
1756
1757           previous = p;
1758           p = next;
1759         }
1760       while (! done);
1761
1762       /* Now, restore the in_use_p vectors for any pages from contexts
1763          other than the current one.  */
1764       for (p = G.pages[order]; p; p = p->next)
1765         if (p->context_depth != G.context_depth)
1766           ggc_recalculate_in_use_p (p);
1767     }
1768 }
1769
1770 #ifdef ENABLE_GC_CHECKING
1771 /* Clobber all free objects.  */
1772
1773 static void
1774 poison_pages (void)
1775 {
1776   unsigned order;
1777
1778   for (order = 2; order < NUM_ORDERS; order++)
1779     {
1780       size_t size = OBJECT_SIZE (order);
1781       page_entry *p;
1782
1783       for (p = G.pages[order]; p != NULL; p = p->next)
1784         {
1785           size_t num_objects;
1786           size_t i;
1787
1788           if (p->context_depth != G.context_depth)
1789             /* Since we don't do any collection for pages in pushed
1790                contexts, there's no need to do any poisoning.  And
1791                besides, the IN_USE_P array isn't valid until we pop
1792                contexts.  */
1793             continue;
1794
1795           num_objects = OBJECTS_IN_PAGE (p);
1796           for (i = 0; i < num_objects; i++)
1797             {
1798               size_t word, bit;
1799               word = i / HOST_BITS_PER_LONG;
1800               bit = i % HOST_BITS_PER_LONG;
1801               if (((p->in_use_p[word] >> bit) & 1) == 0)
1802                 {
1803                   char *object = p->page + i * size;
1804
1805                   /* Keep poison-by-write when we expect to use Valgrind,
1806                      so the exact same memory semantics is kept, in case
1807                      there are memory errors.  We override this request
1808                      below.  */
1809                   VALGRIND_DISCARD (VALGRIND_MAKE_WRITABLE (object, size));
1810                   memset (object, 0xa5, size);
1811
1812                   /* Drop the handle to avoid handle leak.  */
1813                   VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (object, size));
1814                 }
1815             }
1816         }
1817     }
1818 }
1819 #else
1820 #define poison_pages()
1821 #endif
1822
1823 #ifdef ENABLE_GC_ALWAYS_COLLECT
1824 /* Validate that the reportedly free objects actually are.  */
1825
1826 static void
1827 validate_free_objects (void)
1828 {
1829   struct free_object *f, *next, *still_free = NULL;
1830
1831   for (f = G.free_object_list; f ; f = next)
1832     {
1833       page_entry *pe = lookup_page_table_entry (f->object);
1834       size_t bit, word;
1835
1836       bit = OFFSET_TO_BIT ((char *)f->object - pe->page, pe->order);
1837       word = bit / HOST_BITS_PER_LONG;
1838       bit = bit % HOST_BITS_PER_LONG;
1839       next = f->next;
1840
1841       /* Make certain it isn't visible from any root.  Notice that we
1842          do this check before sweep_pages merges save_in_use_p.  */
1843       gcc_assert (!(pe->in_use_p[word] & (1UL << bit)));
1844
1845       /* If the object comes from an outer context, then retain the
1846          free_object entry, so that we can verify that the address
1847          isn't live on the stack in some outer context.  */
1848       if (pe->context_depth != G.context_depth)
1849         {
1850           f->next = still_free;
1851           still_free = f;
1852         }
1853       else
1854         free (f);
1855     }
1856
1857   G.free_object_list = still_free;
1858 }
1859 #else
1860 #define validate_free_objects()
1861 #endif
1862
1863 /* Top level mark-and-sweep routine.  */
1864
1865 void
1866 ggc_collect (void)
1867 {
1868   /* Avoid frequent unnecessary work by skipping collection if the
1869      total allocations haven't expanded much since the last
1870      collection.  */
1871   float allocated_last_gc =
1872     MAX (G.allocated_last_gc, (size_t)PARAM_VALUE (GGC_MIN_HEAPSIZE) * 1024);
1873
1874   float min_expand = allocated_last_gc * PARAM_VALUE (GGC_MIN_EXPAND) / 100;
1875
1876   if (G.allocated < allocated_last_gc + min_expand && !ggc_force_collect)
1877     return;
1878
1879   timevar_push (TV_GC);
1880   if (!quiet_flag)
1881     fprintf (stderr, " {GC %luk -> ", (unsigned long) G.allocated / 1024);
1882   if (GGC_DEBUG_LEVEL >= 2)
1883     fprintf (G.debug_file, "BEGIN COLLECTING\n");
1884
1885   /* Zero the total allocated bytes.  This will be recalculated in the
1886      sweep phase.  */
1887   G.allocated = 0;
1888
1889   /* Release the pages we freed the last time we collected, but didn't
1890      reuse in the interim.  */
1891   release_pages ();
1892
1893   /* Indicate that we've seen collections at this context depth.  */
1894   G.context_depth_collections = ((unsigned long)1 << (G.context_depth + 1)) - 1;
1895
1896   clear_marks ();
1897   ggc_mark_roots ();
1898 #ifdef GATHER_STATISTICS
1899   ggc_prune_overhead_list ();
1900 #endif
1901   poison_pages ();
1902   validate_free_objects ();
1903   sweep_pages ();
1904
1905   G.allocated_last_gc = G.allocated;
1906
1907   timevar_pop (TV_GC);
1908
1909   if (!quiet_flag)
1910     fprintf (stderr, "%luk}", (unsigned long) G.allocated / 1024);
1911   if (GGC_DEBUG_LEVEL >= 2)
1912     fprintf (G.debug_file, "END COLLECTING\n");
1913 }
1914
1915 /* Print allocation statistics.  */
1916 #define SCALE(x) ((unsigned long) ((x) < 1024*10 \
1917                   ? (x) \
1918                   : ((x) < 1024*1024*10 \
1919                      ? (x) / 1024 \
1920                      : (x) / (1024*1024))))
1921 #define STAT_LABEL(x) ((x) < 1024*10 ? ' ' : ((x) < 1024*1024*10 ? 'k' : 'M'))
1922
1923 void
1924 ggc_print_statistics (void)
1925 {
1926   struct ggc_statistics stats;
1927   unsigned int i;
1928   size_t total_overhead = 0;
1929
1930   /* Clear the statistics.  */
1931   memset (&stats, 0, sizeof (stats));
1932
1933   /* Make sure collection will really occur.  */
1934   G.allocated_last_gc = 0;
1935
1936   /* Collect and print the statistics common across collectors.  */
1937   ggc_print_common_statistics (stderr, &stats);
1938
1939   /* Release free pages so that we will not count the bytes allocated
1940      there as part of the total allocated memory.  */
1941   release_pages ();
1942
1943   /* Collect some information about the various sizes of
1944      allocation.  */
1945   fprintf (stderr,
1946            "Memory still allocated at the end of the compilation process\n");
1947   fprintf (stderr, "%-5s %10s  %10s  %10s\n",
1948            "Size", "Allocated", "Used", "Overhead");
1949   for (i = 0; i < NUM_ORDERS; ++i)
1950     {
1951       page_entry *p;
1952       size_t allocated;
1953       size_t in_use;
1954       size_t overhead;
1955
1956       /* Skip empty entries.  */
1957       if (!G.pages[i])
1958         continue;
1959
1960       overhead = allocated = in_use = 0;
1961
1962       /* Figure out the total number of bytes allocated for objects of
1963          this size, and how many of them are actually in use.  Also figure
1964          out how much memory the page table is using.  */
1965       for (p = G.pages[i]; p; p = p->next)
1966         {
1967           allocated += p->bytes;
1968           in_use +=
1969             (OBJECTS_IN_PAGE (p) - p->num_free_objects) * OBJECT_SIZE (i);
1970
1971           overhead += (sizeof (page_entry) - sizeof (long)
1972                        + BITMAP_SIZE (OBJECTS_IN_PAGE (p) + 1));
1973         }
1974       fprintf (stderr, "%-5lu %10lu%c %10lu%c %10lu%c\n",
1975                (unsigned long) OBJECT_SIZE (i),
1976                SCALE (allocated), STAT_LABEL (allocated),
1977                SCALE (in_use), STAT_LABEL (in_use),
1978                SCALE (overhead), STAT_LABEL (overhead));
1979       total_overhead += overhead;
1980     }
1981   fprintf (stderr, "%-5s %10lu%c %10lu%c %10lu%c\n", "Total",
1982            SCALE (G.bytes_mapped), STAT_LABEL (G.bytes_mapped),
1983            SCALE (G.allocated), STAT_LABEL(G.allocated),
1984            SCALE (total_overhead), STAT_LABEL (total_overhead));
1985
1986 #ifdef GATHER_STATISTICS  
1987   {
1988     fprintf (stderr, "\nTotal allocations and overheads during the compilation process\n");
1989
1990     fprintf (stderr, "Total Overhead:                        %10lld\n",
1991              G.stats.total_overhead);
1992     fprintf (stderr, "Total Allocated:                       %10lld\n",
1993              G.stats.total_allocated);
1994
1995     fprintf (stderr, "Total Overhead  under  32B:            %10lld\n",
1996              G.stats.total_overhead_under32);
1997     fprintf (stderr, "Total Allocated under  32B:            %10lld\n",
1998              G.stats.total_allocated_under32);
1999     fprintf (stderr, "Total Overhead  under  64B:            %10lld\n",
2000              G.stats.total_overhead_under64);
2001     fprintf (stderr, "Total Allocated under  64B:            %10lld\n",
2002              G.stats.total_allocated_under64);
2003     fprintf (stderr, "Total Overhead  under 128B:            %10lld\n",
2004              G.stats.total_overhead_under128);
2005     fprintf (stderr, "Total Allocated under 128B:            %10lld\n",
2006              G.stats.total_allocated_under128);
2007    
2008     for (i = 0; i < NUM_ORDERS; i++)
2009       if (G.stats.total_allocated_per_order[i])
2010         {
2011           fprintf (stderr, "Total Overhead  page size %7d:     %10lld\n",
2012                    OBJECT_SIZE (i), G.stats.total_overhead_per_order[i]);
2013           fprintf (stderr, "Total Allocated page size %7d:     %10lld\n",
2014                    OBJECT_SIZE (i), G.stats.total_allocated_per_order[i]);
2015         }
2016   }
2017 #endif
2018 }
2019 \f
2020 struct ggc_pch_data
2021 {
2022   struct ggc_pch_ondisk
2023   {
2024     unsigned totals[NUM_ORDERS];
2025   } d;
2026   size_t base[NUM_ORDERS];
2027   size_t written[NUM_ORDERS];
2028 };
2029
2030 struct ggc_pch_data *
2031 init_ggc_pch (void)
2032 {
2033   return XCNEW (struct ggc_pch_data);
2034 }
2035
2036 void
2037 ggc_pch_count_object (struct ggc_pch_data *d, void *x ATTRIBUTE_UNUSED,
2038                       size_t size, bool is_string ATTRIBUTE_UNUSED,
2039                       enum gt_types_enum type ATTRIBUTE_UNUSED)
2040 {
2041   unsigned order;
2042
2043   if (size < 512)
2044     order = size_lookup[size];
2045   else
2046     {
2047       order = 10;
2048       while (size > OBJECT_SIZE (order))
2049         order++;
2050     }
2051
2052   d->d.totals[order]++;
2053 }
2054
2055 size_t
2056 ggc_pch_total_size (struct ggc_pch_data *d)
2057 {
2058   size_t a = 0;
2059   unsigned i;
2060
2061   for (i = 0; i < NUM_ORDERS; i++)
2062     a += ROUND_UP (d->d.totals[i] * OBJECT_SIZE (i), G.pagesize);
2063   return a;
2064 }
2065
2066 void
2067 ggc_pch_this_base (struct ggc_pch_data *d, void *base)
2068 {
2069   size_t a = (size_t) base;
2070   unsigned i;
2071
2072   for (i = 0; i < NUM_ORDERS; i++)
2073     {
2074       d->base[i] = a;
2075       a += ROUND_UP (d->d.totals[i] * OBJECT_SIZE (i), G.pagesize);
2076     }
2077 }
2078
2079
2080 char *
2081 ggc_pch_alloc_object (struct ggc_pch_data *d, void *x ATTRIBUTE_UNUSED,
2082                       size_t size, bool is_string ATTRIBUTE_UNUSED,
2083                       enum gt_types_enum type ATTRIBUTE_UNUSED)
2084 {
2085   unsigned order;
2086   char *result;
2087
2088   if (size < 512)
2089     order = size_lookup[size];
2090   else
2091     {
2092       order = 10;
2093       while (size > OBJECT_SIZE (order))
2094         order++;
2095     }
2096
2097   result = (char *) d->base[order];
2098   d->base[order] += OBJECT_SIZE (order);
2099   return result;
2100 }
2101
2102 void
2103 ggc_pch_prepare_write (struct ggc_pch_data *d ATTRIBUTE_UNUSED,
2104                        FILE *f ATTRIBUTE_UNUSED)
2105 {
2106   /* Nothing to do.  */
2107 }
2108
2109 void
2110 ggc_pch_write_object (struct ggc_pch_data *d ATTRIBUTE_UNUSED,
2111                       FILE *f, void *x, void *newx ATTRIBUTE_UNUSED,
2112                       size_t size, bool is_string ATTRIBUTE_UNUSED)
2113 {
2114   unsigned order;
2115   static const char emptyBytes[256];
2116
2117   if (size < 512)
2118     order = size_lookup[size];
2119   else
2120     {
2121       order = 10;
2122       while (size > OBJECT_SIZE (order))
2123         order++;
2124     }
2125
2126   if (fwrite (x, size, 1, f) != 1)
2127     fatal_error ("can't write PCH file: %m");
2128
2129   /* If SIZE is not the same as OBJECT_SIZE(order), then we need to pad the
2130      object out to OBJECT_SIZE(order).  This happens for strings.  */
2131
2132   if (size != OBJECT_SIZE (order))
2133     {
2134       unsigned padding = OBJECT_SIZE(order) - size;
2135
2136       /* To speed small writes, we use a nulled-out array that's larger
2137          than most padding requests as the source for our null bytes.  This
2138          permits us to do the padding with fwrite() rather than fseek(), and
2139          limits the chance the OS may try to flush any outstanding writes.  */
2140       if (padding <= sizeof(emptyBytes))
2141         {
2142           if (fwrite (emptyBytes, 1, padding, f) != padding)
2143             fatal_error ("can't write PCH file");
2144         }
2145       else
2146         {
2147           /* Larger than our buffer?  Just default to fseek.  */
2148           if (fseek (f, padding, SEEK_CUR) != 0)
2149             fatal_error ("can't write PCH file");
2150         }
2151     }
2152
2153   d->written[order]++;
2154   if (d->written[order] == d->d.totals[order]
2155       && fseek (f, ROUND_UP_VALUE (d->d.totals[order] * OBJECT_SIZE (order),
2156                                    G.pagesize),
2157                 SEEK_CUR) != 0)
2158     fatal_error ("can't write PCH file: %m");
2159 }
2160
2161 void
2162 ggc_pch_finish (struct ggc_pch_data *d, FILE *f)
2163 {
2164   if (fwrite (&d->d, sizeof (d->d), 1, f) != 1)
2165     fatal_error ("can't write PCH file: %m");
2166   free (d);
2167 }
2168
2169 /* Move the PCH PTE entries just added to the end of by_depth, to the
2170    front.  */
2171
2172 static void
2173 move_ptes_to_front (int count_old_page_tables, int count_new_page_tables)
2174 {
2175   unsigned i;
2176
2177   /* First, we swap the new entries to the front of the varrays.  */
2178   page_entry **new_by_depth;
2179   unsigned long **new_save_in_use;
2180
2181   new_by_depth = XNEWVEC (page_entry *, G.by_depth_max);
2182   new_save_in_use = XNEWVEC (unsigned long *, G.by_depth_max);
2183
2184   memcpy (&new_by_depth[0],
2185           &G.by_depth[count_old_page_tables],
2186           count_new_page_tables * sizeof (void *));
2187   memcpy (&new_by_depth[count_new_page_tables],
2188           &G.by_depth[0],
2189           count_old_page_tables * sizeof (void *));
2190   memcpy (&new_save_in_use[0],
2191           &G.save_in_use[count_old_page_tables],
2192           count_new_page_tables * sizeof (void *));
2193   memcpy (&new_save_in_use[count_new_page_tables],
2194           &G.save_in_use[0],
2195           count_old_page_tables * sizeof (void *));
2196
2197   free (G.by_depth);
2198   free (G.save_in_use);
2199
2200   G.by_depth = new_by_depth;
2201   G.save_in_use = new_save_in_use;
2202
2203   /* Now update all the index_by_depth fields.  */
2204   for (i = G.by_depth_in_use; i > 0; --i)
2205     {
2206       page_entry *p = G.by_depth[i-1];
2207       p->index_by_depth = i-1;
2208     }
2209
2210   /* And last, we update the depth pointers in G.depth.  The first
2211      entry is already 0, and context 0 entries always start at index
2212      0, so there is nothing to update in the first slot.  We need a
2213      second slot, only if we have old ptes, and if we do, they start
2214      at index count_new_page_tables.  */
2215   if (count_old_page_tables)
2216     push_depth (count_new_page_tables);
2217 }
2218
2219 void
2220 ggc_pch_read (FILE *f, void *addr)
2221 {
2222   struct ggc_pch_ondisk d;
2223   unsigned i;
2224   char *offs = addr;
2225   unsigned long count_old_page_tables;
2226   unsigned long count_new_page_tables;
2227
2228   count_old_page_tables = G.by_depth_in_use;
2229
2230   /* We've just read in a PCH file.  So, every object that used to be
2231      allocated is now free.  */
2232   clear_marks ();
2233 #ifdef ENABLE_GC_CHECKING
2234   poison_pages ();
2235 #endif
2236
2237   /* No object read from a PCH file should ever be freed.  So, set the
2238      context depth to 1, and set the depth of all the currently-allocated
2239      pages to be 1 too.  PCH pages will have depth 0.  */
2240   gcc_assert (!G.context_depth);
2241   G.context_depth = 1;
2242   for (i = 0; i < NUM_ORDERS; i++)
2243     {
2244       page_entry *p;
2245       for (p = G.pages[i]; p != NULL; p = p->next)
2246         p->context_depth = G.context_depth;
2247     }
2248
2249   /* Allocate the appropriate page-table entries for the pages read from
2250      the PCH file.  */
2251   if (fread (&d, sizeof (d), 1, f) != 1)
2252     fatal_error ("can't read PCH file: %m");
2253
2254   for (i = 0; i < NUM_ORDERS; i++)
2255     {
2256       struct page_entry *entry;
2257       char *pte;
2258       size_t bytes;
2259       size_t num_objs;
2260       size_t j;
2261
2262       if (d.totals[i] == 0)
2263         continue;
2264
2265       bytes = ROUND_UP (d.totals[i] * OBJECT_SIZE (i), G.pagesize);
2266       num_objs = bytes / OBJECT_SIZE (i);
2267       entry = xcalloc (1, (sizeof (struct page_entry)
2268                            - sizeof (long)
2269                            + BITMAP_SIZE (num_objs + 1)));
2270       entry->bytes = bytes;
2271       entry->page = offs;
2272       entry->context_depth = 0;
2273       offs += bytes;
2274       entry->num_free_objects = 0;
2275       entry->order = i;
2276
2277       for (j = 0;
2278            j + HOST_BITS_PER_LONG <= num_objs + 1;
2279            j += HOST_BITS_PER_LONG)
2280         entry->in_use_p[j / HOST_BITS_PER_LONG] = -1;
2281       for (; j < num_objs + 1; j++)
2282         entry->in_use_p[j / HOST_BITS_PER_LONG]
2283           |= 1L << (j % HOST_BITS_PER_LONG);
2284
2285       for (pte = entry->page;
2286            pte < entry->page + entry->bytes;
2287            pte += G.pagesize)
2288         set_page_table_entry (pte, entry);
2289
2290       if (G.page_tails[i] != NULL)
2291         G.page_tails[i]->next = entry;
2292       else
2293         G.pages[i] = entry;
2294       G.page_tails[i] = entry;
2295
2296       /* We start off by just adding all the new information to the
2297          end of the varrays, later, we will move the new information
2298          to the front of the varrays, as the PCH page tables are at
2299          context 0.  */
2300       push_by_depth (entry, 0);
2301     }
2302
2303   /* Now, we update the various data structures that speed page table
2304      handling.  */
2305   count_new_page_tables = G.by_depth_in_use - count_old_page_tables;
2306
2307   move_ptes_to_front (count_old_page_tables, count_new_page_tables);
2308
2309   /* Update the statistics.  */
2310   G.allocated = G.allocated_last_gc = offs - (char *)addr;
2311 }