lto.c (compare_tree_sccs_1): Compare DECL_ABSTRACT_ORIGIN.
2015-08-31 Richard Biener <rguenther@suse.de> lto/ * lto.c (compare_tree_sccs_1): Compare DECL_ABSTRACT_ORIGIN. * lto-symtab.c (lto_symtab_merge): Merge DECL_POSSIBLY_INLINED flag. (lto_symtab_prevailing_decl): Do not replace a decl that didn't participate in merging with something else. From-SVN: r227345
This commit is contained in:
parent
6974662928
commit
f196d06291
3 changed files with 25 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
|||
2015-08-31 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* lto.c (compare_tree_sccs_1): Compare DECL_ABSTRACT_ORIGIN.
|
||||
* lto-symtab.c (lto_symtab_merge): Merge DECL_POSSIBLY_INLINED flag.
|
||||
(lto_symtab_prevailing_decl): Do not replace a decl that didn't
|
||||
participate in merging with something else.
|
||||
|
||||
2015-08-31 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* lto-symtab.c (lto_symtab_prevailing_decl): Remove redundant
|
||||
|
|
|
@ -312,6 +312,11 @@ lto_symtab_merge (symtab_node *prevailing, symtab_node *entry)
|
|||
|
||||
if (TREE_CODE (decl) == FUNCTION_DECL)
|
||||
{
|
||||
/* Merge decl state in both directions, we may still end up using
|
||||
the new decl. */
|
||||
DECL_POSSIBLY_INLINED (prevailing_decl) |= DECL_POSSIBLY_INLINED (decl);
|
||||
DECL_POSSIBLY_INLINED (decl) |= DECL_POSSIBLY_INLINED (prevailing_decl);
|
||||
|
||||
if (warn_type_compatibility_p (TREE_TYPE (prevailing_decl),
|
||||
TREE_TYPE (decl)))
|
||||
return false;
|
||||
|
@ -798,6 +803,18 @@ lto_symtab_prevailing_decl (tree decl)
|
|||
if (TREE_CODE (decl) == FUNCTION_DECL && DECL_ABSTRACT_P (decl))
|
||||
return decl;
|
||||
|
||||
/* When decl did not participate in symbol resolution leave it alone.
|
||||
This can happen when we streamed the decl as abstract origin
|
||||
from the block tree of inlining a partially inlined function.
|
||||
If all, the split function and the original function end up
|
||||
optimized away early we do not put the abstract origin into the
|
||||
ltrans boundary and we'll end up ICEing in
|
||||
dwarf2out.c:gen_inlined_subroutine_die because we eventually
|
||||
replace a decl with DECL_POSSIBLY_INLINED set with one without. */
|
||||
if (TREE_CODE (decl) == FUNCTION_DECL
|
||||
&& ! cgraph_node::get (decl))
|
||||
return decl;
|
||||
|
||||
/* Ensure DECL_ASSEMBLER_NAME will not set assembler name. */
|
||||
gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
|
||||
|
||||
|
|
|
@ -1305,6 +1305,7 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map)
|
|||
compare_tree_edges (DECL_SIZE (t1), DECL_SIZE (t2));
|
||||
compare_tree_edges (DECL_SIZE_UNIT (t1), DECL_SIZE_UNIT (t2));
|
||||
compare_tree_edges (DECL_ATTRIBUTES (t1), DECL_ATTRIBUTES (t2));
|
||||
compare_tree_edges (DECL_ABSTRACT_ORIGIN (t1), DECL_ABSTRACT_ORIGIN (t2));
|
||||
if ((code == VAR_DECL
|
||||
|| code == PARM_DECL)
|
||||
&& DECL_HAS_VALUE_EXPR_P (t1))
|
||||
|
|
Loading…
Add table
Reference in a new issue