aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog20
-rw-r--r--gcc/ggc-common.c41
-rw-r--r--gcc/ggc-simple.c13
-rw-r--r--gcc/ggc.h44
4 files changed, 73 insertions, 45 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 688024c..1e19202 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,19 @@
+Thu Sep 16 11:50:52 1999 Alex Samuel <samuel@codesourcery.com>
+
+ * ggc.h (ggc_root): Move to ggc-common.c.
+ (roots): Remove.
+ (ggc_mark_rtx, ggc_mark_tree): Change to macro.
+ (ggc_mark_rtvec, ggc_mark_tree_varray): Declare extern.
+ (ggc_mark_tree_hash_table, ggc_mark_string, ggc_mark): Likewise.
+ (ggc_mark_roots, ggc_mark_rtx_children, ggc_mark_tree_children): New.
+ * ggc-common.c (ggc_root): Move from ggc.h.
+ (roots): Declare, static.
+ (ggc_mark_rtx, ggc_mark_tree): Renamed to...
+ (ggc_mark_rtx_children, ggc_mark_tree_children): Don't check for
+ null or check/set mark bit.
+ (ggc_mark_roots): New.
+ * ggc-simple.c (ggc_collect): Call ggc_mark_roots.
+
Thu Sep 16 11:37:32 1999 Richard Henderson <rth@cygnus.com>
* m32r.c: Include toplev.h.
@@ -364,8 +380,8 @@ Tue Sep 14 04:01:46 1999 Loren Rittle <ljrittle@acm.org>
Tue Sep 14 03:58:44 1999 Andreas Jaeger <aj@arthur.rhein-neckar.de>
- * configure.in: Add crtbeginS.o, crtendS.o for mips-linux; add
- thread support.
+ * configure.in: Add crtbeginS.o, crtendS.o for mips-linux; add
+ thread support.
* configure: Rebuilt.
Tue Sep 14 03:47:23 1999 Joel Sherrill <joel@OARcorp.com>
diff --git a/gcc/ggc-common.c b/gcc/ggc-common.c
index 30725a2..319623b 100644
--- a/gcc/ggc-common.c
+++ b/gcc/ggc-common.c
@@ -32,7 +32,18 @@
/* Maintain global roots that are preserved during GC. */
-struct ggc_root *roots;
+/* Global roots that are preserved during calls to gc. */
+
+struct ggc_root
+{
+ struct ggc_root *next;
+ void *base;
+ int nelt;
+ int size;
+ void (*cb) PROTO ((void *));
+};
+
+static struct ggc_root *roots;
/* Type-correct function to pass to ggc_add_root. It just forwards
*ELT (which is an rtx) to ggc_mark_tree_varray. */
@@ -170,15 +181,29 @@ ggc_del_root (base)
}
void
-ggc_mark_rtx (r)
+ggc_mark_roots ()
+{
+ struct ggc_root* x;
+
+ for (x = roots; x != NULL; x = x->next)
+ {
+ char *elt = x->base;
+ int s = x->size, n = x->nelt;
+ void (*cb) PROTO ((void *)) = x->cb;
+ int i;
+
+ for (i = 0; i < n; ++i, elt += s)
+ (*cb)(elt);
+ }
+}
+
+void
+ggc_mark_rtx_children (r)
rtx r;
{
const char *fmt;
int i;
- if (r == NULL_RTX || ggc_set_mark_rtx (r))
- return;
-
/* ??? If (some of) these are really pass-dependant info, do we have
any right poking our noses in? */
switch (GET_CODE (r))
@@ -256,13 +281,9 @@ ggc_mark_rtvec (v)
}
void
-ggc_mark_tree (t)
+ggc_mark_tree_children (t)
tree t;
{
- /* FIXME what if t == NULL_TREE ? */
- if (t == NULL || ggc_set_mark_tree (t))
- return;
-
/* Bits from common. */
ggc_mark_tree (TREE_TYPE (t));
ggc_mark_tree (TREE_CHAIN (t));
diff --git a/gcc/ggc-simple.c b/gcc/ggc-simple.c
index 8f375d1..3eeb8c3 100644
--- a/gcc/ggc-simple.c
+++ b/gcc/ggc-simple.c
@@ -490,7 +490,6 @@ ggc_collect ()
struct ggc_rtvec *v, **vp;
struct ggc_tree *t, **tp;
struct ggc_string *s, **sp;
- struct ggc_root *x;
struct ggc_status *gs;
struct ggc_any *a, **ap;
int time, n_rtxs, n_trees, n_vecs, n_strings, n_anys;
@@ -521,17 +520,7 @@ ggc_collect ()
a->magic_mark = GGC_ANY_MAGIC;
}
- /* Mark through all the roots. */
- for (x = roots; x != NULL; x = x->next)
- {
- char *elt = x->base;
- int s = x->size, n = x->nelt;
- void (*cb) PROTO ((void *)) = x->cb;
- int i;
-
- for (i = 0; i < n; ++i, elt += s)
- (*cb)(elt);
- }
+ ggc_mark_roots ();
/* Sweep the resulting dead nodes. */
diff --git a/gcc/ggc.h b/gcc/ggc.h
index 20b3bb8..de43e9e 100644
--- a/gcc/ggc.h
+++ b/gcc/ggc.h
@@ -42,19 +42,6 @@ union tree_node;
struct varasm_status;
struct varray_head_tag;
-/* Global roots that are preserved during calls to gc. */
-
-struct ggc_root
-{
- struct ggc_root *next;
- void *base;
- int nelt;
- int size;
- void (*cb) PROTO ((void *));
-};
-
-extern struct ggc_root *roots;
-
/* 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));
@@ -66,14 +53,29 @@ void ggc_del_root PROTO ((void *base));
/* Mark nodes from the gc_add_root callback. These functions follow
pointers to mark other objects too. */
-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_tree_varray PROTO ((struct varray_head_tag *));
-void ggc_mark_tree_hash_table PROTO ((struct hash_table *));
-void ggc_mark_string PROTO ((char *));
-void ggc_mark PROTO ((void *));
-
+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. */