re PR debug/17389 (ICE in dwarf2out_finish, at dwarf2out.c:13566)

PR debug/17389
	* dwarf2out.c (dwarf2out_finish): Deal with nested functions
	of fully inlined functions.
	* tree-inline.c (inline_forbidden_p_1): Nested functions can be
	inlined.

From-SVN: r87911
This commit is contained in:
Jan Hubicka 2004-09-23 02:51:40 +02:00 committed by Jan Hubicka
parent e53de54da3
commit 60108d34dc
3 changed files with 14 additions and 17 deletions

View file

@ -1,5 +1,11 @@
2004-09-23 Jan Hubicka <jh@suse.cz>
PR debug/17389
* dwarf2out.c (dwarf2out_finish): Deal with nested functions
of fully inlined functions.
* tree-inline.c (inline_forbidden_p_1): Nested functions can be
inlined.
* cfgexpand.c (add_reg_br_prob_note): New function.
(expand_gimple_cond_expr): Use it.
(tree_expand_cfg): No longer kill the profile.

View file

@ -13554,7 +13554,12 @@ dwarf2out_finish (const char *filename)
nested function can be optimized away, which results
in the nested function die being orphaned. Likewise
with the return type of that nested function. Force
this to be a child of the containing function. */
this to be a child of the containing function.
It may happen that even the containing function got fully
inlined and optimized out. In that case we are lost and
assign the empty child. This should not be big issue as
the function is likely unreachable too. */
tree context = NULL_TREE;
gcc_assert (node->created_for);
@ -13567,8 +13572,8 @@ dwarf2out_finish (const char *filename)
gcc_assert (context && TREE_CODE (context) == FUNCTION_DECL);
origin = lookup_decl_die (context);
gcc_assert (origin);
add_child_die (origin, die);
if (origin)
add_child_die (origin, die);
}
}
}

View file

@ -993,20 +993,6 @@ inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
}
break;
case BIND_EXPR:
for (t = BIND_EXPR_VARS (node); t ; t = TREE_CHAIN (t))
{
/* We cannot inline functions that contain other functions. */
if (TREE_CODE (t) == FUNCTION_DECL && DECL_INITIAL (t))
{
inline_forbidden_reason
= N_("%Jfunction '%F' can never be inlined "
"because it contains a nested function");
return node;
}
}
break;
case GOTO_EXPR:
t = TREE_OPERAND (node, 0);