diff options
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index bfaaede0c32..f56d09e1bdb 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -4752,6 +4752,23 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) reset_debug_bindings (id, stmt_gsi); + if (flag_stack_reuse != SR_NONE + && (flag_sanitize & SANITIZE_KERNEL_ADDRESS) != 0) + for (tree p = DECL_ARGUMENTS (id->src_fn); p; p = DECL_CHAIN (p)) + if (!TREE_THIS_VOLATILE (p)) + { + tree *varp = id->decl_map->get (p); + if (varp && VAR_P (*varp) && !is_gimple_reg (*varp)) + { + tree clobber = build_constructor (TREE_TYPE (*varp), NULL); + gimple *clobber_stmt; + TREE_THIS_VOLATILE (clobber) = 1; + clobber_stmt = gimple_build_assign (*varp, clobber); + gimple_set_location (clobber_stmt, gimple_location (stmt)); + gsi_insert_before (&stmt_gsi, clobber_stmt, GSI_SAME_STMT); + } + } + /* Reset the escaped solution. */ if (cfun->gimple_df) pt_solution_reset (&cfun->gimple_df->escaped); @@ -4802,6 +4819,24 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) stmt = gimple_build_assign (gimple_call_lhs (stmt), use_retvar); gsi_replace (&stmt_gsi, stmt, false); maybe_clean_or_replace_eh_stmt (old_stmt, stmt); + /* Append a clobber for id->retvar if easily possible. */ + if (flag_stack_reuse != SR_NONE + && (flag_sanitize & SANITIZE_KERNEL_ADDRESS) != 0 + && id->retvar + && VAR_P (id->retvar) + && id->retvar != return_slot + && id->retvar != modify_dest + && !TREE_THIS_VOLATILE (id->retvar) + && !is_gimple_reg (id->retvar) + && !stmt_ends_bb_p (stmt)) + { + tree clobber = build_constructor (TREE_TYPE (id->retvar), NULL); + gimple *clobber_stmt; + TREE_THIS_VOLATILE (clobber) = 1; + clobber_stmt = gimple_build_assign (id->retvar, clobber); + gimple_set_location (clobber_stmt, gimple_location (old_stmt)); + gsi_insert_after (&stmt_gsi, clobber_stmt, GSI_SAME_STMT); + } /* Copy bounds if we copy structure with bounds. */ if (chkp_function_instrumented_p (id->dst_fn) @@ -4840,8 +4875,26 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) SSA_NAME_DEF_STMT (name) = gimple_build_nop (); } } + /* Replace with a clobber for id->retvar. */ + else if (flag_stack_reuse != SR_NONE + && (flag_sanitize & SANITIZE_KERNEL_ADDRESS) != 0 + && id->retvar + && VAR_P (id->retvar) + && id->retvar != return_slot + && id->retvar != modify_dest + && !TREE_THIS_VOLATILE (id->retvar) + && !is_gimple_reg (id->retvar)) + { + tree clobber = build_constructor (TREE_TYPE (id->retvar), NULL); + gimple *clobber_stmt; + TREE_THIS_VOLATILE (clobber) = 1; + clobber_stmt = gimple_build_assign (id->retvar, clobber); + gimple_set_location (clobber_stmt, gimple_location (stmt)); + gsi_replace (&stmt_gsi, clobber_stmt, false); + maybe_clean_or_replace_eh_stmt (stmt, clobber_stmt); + } else - gsi_remove (&stmt_gsi, true); + gsi_remove (&stmt_gsi, true); } /* Put returned bounds into the correct place if required. */ @@ -4890,6 +4943,8 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) cg_edge->callee->remove (); id->block = NULL_TREE; + id->retvar = NULL_TREE; + id->retbnd = NULL_TREE; successfully_inlined = true; egress: |