diff options
author | Olivier Hainque <hainque@adacore.com> | 2018-06-22 16:46:22 +0000 |
---|---|---|
committer | Olivier Hainque <hainque@gcc.gnu.org> | 2018-06-22 16:46:22 +0000 |
commit | 0fb6181ed9157673c64719514350cdc85c6f16dc (patch) | |
tree | 7abc3e136c41506cefcfa91392d55263427dcbce /gcc/gimplify.c | |
parent | 3f14cdf84ad3d6fb66ec887a76486de2aed54e10 (diff) | |
download | gcc-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.c | 17 |
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); |