decl2.c (setup_initp): Give statics with no priority the default priority here.

* decl2.c (setup_initp): Give statics with no priority the default
	priority here.
	(do_dtors, do_ctors, finish_file): Remove special handling of
	non-prioritized statics.

From-SVN: r25613
This commit is contained in:
Jason Merrill 1999-03-06 03:54:30 +00:00 committed by Jason Merrill
parent 15d1c8cfe6
commit 3c2a009706
2 changed files with 45 additions and 37 deletions

View File

@ -1,3 +1,10 @@
1999-03-06 Jason Merrill <jason@yorick.cygnus.com>
* decl2.c (setup_initp): Give statics with no priority the default
priority here.
(do_dtors, do_ctors, finish_file): Remove special handling of
non-prioritized statics.
1999-03-05 Mark Mitchell <mark@markmitchell.com>
* cp-tree.h (ANON_UNION_TYPE_P): Robustify.

View File

@ -2859,10 +2859,13 @@ static void
setup_initp ()
{
tree t, *p, next_t;
tree default_pri = build_int_2 (DEFAULT_INIT_PRIORITY, 0);
int saw_default;
/* First, remove any entries from static_aggregates that are also in
static_aggregates_initp, and update the entries in _initp to
include the initializer. */
static_aggregates_initp, and update the entries in _initp to include
the initializer. For entries not in static_aggregates_initp, update
them in place to look the same way. */
p = &static_aggregates;
for (; *p; )
{
@ -2870,22 +2873,40 @@ setup_initp ()
if (t)
{
/* We found an entry in s_a_initp; replace that entry with the
format we want and remove the entry in s_a. */
TREE_VALUE (t) = *p;
*p = TREE_CHAIN (*p);
TREE_CHAIN (TREE_VALUE (t)) = NULL_TREE;
}
else
p = &TREE_CHAIN (*p);
{
/* We didn't find an entry in s_a_i; replace the entry in s_a
with the format we want. */
*p = perm_tree_cons (default_pri, *p, TREE_CHAIN (*p));
TREE_CHAIN (TREE_VALUE (*p)) = NULL_TREE;
p = &TREE_CHAIN (*p);
}
}
/* And then attach the two lists. By doing it this way, ctors with an
explicit priority equal to the default are run before ctors with no
explicit priority (i.e. the ones in s_a). */
static_aggregates_initp = chainon (static_aggregates,
static_aggregates_initp);
static_aggregates = NULL_TREE;
/* Then, group static_aggregates_initp. After this step, there will only
be one entry for each priority, with a chain coming off it. */
t = static_aggregates_initp;
static_aggregates_initp = NULL_TREE;
saw_default = 0;
for (; t; t = next_t)
{
next_t = TREE_CHAIN (t);
if (TREE_INT_CST_LOW (TREE_PURPOSE (t)) == DEFAULT_INIT_PRIORITY)
saw_default = 1;
for (p = &static_aggregates_initp; ; p = &TREE_CHAIN (*p))
{
@ -2905,6 +2926,10 @@ setup_initp ()
}
}
if (! saw_default)
static_aggregates_initp = perm_tree_cons (default_pri, error_mark_node,
static_aggregates_initp);
/* Reverse each list to preserve the order (currently reverse declaration
order, for destructors). */
for (t = static_aggregates_initp; t; t = TREE_CHAIN (t))
@ -3027,18 +3052,10 @@ do_dtors (start)
tree vars;
int initp;
if (start)
{
initp = TREE_INT_CST_LOW (TREE_PURPOSE (start));
vars = TREE_VALUE (start);
}
else
{
initp = DEFAULT_INIT_PRIORITY;
vars = static_aggregates;
}
initp = TREE_INT_CST_LOW (TREE_PURPOSE (start));
vars = TREE_VALUE (start);
for (; vars; vars = TREE_CHAIN (vars))
for (; vars && vars != error_mark_node; vars = TREE_CHAIN (vars))
{
tree decl = TREE_VALUE (vars);
tree type = TREE_TYPE (decl);
@ -3115,21 +3132,13 @@ do_ctors (start)
tree vars;
int initp;
if (start)
{
initp = TREE_INT_CST_LOW (TREE_PURPOSE (start));
vars = TREE_VALUE (start);
}
else
{
initp = DEFAULT_INIT_PRIORITY;
vars = static_aggregates;
}
initp = TREE_INT_CST_LOW (TREE_PURPOSE (start));
vars = TREE_VALUE (start);
/* Reverse the list so it's in the right order for ctors. */
vars = nreverse (vars);
for (; vars; vars = TREE_CHAIN (vars))
for (; vars && vars != error_mark_node; vars = TREE_CHAIN (vars))
{
tree decl = TREE_VALUE (vars);
tree init = TREE_PURPOSE (vars);
@ -3322,21 +3331,13 @@ finish_file ()
/* After setup_initp, the aggregates are listed in reverse declaration
order, for cleaning. */
if (needs_cleaning)
{
do_dtors (NULL_TREE);
for (vars = static_aggregates_initp; vars; vars = TREE_CHAIN (vars))
do_dtors (vars);
}
for (vars = static_aggregates_initp; vars; vars = TREE_CHAIN (vars))
do_dtors (vars);
/* do_ctors will reverse the lists for messing up. */
if (needs_messing_up)
{
do_ctors (NULL_TREE);
for (vars = static_aggregates_initp; vars; vars = TREE_CHAIN (vars))
do_ctors (vars);
}
for (vars = static_aggregates_initp; vars; vars = TREE_CHAIN (vars))
do_ctors (vars);
permanent_allocation (1);