This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH v8] PR middle-end/60281
- From: lin zuojian <manjian2006 at gmail dot com>
- To: gcc-patches at gcc dot gnu dot org, bernd dot edlinger at hotmail dot de, jakub at redhat dot com
- Date: Fri, 18 Apr 2014 12:26:36 +0800
- Subject: Re: [PATCH v8] PR middle-end/60281
- Authentication-results: sourceware.org; auth=none
- References: <20140418042150 dot GA13430 at ubuntu>
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 <manjian2006@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 <jakub@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