dwarf2out.c (contains_subprogram_definition): New function.
authorCary Coutant <ccoutant@google.com>
Fri, 6 May 2011 17:34:01 +0000 (17:34 +0000)
committerCary Coutant <ccoutant@gcc.gnu.org>
Fri, 6 May 2011 17:34:01 +0000 (10:34 -0700)
* dwarf2out.c (contains_subprogram_definition): New function.
(should_move_die_to_comdat): Call it.

From-SVN: r173497

gcc/ChangeLog
gcc/dwarf2out.c

index 22f103ed76dbbdfba7e9f0f4acb8a56460515a20..9d0294e369c935e1dda69c77ec55f91cf08b388c 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-06  Cary Coutant  <ccoutant@google.com>
+
+       * dwarf2out.c (contains_subprogram_definition): New function.
+       (should_move_die_to_comdat): Call it.
+
 2011-05-06  Jeff Law  <law@redhat.com>
 
        * tree-ssa-threadupdate.c (create_block_for_threading): Do not call
index e20b01b7479dc843ad489e0df04f7bcc134625fb..c08f5aac614e873e9bf92a3124925e3e8818c4dc 100644 (file)
@@ -10170,6 +10170,20 @@ is_nested_in_subprogram (dw_die_ref die)
   return local_scope_p (decl);
 }
 
+/* Return non-zero if this DIE contains a defining declaration of a
+   subprogram.  */
+
+static int
+contains_subprogram_definition (dw_die_ref die)
+{
+  dw_die_ref c;
+
+  if (die->die_tag == DW_TAG_subprogram && ! is_declaration_die (die))
+    return 1;
+  FOR_EACH_CHILD (die, c, if (contains_subprogram_definition(c)) return 1);
+  return 0;
+}
+
 /* Return non-zero if this is a type DIE that should be moved to a
    COMDAT .debug_types section.  */
 
@@ -10188,6 +10202,8 @@ should_move_die_to_comdat (dw_die_ref die)
           || get_AT (die, DW_AT_abstract_origin)
           || is_nested_in_subprogram (die))
         return 0;
+      /* A type definition should never contain a subprogram definition.  */
+      gcc_assert (!contains_subprogram_definition (die));
       return 1;
     case DW_TAG_array_type:
     case DW_TAG_interface_type: