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:
parent
e53de54da3
commit
60108d34dc
3 changed files with 14 additions and 17 deletions
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue