dwarf2out.c (gen_subprogram_die): Always re-use DIEs with an DW_AT_abstract_origin...
authorRichard Biener <rguenther@suse.de>
Thu, 28 Jun 2018 07:43:36 +0000 (07:43 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 28 Jun 2018 07:43:36 +0000 (07:43 +0000)
2018-06-28  Richard Biener  <rguenther@suse.de>

* dwarf2out.c (gen_subprogram_die): Always re-use DIEs with an
DW_AT_abstract_origin attribute.

From-SVN: r262213

gcc/ChangeLog
gcc/dwarf2out.c

index 8902e4ac366bce7eea0e9a0972a0a54836cbb851..e5567914e8f3ebab72899501997cc085e35932c3 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-28  Richard Biener  <rguenther@suse.de>
+
+       * dwarf2out.c (gen_subprogram_die): Always re-use DIEs with an
+       DW_AT_abstract_origin attribute.
+
 2018-06-28  Martin Liska  <mliska@suse.cz>
 
        * tree-switch-conversion.c (jump_table_cluster::can_be_handled):
index b5e3134930738f9f6bf168f1d8e5c41eb5a5c187..bcd47c8363bf0a278c9aff995b1f8b27faf774c5 100644 (file)
@@ -22780,26 +22780,25 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
         apply; we just use the old DIE.  */
       expanded_location s = expand_location (DECL_SOURCE_LOCATION (decl));
       struct dwarf_file_data * file_index = lookup_filename (s.file);
-      if ((is_cu_die (old_die->die_parent)
-          /* This condition fixes the inconsistency/ICE with the
-             following Fortran test (or some derivative thereof) while
-             building libgfortran:
-
-                module some_m
-                contains
-                   logical function funky (FLAG)
-                     funky = .true.
-                  end function
-                end module
-          */
-          || (old_die->die_parent
-              && old_die->die_parent->die_tag == DW_TAG_module)
-          || context_die == NULL)
+      if (((is_cu_die (old_die->die_parent)
+           /* This condition fixes the inconsistency/ICE with the
+              following Fortran test (or some derivative thereof) while
+              building libgfortran:
+
+                 module some_m
+                 contains
+                    logical function funky (FLAG)
+                      funky = .true.
+                   end function
+                 end module
+            */
+           || (old_die->die_parent
+               && old_die->die_parent->die_tag == DW_TAG_module)
+           || context_die == NULL)
           && (DECL_ARTIFICIAL (decl)
               /* The location attributes may be in the abstract origin
                  which in the case of LTO might be not available to
                  look at.  */
-              || get_AT (old_die, DW_AT_abstract_origin)
               || (get_AT_file (old_die, DW_AT_decl_file) == file_index
                   && (get_AT_unsigned (old_die, DW_AT_decl_line)
                       == (unsigned) s.line)
@@ -22807,6 +22806,10 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
                       || s.column == 0
                       || (get_AT_unsigned (old_die, DW_AT_decl_column)
                           == (unsigned) s.column)))))
+         /* With LTO if there's an abstract instance for
+            the old DIE, this is a concrete instance and
+            thus re-use the DIE.  */
+         || get_AT (old_die, DW_AT_abstract_origin))
        {
          subr_die = old_die;