cp-tree.h (lang_decl_flags): Remove permanent_attr.

* cp-tree.h (lang_decl_flags): Remove permanent_attr.
	Remove next.
	(LANG_DECL_PERMANENT): Remove.
	* decl.c (duplicate_decls): Don't mess about with obstacks trying
	to free memory.
	(lang_mark_tree): Mark DECL_LANG_SPECIFIC.
	* lex.c (free_lang_decl_chain): Remove.
	(build_lang_decl): Don't use obstacks.
	(retrofit_lang_decl): Likewise.
	(copy_lang_decl): Likewise.

From-SVN: r29223
This commit is contained in:
Mark Mitchell 1999-09-09 03:31:23 +00:00 committed by Mark Mitchell
parent 37b31aefeb
commit d60f72aec5
4 changed files with 20 additions and 84 deletions

View File

@ -1,5 +1,16 @@
1999-09-08 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (lang_decl_flags): Remove permanent_attr.
Remove next.
(LANG_DECL_PERMANENT): Remove.
* decl.c (duplicate_decls): Don't mess about with obstacks trying
to free memory.
(lang_mark_tree): Mark DECL_LANG_SPECIFIC.
* lex.c (free_lang_decl_chain): Remove.
(build_lang_decl): Don't use obstacks.
(retrofit_lang_decl): Likewise.
(copy_lang_decl): Likewise.
* cp-tree.h (saved_scope): Remove old_binding_level and
function_decl. Tidy up.
* decl.c (mark_saved_scope): Don't set them.

View File

@ -1474,20 +1474,19 @@ struct lang_decl_flags
unsigned const_memfunc : 1;
unsigned volatile_memfunc : 1;
unsigned abstract_virtual : 1;
unsigned permanent_attr : 1 ;
unsigned constructor_for_vbase_attr : 1;
unsigned mutable_flag : 1;
unsigned saved_inline : 1;
unsigned use_template : 2;
unsigned nonconverting : 1;
unsigned declared_inline : 1;
unsigned not_really_extern : 1;
unsigned needs_final_overrider : 1;
unsigned bitfield : 1;
unsigned defined_in_class : 1;
unsigned dummy : 5;
unsigned dummy : 6;
tree access;
tree context;
@ -1515,9 +1514,6 @@ struct lang_decl
{
tree sorted_fields;
struct pending_inline *pending_inline_info;
/* The lang_decls on the free_lang_decl_chain are chained together
through this pointer. */
struct lang_decl *next;
} u;
};
@ -1639,9 +1635,6 @@ struct lang_decl
must be overridden by derived classes. */
#define DECL_NEEDS_FINAL_OVERRIDER_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.needs_final_overrider)
/* Nonzero if allocated on permanent_obstack. */
#define LANG_DECL_PERMANENT(LANGDECL) ((LANGDECL)->decl_flags.permanent_attr)
/* The _TYPE context in which this _DECL appears. This field holds the
class where a virtual function instance is actually defined, and the
lexical scope of a friend function defined in a class body. */

View File

@ -3037,7 +3037,6 @@ int
duplicate_decls (newdecl, olddecl)
tree newdecl, olddecl;
{
extern struct obstack permanent_obstack;
unsigned olddecl_uid = DECL_UID (olddecl);
int olddecl_friend = 0, types_match = 0;
int new_defines_function = 0;
@ -3625,8 +3624,6 @@ duplicate_decls (newdecl, olddecl)
if (TREE_CODE (newdecl) == FUNCTION_DECL)
{
int function_size;
struct lang_decl *ol = DECL_LANG_SPECIFIC (olddecl);
struct lang_decl *nl = DECL_LANG_SPECIFIC (newdecl);
function_size = sizeof (struct tree_decl);
@ -3634,11 +3631,6 @@ duplicate_decls (newdecl, olddecl)
(char *) olddecl + sizeof (struct tree_common),
function_size - sizeof (struct tree_common));
/* Can we safely free the storage used by newdecl? */
#define ROUND(x) ((x + obstack_alignment_mask (&permanent_obstack)) \
& ~ obstack_alignment_mask (&permanent_obstack))
if (DECL_TEMPLATE_INSTANTIATION (newdecl))
{
/* If newdecl is a template instantiation, it is possible that
@ -3670,38 +3662,6 @@ duplicate_decls (newdecl, olddecl)
if (TREE_VALUE (decls) == newdecl)
TREE_VALUE (decls) = olddecl;
}
if (((char *)newdecl + ROUND (function_size) == (char *)nl
&& ((char *)newdecl + ROUND (function_size)
+ ROUND (sizeof (struct lang_decl))
== obstack_next_free (&permanent_obstack)))
|| ((char *)newdecl + ROUND (function_size)
== obstack_next_free (&permanent_obstack)))
{
DECL_MAIN_VARIANT (newdecl) = olddecl;
DECL_LANG_SPECIFIC (olddecl) = ol;
bcopy ((char *)nl, (char *)ol, sizeof (struct lang_decl));
obstack_free (&permanent_obstack, newdecl);
}
else if (LANG_DECL_PERMANENT (ol) && ol != nl)
{
if (DECL_MAIN_VARIANT (olddecl) == olddecl)
{
struct lang_decl *free_lang_decl = ol;
/* Save these lang_decls that would otherwise be lost. */
if (DECL_LANG_SPECIFIC (olddecl) == ol)
abort ();
free_lang_decl->u.next = free_lang_decl_chain;
free_lang_decl_chain = free_lang_decl;
}
else
{
/* Storage leak. */;
}
}
}
else
{
@ -14580,6 +14540,7 @@ lang_mark_tree (t)
if (ld)
{
ggc_mark (ld);
ggc_mark_tree (ld->decl_flags.access);
ggc_mark_tree (ld->decl_flags.context);
if (TREE_CODE (t) != NAMESPACE_DECL)

View File

@ -4748,10 +4748,6 @@ extern int tree_node_counts[];
extern int tree_node_sizes[];
#endif
/* Place to save freed lang_decls which were allocated on the
permanent_obstack. */
struct lang_decl *free_lang_decl_chain;
tree
build_lang_decl (code, name, type)
enum tree_code code;
@ -4760,17 +4756,9 @@ build_lang_decl (code, name, type)
{
tree t;
/* When we're building statement trees, declarations need to live
forever. */
if (building_stmt_tree ())
push_permanent_obstack ();
t = build_decl (code, name, type);
retrofit_lang_decl (t);
if (building_stmt_tree ())
pop_obstacks ();
return t;
}
@ -4781,7 +4769,6 @@ void
retrofit_lang_decl (t)
tree t;
{
struct obstack *obstack = current_obstack;
struct lang_decl *ld;
size_t size;
@ -4790,26 +4777,10 @@ retrofit_lang_decl (t)
else
size = sizeof (struct lang_decl_flags);
if (! TREE_PERMANENT (t))
obstack = saveable_obstack;
else
/* Could be that saveable is permanent and current is not. */
obstack = &permanent_obstack;
if (CAN_HAVE_FULL_LANG_DECL_P (t) && free_lang_decl_chain
&& obstack == &permanent_obstack)
{
ld = free_lang_decl_chain;
free_lang_decl_chain = free_lang_decl_chain->u.next;
}
else
ld = (struct lang_decl *) obstack_alloc (obstack, size);
ld = (struct lang_decl *) ggc_alloc (size);
memset (ld, 0, size);
DECL_LANG_SPECIFIC (t) = ld;
LANG_DECL_PERMANENT (ld) = obstack == &permanent_obstack;
my_friendly_assert (LANG_DECL_PERMANENT (ld) == TREE_PERMANENT (t), 234);
if (current_lang_name == lang_name_cplusplus)
DECL_LANGUAGE (t) = lang_cplusplus;
else if (current_lang_name == lang_name_c)
@ -4832,7 +4803,7 @@ copy_lang_decl (node)
tree node;
{
int size;
int *pi;
struct lang_decl *ld;
if (! DECL_LANG_SPECIFIC (node))
return;
@ -4841,9 +4812,9 @@ copy_lang_decl (node)
size = sizeof (struct lang_decl_flags);
else
size = sizeof (struct lang_decl);
pi = (int *)obstack_alloc (&permanent_obstack, size);
bcopy ((char *)DECL_LANG_SPECIFIC (node), (char *)pi, size);
DECL_LANG_SPECIFIC (node) = (struct lang_decl *)pi;
ld = (struct lang_decl *) ggc_alloc (size);
bcopy ((char *)DECL_LANG_SPECIFIC (node), (char *)ld, size);
DECL_LANG_SPECIFIC (node) = ld;
}
tree