From c461d26383f5e7999b3e02c965d8289f2c22f7fe Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 18 Feb 2016 18:15:25 +0100 Subject: [PATCH] Do not emit red stack zones for a fn with no_sanitize_address PR sanitizer/69863 * cfgexpand.c (asan_sanitize_stack_p): New function. (partition_stack_vars): Use the function. (expand_stack_vars): Likewise. (defer_stack_allocation): Likewise. (expand_used_vars): Likewise. Co-Authored-By: Martin Liska From-SVN: r233524 --- gcc/ChangeLog | 10 ++++++++++ gcc/cfgexpand.c | 20 ++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5bbb901c3f..029e8efa7c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2016-02-18 Jakub Jelinek + Martin Liska + + PR sanitizer/69863 + * cfgexpand.c (asan_sanitize_stack_p): New function. + (partition_stack_vars): Use the function. + (expand_stack_vars): Likewise. + (defer_stack_allocation): Likewise. + (expand_used_vars): Likewise. + 2016-02-18 Richard Biener PR middle-end/69553 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 4ac8421b23f..1341c14ce2b 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -868,6 +868,18 @@ union_stack_vars (size_t a, size_t b) } } +/* Return true if the current function should have its stack frame + protected by address sanitizer. */ + +static inline bool +asan_sanitize_stack_p (void) +{ + return ((flag_sanitize & SANITIZE_ADDRESS) + && ASAN_STACK + && !lookup_attribute ("no_sanitize_address", + DECL_ATTRIBUTES (current_function_decl))); +} + /* A subroutine of expand_used_vars. Binpack the variables into partitions constrained by the interference graph. The overall algorithm used is as follows: @@ -929,7 +941,7 @@ partition_stack_vars (void) sizes, as the shorter vars wouldn't be adequately protected. Don't do that for "large" (unsupported) alignment objects, those aren't protected anyway. */ - if ((flag_sanitize & SANITIZE_ADDRESS) && ASAN_STACK && isize != jsize + if (asan_sanitize_stack_p () && isize != jsize && ialign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT) break; @@ -1120,7 +1132,7 @@ expand_stack_vars (bool (*pred) (size_t), struct stack_vars_data *data) if (alignb * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT) { base = virtual_stack_vars_rtx; - if ((flag_sanitize & SANITIZE_ADDRESS) && ASAN_STACK && pred) + if (asan_sanitize_stack_p () && pred) { HOST_WIDE_INT prev_offset = align_base (frame_offset, @@ -1491,7 +1503,7 @@ defer_stack_allocation (tree var, bool toplevel) /* If stack protection is enabled, *all* stack variables must be deferred, so that we can re-order the strings to the top of the frame. Similarly for Address Sanitizer. */ - if (flag_stack_protect || ((flag_sanitize & SANITIZE_ADDRESS) && ASAN_STACK)) + if (flag_stack_protect || asan_sanitize_stack_p ()) return true; unsigned int align = TREE_CODE (var) == SSA_NAME @@ -2191,7 +2203,7 @@ expand_used_vars (void) expand_stack_vars (stack_protect_decl_phase_2, &data); } - if ((flag_sanitize & SANITIZE_ADDRESS) && ASAN_STACK) + if (asan_sanitize_stack_p ()) /* Phase 3, any partitions that need asan protection in addition to phase 1 and 2. */ expand_stack_vars (asan_decl_phase_3, &data);