ggc.h (ggc_root): Move to ggc-common.c.
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. From-SVN: r29461
This commit is contained in:
parent
2a6ec461e1
commit
96df4529dc
@ -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>
|
||||
|
@ -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));
|
||||
|
@ -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. */
|
||||
|
||||
|
42
gcc/ggc.h
42
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. */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user