From f196d062919feaf10ec10c67ac0d20f15fcfd2f5 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 31 Aug 2015 14:01:45 +0000 Subject: [PATCH] lto.c (compare_tree_sccs_1): Compare DECL_ABSTRACT_ORIGIN. 2015-08-31 Richard Biener 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 --- gcc/lto/ChangeLog | 7 +++++++ gcc/lto/lto-symtab.c | 17 +++++++++++++++++ gcc/lto/lto.c | 1 + 3 files changed, 25 insertions(+) diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 56dcfa8f3c0..8d3c83f2226 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,10 @@ +2015-08-31 Richard Biener + + * 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 * lto-symtab.c (lto_symtab_prevailing_decl): Remove redundant diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index d50a1abd3a0..c77ae947c32 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -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)); diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index b4287a358f8..4bb0aafcb7d 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -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)) -- 2.30.2