OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / ggc.h
index 557ee06..49a8df0 100644 (file)
--- a/gcc/ggc.h
+++ b/gcc/ggc.h
@@ -1,5 +1,5 @@
 /* Garbage collection for the GNU compiler.
-   Copyright (C) 1998 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
 
    This file is part of GNU CC.
 
@@ -31,42 +31,88 @@ extern int ggc_p;
    compiler.  However, rather than force everyone who includes this
    header to include all the headers in which they are declared, we
    just forward-declare them here.  */
-struct label_node;
 struct eh_status;
 struct emit_status;
+struct expr_status;
+struct hash_table;
+struct label_node;
+struct rtvec_def;
 struct stmt_status;
+union  tree_node;
 struct varasm_status;
 struct varray_head_tag;
 
-/* Startup */
+/* Constants for general use.  */
+extern char *empty_string;
 
+/* Manipulate global roots that are needed between calls to gc.  */
+void ggc_add_root PROTO ((void *base, int nelt, int size, void (*)(void *)));
+void ggc_add_rtx_root PROTO ((struct rtx_def **, int nelt));
+void ggc_add_tree_root PROTO ((union tree_node **, int nelt));
+void ggc_add_string_root PROTO ((char **, int nelt));
+void ggc_add_tree_varray_root PROTO ((struct varray_head_tag **, int nelt));
+void ggc_add_tree_hash_table_root PROTO ((struct hash_table **, int nelt));
+void ggc_del_root PROTO ((void *base));
+
+/* Mark nodes from the gc_add_root callback.  These functions follow
+   pointers to mark other objects too.  */
+extern void ggc_mark_rtvec PROTO ((struct rtvec_def *));
+extern void ggc_mark_tree_varray PROTO ((struct varray_head_tag *));
+extern void ggc_mark_tree_hash_table PROTO ((struct hash_table *));
+extern void ggc_mark_string PROTO ((char *));
+extern void ggc_mark PROTO ((void *));
+extern void ggc_mark_roots PROTO((void));
+
+extern void ggc_mark_rtx_children PROTO ((struct rtx_def *));
+extern void ggc_mark_tree_children PROTO ((union tree_node *));
+
+#define ggc_mark_rtx(RTX_EXPR)                         \
+  do {                                                 \
+    rtx r__ = (RTX_EXPR);                              \
+    if (r__ != NULL && ! ggc_set_mark_rtx (r__))       \
+      ggc_mark_rtx_children (r__);                     \
+  } while (0)
+
+#define ggc_mark_tree(TREE_EXPR)                       \
+  do {                                                 \
+    tree t__ = (TREE_EXPR);                            \
+    if (t__ != NULL && ! ggc_set_mark_tree (t__))      \
+      ggc_mark_tree_children (t__);                    \
+  } while (0)
+
+/* A GC implementation must provide these functions.  */
+
+/* Initialize the garbage collector.   */
 extern void init_ggc PROTO ((void));
 
-/* Allocation.  */
+/* Start a new GGC context.  Memory allocated in previous contexts
+   will not be collected while the new context is active.  */
+extern void ggc_pop_context PROTO ((void));
 
+/* Finish a GC context.  Any uncollected memory in the new context
+   will be merged with the old context.  */
+extern void ggc_push_context PROTO ((void));
+
+/* Allocation.  */
 struct rtx_def *ggc_alloc_rtx PROTO ((int nslots));
 struct rtvec_def *ggc_alloc_rtvec PROTO ((int nelt));
 union tree_node *ggc_alloc_tree PROTO ((int length));
 char *ggc_alloc_string PROTO ((const char *contents, int length));
+void *ggc_alloc PROTO ((size_t));
 
 /* Invoke the collector.  This is really just a hint, but in the case of
    the simple collector, the only time it will happen.  */
-
 void ggc_collect PROTO ((void));
 
-/* Manipulate global roots that are needed between calls to gc.  */
-void ggc_add_root PROTO ((void *base, int nelt, int size,
-                          void (*)(void *)));
-void ggc_add_rtx_root PROTO ((struct rtx_def **, int nelt));
-void ggc_add_tree_root PROTO ((union tree_node **, int nelt));
-void ggc_add_tree_varray_root PROTO ((struct varray_head_tag **, int nelt));
-void ggc_del_root PROTO ((void *base));
+/* Actually set the mark on a particular region of memory, but don't
+   follow pointers.  These functions are called by ggc_mark_*.  They
+   return zero if the object was not previously marked; they return
+   non-zero if the object was already marked, or if, for any other
+   reason, pointers in this data structure should not be traversed.  */
+int ggc_set_mark_rtx PROTO ((struct rtx_def *));
+int ggc_set_mark_rtvec PROTO ((struct rtvec_def *));
+int ggc_set_mark_tree PROTO ((union tree_node *));
 
-/* Mark nodes from the gc_add_root callback.  */
-void ggc_mark_rtx PROTO ((struct rtx_def *));
-void ggc_mark_rtvec PROTO ((struct rtvec_def *));
-void ggc_mark_tree PROTO ((union tree_node *));
-void ggc_mark_string PROTO ((char *));
 
 /* Callbacks to the languages.  */
 
@@ -74,9 +120,6 @@ void ggc_mark_string PROTO ((char *));
    the lang_specific hooks in the tree.  */
 void lang_mark_tree PROTO ((union tree_node *));
 
-/* And similarly to free that data when the tree node is released.  */
-void lang_cleanup_tree PROTO ((union tree_node *));
-
 /* The FALSE_LABEL_STACK, declared in except.h, has
    language-dependent semantics.  Each front-end should define this
    function appropriately.  */
@@ -84,8 +127,9 @@ void lang_mark_false_label_stack PROTO ((struct label_node *));
 
 /* Mark functions for various structs scattered about.  */
 
-void mark_eh_state PROTO ((struct eh_status *));
-void mark_stmt_state PROTO ((struct stmt_status *));
-void mark_emit_state PROTO ((struct emit_status *));
-void mark_varasm_state PROTO ((struct varasm_status *));
+void mark_eh_status PROTO ((struct eh_status *));
+void mark_emit_status PROTO ((struct emit_status *));
+void mark_expr_status PROTO ((struct expr_status *));
+void mark_stmt_status PROTO ((struct stmt_status *));
+void mark_varasm_status PROTO ((struct varasm_status *));
 void mark_optab PROTO ((void *));