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

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
This commit is contained in:
Richard Biener 2018-06-28 07:43:36 +00:00 committed by Richard Biener
parent 1aabb71d13
commit 8a731f44bf
2 changed files with 23 additions and 15 deletions

View 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):

View 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:
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)
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;