aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2018-06-22 16:46:22 +0000
committerOlivier Hainque <hainque@gcc.gnu.org>2018-06-22 16:46:22 +0000
commit0fb6181ed9157673c64719514350cdc85c6f16dc (patch)
tree7abc3e136c41506cefcfa91392d55263427dcbce /gcc/gimplify.c
parent3f14cdf84ad3d6fb66ec887a76486de2aed54e10 (diff)
downloadgcc-0fb6181ed9157673c64719514350cdc85c6f16dc.zip
gcc-0fb6181ed9157673c64719514350cdc85c6f16dc.tar.gz
gcc-0fb6181ed9157673c64719514350cdc85c6f16dc.tar.bz2
Improve entry/exit instrumentation for nested functions
2018-06-22 Olivier Hainque <hainque@adacore.com> * gimplify.c (gimplify_function_tree): Prevent creation of a trampoline for the address of the current function passed to entry/exit instrumentation hooks. From-SVN: r261908
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 97543ed..48ac92e 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -12799,18 +12799,23 @@ gimplify_function_tree (tree fndecl)
gbind *new_bind;
gimple *tf;
gimple_seq cleanup = NULL, body = NULL;
- tree tmp_var;
+ tree tmp_var, this_fn_addr;
gcall *call;
+ /* The instrumentation hooks aren't going to call the instrumented
+ function and the address they receive is expected to be matchable
+ against symbol addresses. Make sure we don't create a trampoline,
+ in case the current function is nested. */
+ this_fn_addr = build_fold_addr_expr (current_function_decl);
+ TREE_NO_TRAMPOLINE (this_fn_addr) = 1;
+
x = builtin_decl_implicit (BUILT_IN_RETURN_ADDRESS);
call = gimple_build_call (x, 1, integer_zero_node);
tmp_var = create_tmp_var (ptr_type_node, "return_addr");
gimple_call_set_lhs (call, tmp_var);
gimplify_seq_add_stmt (&cleanup, call);
x = builtin_decl_implicit (BUILT_IN_PROFILE_FUNC_EXIT);
- call = gimple_build_call (x, 2,
- build_fold_addr_expr (current_function_decl),
- tmp_var);
+ call = gimple_build_call (x, 2, this_fn_addr, tmp_var);
gimplify_seq_add_stmt (&cleanup, call);
tf = gimple_build_try (seq, cleanup, GIMPLE_TRY_FINALLY);
@@ -12820,9 +12825,7 @@ gimplify_function_tree (tree fndecl)
gimple_call_set_lhs (call, tmp_var);
gimplify_seq_add_stmt (&body, call);
x = builtin_decl_implicit (BUILT_IN_PROFILE_FUNC_ENTER);
- call = gimple_build_call (x, 2,
- build_fold_addr_expr (current_function_decl),
- tmp_var);
+ call = gimple_build_call (x, 2, this_fn_addr, tmp_var);
gimplify_seq_add_stmt (&body, call);
gimplify_seq_add_stmt (&body, tf);
new_bind = gimple_build_bind (NULL, body, NULL);