From 0fb6181ed9157673c64719514350cdc85c6f16dc Mon Sep 17 00:00:00 2001 From: Olivier Hainque Date: Fri, 22 Jun 2018 16:46:22 +0000 Subject: [PATCH] Improve entry/exit instrumentation for nested functions 2018-06-22 Olivier Hainque * 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 --- gcc/ChangeLog | 6 ++++++ gcc/gimplify.c | 17 ++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 22d751f..4b14a34 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-06-22 Olivier Hainque + + * gimplify.c (gimplify_function_tree): Prevent creation + of a trampoline for the address of the current function + passed to entry/exit instrumentation hooks. + 2018-06-22 Aaron Sawdey PR target/86222 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); -- 2.7.4