diff options
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 59e4248..10e2b24 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -7861,13 +7861,31 @@ gimplify_function_tree (tree fndecl) gimple new_bind; gimple tf; gimple_seq cleanup = NULL, body = NULL; - + tree tmp_var; + gimple call; + + x = implicit_built_in_decls[BUILT_IN_RETURN_ADDRESS]; + call = gimple_build_call (x, 0); + tmp_var = create_tmp_var (ptr_type_node, "return_addr"); + gimple_call_set_lhs (call, tmp_var); + gimplify_seq_add_stmt (&cleanup, call); x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT]; - gimplify_seq_add_stmt (&cleanup, gimple_build_call (x, 0)); + call = gimple_build_call (x, 2, + build_fold_addr_expr (current_function_decl), + tmp_var); + gimplify_seq_add_stmt (&cleanup, call); tf = gimple_build_try (seq, cleanup, GIMPLE_TRY_FINALLY); + x = implicit_built_in_decls[BUILT_IN_RETURN_ADDRESS]; + call = gimple_build_call (x, 0); + tmp_var = create_tmp_var (ptr_type_node, "return_addr"); + gimple_call_set_lhs (call, tmp_var); + gimplify_seq_add_stmt (&body, call); x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER]; - gimplify_seq_add_stmt (&body, gimple_build_call (x, 0)); + call = gimple_build_call (x, 2, + build_fold_addr_expr (current_function_decl), + tmp_var); + gimplify_seq_add_stmt (&body, call); gimplify_seq_add_stmt (&body, tf); new_bind = gimple_build_bind (NULL, body, gimple_bind_block (bind)); /* Clear the block for BIND, since it is no longer directly inside |