aboutsummaryrefslogtreecommitdiff
path: root/gcc/ggc.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ggc.h')
-rw-r--r--gcc/ggc.h184
1 files changed, 135 insertions, 49 deletions
diff --git a/gcc/ggc.h b/gcc/ggc.h
index 4cd6242..86ae60a 100644
--- a/gcc/ggc.h
+++ b/gcc/ggc.h
@@ -18,9 +18,6 @@ along with GCC; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
-#include "varray.h"
-#include "gtype-desc.h"
-
/* Symbols are marked with `ggc' for `gcc gc' so as not to interfere with
an external gc library that might be linked in. */
@@ -29,10 +26,39 @@ extern const char empty_string[]; /* empty string */
extern const char digit_vector[]; /* "0" .. "9" */
#define digit_string(d) (digit_vector + ((d) * 2))
-/* Manipulate global roots that are needed between calls to gc.
- THIS ROUTINE IS OBSOLETE, do not use it for new code. */
-extern void ggc_add_root PARAMS ((void *base, int nelt,
- int size, void (*)(void *)));
+/* Internal functions and data structures used by the GTY
+ machinery. */
+
+/* The first parameter is a pointer to a pointer, the second a cookie. */
+typedef void (*gt_pointer_operator) PARAMS ((void *, void *));
+
+#include "gtype-desc.h"
+
+/* One of these applies its third parameter (with cookie in the fourth
+ parameter) to each pointer in the object pointed to by the first
+ parameter, using the second parameter. */
+typedef void (*gt_note_pointers)
+ PARAMS ((void *, void *, gt_pointer_operator, void *));
+
+/* One of these is called before objects are re-ordered in memory.
+ The first parameter is the original object, the second is the
+ subobject that has had its pointers reordered, the third parameter
+ can compute the new values of a pointer when given the cookie in
+ the fourth parameter. */
+typedef void (*gt_handle_reorder)
+ PARAMS ((void *, void *, gt_pointer_operator, void *));
+
+/* Used by the gt_pch_n_* routines. Register an object in the hash table. */
+extern int gt_pch_note_object
+ PARAMS ((void *, void *, gt_note_pointers));
+
+/* Used by the gt_pch_n_* routines. Register that an object has a reorder
+ function. */
+extern void gt_pch_note_reorder
+ PARAMS ((void *, void *, gt_handle_reorder));
+
+/* Mark the object in the first parameter and anything it points to. */
+typedef void (*gt_pointer_walker) PARAMS ((void *));
/* Structures for the easy way to mark roots.
In an array, terminated by having base == NULL.*/
@@ -40,12 +66,15 @@ struct ggc_root_tab {
void *base;
size_t nelt;
size_t stride;
- void (*cb) PARAMS ((void *));
+ gt_pointer_walker cb;
+ gt_pointer_walker pchw;
};
-#define LAST_GGC_ROOT_TAB { NULL, 0, 0, NULL }
+#define LAST_GGC_ROOT_TAB { NULL, 0, 0, NULL, NULL }
/* Pointers to arrays of ggc_root_tab, terminated by NULL. */
extern const struct ggc_root_tab * const gt_ggc_rtab[];
extern const struct ggc_root_tab * const gt_ggc_deletable_rtab[];
+extern const struct ggc_root_tab * const gt_pch_cache_rtab[];
+extern const struct ggc_root_tab * const gt_pch_scalar_rtab[];
/* Structure for hash table cache marking. */
struct htab;
@@ -53,23 +82,19 @@ struct ggc_cache_tab {
struct htab * *base;
size_t nelt;
size_t stride;
- void (*cb) PARAMS ((void *));
+ gt_pointer_walker cb;
+ gt_pointer_walker pchw;
int (*marked_p) PARAMS ((const void *));
};
-#define LAST_GGC_CACHE_TAB { NULL, 0, 0, NULL, NULL }
+#define LAST_GGC_CACHE_TAB { NULL, 0, 0, NULL, NULL, NULL }
/* Pointers to arrays of ggc_cache_tab, terminated by NULL. */
extern const struct ggc_cache_tab * const gt_ggc_cache_rtab[];
-extern void ggc_mark_roots PARAMS ((void));
-
/* If EXPR is not NULL and previously unmarked, mark it and evaluate
to true. Otherwise evaluate to false. */
#define ggc_test_and_set_mark(EXPR) \
((EXPR) != NULL && ((void *) (EXPR)) != (void *) 1 && ! ggc_set_mark (EXPR))
-#define ggc_mark_rtx gt_ggc_m_7rtx_def
-#define ggc_mark_tree gt_ggc_m_9tree_node
-
#define ggc_mark(EXPR) \
do { \
const void *const a__ = (EXPR); \
@@ -77,11 +102,45 @@ extern void ggc_mark_roots PARAMS ((void));
ggc_set_mark (a__); \
} while (0)
-/* A GC implementation must provide these functions. */
+/* Actually set the mark on a particular region of memory, but don't
+ follow pointers. This function is called by ggc_mark_*. It
+ returns zero if the object was not previously marked; non-zero if
+ the object was already marked, or if, for any other reason,
+ pointers in this data structure should not be traversed. */
+extern int ggc_set_mark PARAMS ((const void *));
+
+/* Return 1 if P has been marked, zero otherwise.
+ P must have been allocated by the GC allocator; it mustn't point to
+ static objects, stack variables, or memory allocated with malloc. */
+extern int ggc_marked_p PARAMS ((const void *));
+
+/* Mark the entries in the string pool. */
+extern void ggc_mark_stringpool PARAMS ((void));
+
+/* Call ggc_set_mark on all the roots. */
+
+extern void ggc_mark_roots PARAMS ((void));
+
+/* Save and restore the string pool entries for PCH. */
+
+extern void gt_pch_save_stringpool PARAMS ((void));
+extern void gt_pch_restore_stringpool PARAMS ((void));
+
+/* PCH and GGC handling for strings, mostly trivial. */
+
+extern void gt_pch_p_S PARAMS ((void *, void *,
+ gt_pointer_operator, void *));
+extern void gt_pch_n_S PARAMS ((const void *));
+extern void gt_ggc_m_S PARAMS ((void *));
+
+/* Initialise the string pool. */
+extern void init_stringpool PARAMS ((void));
+
+/* A GC implementation must provide these functions. They are internal
+ to the GC system. */
/* Initialize the garbage collector. */
extern void init_ggc PARAMS ((void));
-extern void init_stringpool PARAMS ((void));
/* Start a new GGC context. Memory allocated in previous contexts
will not be collected while the new context is active. */
@@ -91,6 +150,48 @@ extern void ggc_push_context PARAMS ((void));
will be merged with the old context. */
extern void ggc_pop_context PARAMS ((void));
+struct ggc_pch_data;
+
+/* Return a new ggc_pch_data structure. */
+extern struct ggc_pch_data *init_ggc_pch PARAMS ((void));
+
+/* The second parameter and third parameters give the address and size
+ of an object. Update the ggc_pch_data structure with as much of
+ that information as is necessary. */
+extern void ggc_pch_count_object PARAMS ((struct ggc_pch_data *,
+ void *, size_t));
+
+/* Return the total size of the data to be written to hold all
+ the objects previously passed to ggc_pch_count_object. */
+extern size_t ggc_pch_total_size PARAMS ((struct ggc_pch_data *));
+
+/* The objects, when read, will most likely be at the address
+ in the second parameter. */
+extern void ggc_pch_this_base PARAMS ((struct ggc_pch_data *,
+ void *));
+
+/* Assuming that the objects really do end up at the address
+ passed to ggc_pch_this_base, return the address of this object. */
+extern char *ggc_pch_alloc_object PARAMS ((struct ggc_pch_data *,
+ void *, size_t));
+
+/* Write out any initial information required. */
+extern void ggc_pch_prepare_write PARAMS ((struct ggc_pch_data *,
+ FILE *));
+/* Write out this object, including any padding. */
+extern void ggc_pch_write_object PARAMS ((struct ggc_pch_data *,
+ FILE *, void *, void *,
+ size_t));
+/* All objects have been written, write out any final information
+ required. */
+extern void ggc_pch_finish PARAMS ((struct ggc_pch_data *,
+ FILE *));
+
+/* A PCH file has just been read in at the address specified second
+ parameter. Set up the GC implementation for the new objects. */
+extern void ggc_pch_read PARAMS ((FILE *, void *));
+
+
/* Allocation. */
/* The internal primitive. */
@@ -115,6 +216,13 @@ extern void *ggc_calloc PARAMS ((size_t, size_t));
#define htab_create_ggc(SIZE, HASH, EQ, DEL) \
htab_create_alloc (SIZE, HASH, EQ, DEL, ggc_calloc, NULL)
+#define splay_tree_new_ggc(COMPARE) \
+ splay_tree_new_with_allocator (COMPARE, NULL, NULL, \
+ &ggc_splay_alloc, &ggc_splay_dont_free, \
+ NULL)
+extern PTR ggc_splay_alloc PARAMS ((int, void *));
+extern void ggc_splay_dont_free PARAMS ((void *, void *));
+
/* Allocate a gc-able string, and fill it with LENGTH bytes from CONTENTS.
If LENGTH is -1, then CONTENTS is assumed to be a
null-terminated string and the memory sized accordingly. */
@@ -128,47 +236,25 @@ extern const char *ggc_alloc_string PARAMS ((const char *contents,
function is called, not during allocations. */
extern void ggc_collect PARAMS ((void));
-/* Actually set the mark on a particular region of memory, but don't
- follow pointers. This function is called by ggc_mark_*. It
- returns zero if the object was not previously marked; nonzero if
- the object was already marked, or if, for any other reason,
- pointers in this data structure should not be traversed. */
-extern int ggc_set_mark PARAMS ((const void *));
+/* Return the number of bytes allocated at the indicated address. */
+extern size_t ggc_get_size PARAMS ((const void *));
-/* Return 1 if P has been marked, zero otherwise.
- P must have been allocated by the GC allocator; it mustn't point to
- static objects, stack variables, or memory allocated with malloc. */
-extern int ggc_marked_p PARAMS ((const void *));
+/* Write out all GCed objects to F. */
+extern void gt_pch_save PARAMS ((FILE *f));
+/* Read objects previously saved with gt_pch_save from F. */
+extern void gt_pch_restore PARAMS ((FILE *f));
+
/* Statistics. */
/* This structure contains the statistics common to all collectors.
Particular collectors can extend this structure. */
typedef struct ggc_statistics
{
- /* The Ith element is the number of nodes allocated with code I. */
- unsigned num_trees[256];
- /* The Ith element is the number of bytes allocated by nodes with
- code I. */
- size_t size_trees[256];
- /* The Ith element is the number of nodes allocated with code I. */
- unsigned num_rtxs[256];
- /* The Ith element is the number of bytes allocated by nodes with
- code I. */
- size_t size_rtxs[256];
- /* The total size of the tree nodes allocated. */
- size_t total_size_trees;
- /* The total size of the RTL nodes allocated. */
- size_t total_size_rtxs;
- /* The total number of tree nodes allocated. */
- unsigned total_num_trees;
- /* The total number of RTL nodes allocated. */
- unsigned total_num_rtxs;
+ /* At present, we don't really gather any interesting statistics. */
+ int unused;
} ggc_statistics;
-/* Return the number of bytes allocated at the indicated address. */
-extern size_t ggc_get_size PARAMS ((const void *));
-
/* Used by the various collectors to gather and print statistics that
do not depend on the collector in use. */
extern void ggc_print_common_statistics PARAMS ((FILE *, ggc_statistics *));