From: hainque Date: Fri, 22 Jun 2018 16:46:22 +0000 (+0000) Subject: Improve entry/exit instrumentation for nested functions X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a35ffc7c7abda69945a99b13ef8a6cda2a84b8b3;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@261908 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 22d751f02d3a..4b14a342af1e 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 97543ed5f705..48ac92e2b16d 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);