From d44f5f2552521a65d9b1c603f8eac836d4864c1d Mon Sep 17 00:00:00 2001 From: Sterling Augustine Date: Tue, 26 Jun 2012 17:54:02 +0000 Subject: [PATCH] dwarf2out.c (output_pubnames): Add check for DW_TAG_enumerator. 2012-06-26 Sterling Augustine * dwarf2out.c (output_pubnames): Add check for DW_TAG_enumerator. (prune_unused_types): Likewise. From-SVN: r188992 --- gcc/ChangeLog | 5 +++++ gcc/dwarf2out.c | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd78a2a8f15..3944f3c3eb5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-06-26 Sterling Augustine + + * dwarf2out.c (output_pubnames): Add check for DW_TAG_enumerator. + (prune_unused_types): Likewise. + 2012-06-26 Steven Bosscher * system.h (UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP, diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 015422e1994..fc0659b45e4 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -8284,6 +8284,12 @@ output_pubnames (VEC (pubname_entry, gc) * names) FOR_EACH_VEC_ELT (pubname_entry, names, i, pub) { + /* Enumerator names are part of the pubname table, but the parent + DW_TAG_enumeration_type die may have been pruned. Don't output + them if that is the case. */ + if (pub->die->die_tag == DW_TAG_enumerator && !pub->die->die_mark) + continue; + /* We shouldn't see pubnames for DIEs outside of the main CU. */ if (names == pubname_table) gcc_assert (pub->die->die_mark); @@ -21239,10 +21245,13 @@ prune_unused_types (void) prune_unused_types_mark (ctnode->type_die, 1); } - /* Also set the mark on nodes referenced from the - pubname_table. */ + /* Also set the mark on nodes referenced from the pubname_table. Enumerators + are unusual in that they are pubnames that are the children of pubtypes. + They should only be marked via their parent DW_TAG_enumeration_type die, + not as roots in themselves. */ FOR_EACH_VEC_ELT (pubname_entry, pubname_table, i, pub) - prune_unused_types_mark (pub->die, 1); + if (pub->die->die_tag != DW_TAG_enumerator) + prune_unused_types_mark (pub->die, 1); for (i = 0; VEC_iterate (dw_die_ref, base_types, i, base_type); i++) prune_unused_types_mark (base_type, 1);