Hi Bernd,
a) On which target(s) did you boot-strap your patch?
    I just run it on x86, can't run it on ARM, because Android is not a
    posix system, nor a System V compatible system. And my code does not
    effect x86.

b) Did you run the testsuite?
    Yes, but again my code does not effect x86.

c) When you compare the test results with and without the patch, were there any 
regressions?
    Only the bug has gone. My app can run on my Android ARM system.

On Fri, Apr 18, 2014 at 12:21:50PM +0800, lin zuojian wrote:
>  Hi,
>     Here is the patch after the Jakub's review, and Jakub helps with the
>     coding style.
> 
> --
> 
>  * asan.c (asan_emit_stack_protection):
>  Force the base to align to appropriate bits if STRICT_ALIGNMENT.  Set
>  shadow_mem align to appropriate bits if STRICT_ALIGNMENT. 
>  * cfgexpand.c
>  (expand_stack_vars): Set base_align appropriately when asan is on.
>  (expand_used_vars): Leave a space in the stack frame for alignment if
>  STRICT_ALIGNMENT.
> 
> ---
>  gcc/ChangeLog   |  9 +++++++++
>  gcc/asan.c      | 15 +++++++++++++++
>  gcc/cfgexpand.c | 18 ++++++++++++++++--
>  3 files changed, 40 insertions(+), 2 deletions(-)
> 
> diff --git a/gcc/ChangeLog b/gcc/ChangeLog
> index da35be8..30a2b33 100644
> --- a/gcc/ChangeLog
> +++ b/gcc/ChangeLog
> @@ -1,3 +1,12 @@
> +2014-04-18  Lin Zuojian  <manjian2...@gmail.com>
> +       PR middle-end/60281
> +       * asan.c (asan_emit_stack_protection): Force the base to align to
> +       appropriate bits if STRICT_ALIGNMENT.  Set shadow_mem align to
> +       appropriate bits if STRICT_ALIGNMENT.
> +       * cfgexpand.c (expand_stack_vars): Set base_align appropriately
> +       when asan is on.
> +       (expand_used_vars): Leave a space in the stack frame for alignment
> +       if STRICT_ALIGNMENT.
>  2014-04-17  Jakub Jelinek  <ja...@redhat.com>
>  
>       PR target/60847
> diff --git a/gcc/asan.c b/gcc/asan.c
> index 53992a8..28a476f 100644
> --- a/gcc/asan.c
> +++ b/gcc/asan.c
> @@ -1017,8 +1017,17 @@ asan_emit_stack_protection (rtx base, rtx pbase, 
> unsigned int alignb,
>       base_align_bias = ((asan_frame_size + alignb - 1)
>                          & ~(alignb - HOST_WIDE_INT_1)) - asan_frame_size;
>      }
> +  /* Align base if target is STRICT_ALIGNMENT.  */
> +  if (STRICT_ALIGNMENT)
> +    base = expand_binop (Pmode, and_optab, base,
> +                      gen_int_mode (-((GET_MODE_ALIGNMENT (SImode)
> +                                       << ASAN_SHADOW_SHIFT)
> +                                      / BITS_PER_UNIT), Pmode), NULL_RTX,
> +                      1, OPTAB_DIRECT);
> +
>    if (use_after_return_class == -1 && pbase)
>      emit_move_insn (pbase, base);
> +
>    base = expand_binop (Pmode, add_optab, base,
>                      gen_int_mode (base_offset - base_align_bias, Pmode),
>                      NULL_RTX, 1, OPTAB_DIRECT);
> @@ -1097,6 +1106,8 @@ asan_emit_stack_protection (rtx base, rtx pbase, 
> unsigned int alignb,
>             && (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4);
>    shadow_mem = gen_rtx_MEM (SImode, shadow_base);
>    set_mem_alias_set (shadow_mem, asan_shadow_set);
> +  if (STRICT_ALIGNMENT)
> +    set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
>    prev_offset = base_offset;
>    for (l = length; l; l -= 2)
>      {
> @@ -1186,6 +1197,10 @@ asan_emit_stack_protection (rtx base, rtx pbase, 
> unsigned int alignb,
>  
>    shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
>    set_mem_alias_set (shadow_mem, asan_shadow_set);
> +
> +  if (STRICT_ALIGNMENT)
> +    set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
> +
>    prev_offset = base_offset;
>    last_offset = base_offset;
>    last_size = 0;
> diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
> index b7f6360..14511e1 100644
> --- a/gcc/cfgexpand.c
> +++ b/gcc/cfgexpand.c
> @@ -1013,10 +1013,19 @@ expand_stack_vars (bool (*pred) (size_t), struct 
> stack_vars_data *data)
>             if (data->asan_base == NULL)
>               data->asan_base = gen_reg_rtx (Pmode);
>             base = data->asan_base;
> +
> +           if (!STRICT_ALIGNMENT)
> +             base_align = crtl->max_used_stack_slot_alignment;
> +           else
> +             base_align = MAX (crtl->max_used_stack_slot_alignment,
> +                               GET_MODE_ALIGNMENT (SImode)
> +                               << ASAN_SHADOW_SHIFT);
>           }
>         else
> -         offset = alloc_stack_frame_space (stack_vars[i].size, alignb);
> -       base_align = crtl->max_used_stack_slot_alignment;
> +         {
> +           offset = alloc_stack_frame_space (stack_vars[i].size, alignb);
> +           base_align = crtl->max_used_stack_slot_alignment;
> +         }
>       }
>        else
>       {
> @@ -1845,6 +1854,11 @@ expand_used_vars (void)
>           = alloc_stack_frame_space (redzonesz, ASAN_RED_ZONE_SIZE);
>         data.asan_vec.safe_push (prev_offset);
>         data.asan_vec.safe_push (offset);
> +       /* Leave space for alignment if STRICT_ALIGNMENT.  */
> +       if (STRICT_ALIGNMENT)
> +         alloc_stack_frame_space ((GET_MODE_ALIGNMENT (SImode)
> +                                   << ASAN_SHADOW_SHIFT)
> +                                  / BITS_PER_UNIT, 1);
>  
>         var_end_seq
>           = asan_emit_stack_protection (virtual_stack_vars_rtx,
> -- 
> 1.8.3.2
> 
> --
> Regards
> lin zuojian

Reply via email to