dwarf2out.c (size_of_pubnames): Move code to...
authorSterling Augustine <saugustine@google.com>
Thu, 25 Jul 2013 22:18:21 +0000 (22:18 +0000)
committerSterling Augustine <sterling@gcc.gnu.org>
Thu, 25 Jul 2013 22:18:21 +0000 (22:18 +0000)
2013-07-25  Sterling Augustine  <saugustine@google.com>

* dwarf2out.c (size_of_pubnames): Move code to...
(include_pubname_in_output): ...here.  New.
(want_pubnames): Rearrange.
(output_pubnames): Call include_pubname_in_output.  Move assertion.

From-SVN: r201255

gcc/ChangeLog
gcc/dwarf2out.c

index a47ad4d..7bcc02d 100644 (file)
@@ -1,3 +1,10 @@
+2013-07-25  Sterling Augustine  <saugustine@google.com>
+
+       * dwarf2out.c (size_of_pubnames): Move code to...
+       (include_pubname_in_output): ...here.  New.
+       (want_pubnames): Rearrange.
+       (output_pubnames): Call include_pubname_in_output.  Move assertion.
+
 2013-07-25  Cameron McInally  <cameron.mcinally@nyu.edu>
 
        * doc/extend.texi: Fix return types for __builtin_ia32_cmp*s builtins.
index 87f9644..24022aa 100644 (file)
@@ -7887,6 +7887,32 @@ unmark_all_dies (dw_die_ref die)
       unmark_all_dies (AT_ref (a));
 }
 
+/* Calculate if the entry should appear in the final output file.  It may be
+   from a pruned a type.  */
+
+static bool
+include_pubname_in_output (vec<pubname_entry, va_gc> *table, pubname_entry *p)
+{
+  if (table == pubname_table)
+    {
+      /* 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 (p->die->die_tag == DW_TAG_enumerator &&
+          (p->die->die_parent == NULL
+           || !p->die->die_parent->die_perennial_p))
+        return false;
+
+      /* Everything else in the pubname table is included.  */
+      return true;
+    }
+
+  /* The pubtypes table shouldn't include types that have been
+     pruned.  */
+  return (p->die->die_offset != 0
+          || !flag_eliminate_unused_debug_types);
+}
+
 /* Return the size of the .debug_pubnames or .debug_pubtypes table
    generated for the compilation unit.  */
 
@@ -7899,9 +7925,7 @@ size_of_pubnames (vec<pubname_entry, va_gc> *names)
 
   size = DWARF_PUBNAMES_HEADER_SIZE;
   FOR_EACH_VEC_ELT (*names, i, p)
-    if (names != pubtype_table
-       || p->die->die_offset != 0
-       || !flag_eliminate_unused_debug_types)
+    if (include_pubname_in_output (names, p))
       size += strlen (p->name) + DWARF_OFFSET_SIZE + 1;
 
   size += DWARF_OFFSET_SIZE;
@@ -8731,9 +8755,9 @@ output_comp_unit (dw_die_ref die, int output_if_empty)
 static inline bool
 want_pubnames (void)
 {
-  return (debug_generate_pub_sections != -1
-         ? debug_generate_pub_sections
-         : targetm.want_debug_pub_sections);
+  if (debug_generate_pub_sections != -1)
+    return debug_generate_pub_sections;
+  return targetm.want_debug_pub_sections;
 }
 
 /* Add the DW_AT_GNU_pubnames and DW_AT_GNU_pubtypes attributes.  */
@@ -9095,24 +9119,14 @@ output_pubnames (vec<pubname_entry, va_gc> *names)
 
   FOR_EACH_VEC_ELT (*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_parent == NULL
-          || !pub->die->die_parent->die_perennial_p))
-        continue;
-
-      /* We shouldn't see pubnames for DIEs outside of the main CU.  */
-      if (names == pubname_table && pub->die->die_tag != DW_TAG_enumerator)
-       gcc_assert (pub->die->die_mark);
-
-      if (names != pubtype_table
-         || pub->die->die_offset != 0
-         || !flag_eliminate_unused_debug_types)
+      if (include_pubname_in_output (names, pub))
        {
          dw_offset die_offset = pub->die->die_offset;
 
+          /* We shouldn't see pubnames for DIEs outside of the main CU.  */
+          if (names == pubname_table && pub->die->die_tag != DW_TAG_enumerator)
+            gcc_assert (pub->die->die_mark);
+
          /* If we're putting types in their own .debug_types sections,
             the .debug_pubtypes table will still point to the compile
             unit (not the type unit), so we want to use the offset of