dwarfout.c (add_incomplete_type): New fn.

* dwarfout.c (add_incomplete_type): New fn.
	(output_type): Call it.
	(retry_incomplete_types): New fn.
	(dwarfout_finish): Call it.
	From Eric Raskin <ehr@listworks.com>:
	(output_type): Output types for bases.

From-SVN: r27546
This commit is contained in:
Jason Merrill 1999-06-16 06:38:45 -04:00
parent f33e32a8cc
commit 75c613dbc5
2 changed files with 72 additions and 3 deletions

View File

@ -1,6 +1,16 @@
Wed Jun 16 10:33:02 1999 Jason Merrill <jason@yorick.cygnus.com>
* dwarfout.c (add_incomplete_type): New fn.
(output_type): Call it.
(retry_incomplete_types): New fn.
(dwarfout_finish): Call it.
From Eric Raskin <ehr@listworks.com>:
(output_type): Output types for bases.
Tue Jun 15 12:51:23 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
* config/mips/mips.c (mips_output_conditional_branch): Add `break'
* mips.c (mips_output_conditional_branch): Add `break'
between `default' label and `close braces'.
Tue Jun 15 01:55:20 1999 David O'Brien <obrien@FreeBSD.org>

View File

@ -270,6 +270,22 @@ static unsigned pending_types;
#define PENDING_TYPES_INCREMENT 64
/* A pointer to the base of a list of incomplete types which might be
completed at some later time. */
static tree *incomplete_types_list;
/* Number of elements currently allocated for the incomplete_types_list. */
static unsigned incomplete_types_allocated;
/* Number of elements of incomplete_types_list currently in use. */
static unsigned incomplete_types;
/* Size (in elements) of increments by which we may expand the incomplete
types list. Actually, a single hunk of space of this size should
be enough for most typical programs. */
#define INCOMPLETE_TYPES_INCREMENT 64
/* Pointer to an artificial RECORD_TYPE which we create in dwarfout_init.
This is used in a hack to help us get the DIEs describing types of
formal parameters to come *after* all of the DIEs describing the formal
@ -4216,6 +4232,40 @@ output_pending_types_for_scope (containing_scope)
}
}
/* Remember a type in the incomplete_types_list. */
static void
add_incomplete_type (type)
tree type;
{
if (incomplete_types == incomplete_types_allocated)
{
incomplete_types_allocated += INCOMPLETE_TYPES_INCREMENT;
incomplete_types_list
= (tree *) xrealloc (incomplete_types_list,
sizeof (tree) * incomplete_types_allocated);
}
incomplete_types_list[incomplete_types++] = type;
}
/* Walk through the list of incomplete types again, trying once more to
emit full debugging info for them. */
static void
retry_incomplete_types ()
{
register tree type;
finalizing = 1;
while (incomplete_types)
{
--incomplete_types;
type = incomplete_types_list[incomplete_types];
output_type (type, NULL_TREE);
}
}
static void
output_type (type, containing_scope)
register tree type;
@ -4380,7 +4430,10 @@ output_type (type, containing_scope)
&& TREE_CODE (TYPE_CONTEXT (type)) != FUNCTION_TYPE
&& TREE_CODE (TYPE_CONTEXT (type)) != METHOD_TYPE))
&& !finalizing)
return; /* EARLY EXIT! Avoid setting TREE_ASM_WRITTEN. */
{
add_incomplete_type (type);
return; /* EARLY EXIT! Avoid setting TREE_ASM_WRITTEN. */
}
/* Prevent infinite recursion in cases where the type of some
member of this type is expressed in terms of this type itself. */
@ -4435,7 +4488,11 @@ output_type (type, containing_scope)
register int i;
for (i = 0; i < n_bases; i++)
output_die (output_inheritance_die, TREE_VEC_ELT (bases, i));
{
tree binfo = TREE_VEC_ELT (bases, i);
output_type (BINFO_TYPE (binfo), containing_scope);
output_die (output_inheritance_die, binfo);
}
}
++in_class;
@ -5844,6 +5901,8 @@ dwarfout_finish ()
{
char label[MAX_ARTIFICIAL_LABEL_BYTES];
retry_incomplete_types ();
fputc ('\n', asm_out_file);
ASM_OUTPUT_PUSH_SECTION (asm_out_file, DEBUG_SECTION);