aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>1999-06-16 06:38:45 -0400
committerJason Merrill <jason@gcc.gnu.org>1999-06-16 06:38:45 -0400
commit75c613dbc5bfb736400045edde2af639cb266e26 (patch)
treefdf7690b35163a1cfcd0c37ab2b00464398a5052
parentf33e32a8ccd4963e4f5b0616f6f08502c2a7df72 (diff)
downloadgcc-75c613dbc5bfb736400045edde2af639cb266e26.zip
gcc-75c613dbc5bfb736400045edde2af639cb266e26.tar.gz
gcc-75c613dbc5bfb736400045edde2af639cb266e26.tar.bz2
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
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/dwarfout.c63
2 files changed, 72 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 267ec44..56ff7e7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/dwarfout.c b/gcc/dwarfout.c
index ac17f7f..2a1b482 100644
--- a/gcc/dwarfout.c
+++ b/gcc/dwarfout.c
@@ -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);