@@ -878,10 +878,11 @@ asan_shadow_cst (unsigned char shadow_by
/* Clear shadow memory at SHADOW_MEM, LEN bytes. Can't call a library call here
though. */
-static void
+static bool
asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len)
{
rtx insn, insns, top_label, end, addr, tmp, jump;
+ bool ret;
start_sequence ();
clear_storage (shadow_mem, GEN_INT (len), BLOCK_OP_NORMAL);
@@ -893,12 +894,13 @@ asan_clear_shadow (rtx shadow_mem, HOST_
if (insn == NULL_RTX)
{
emit_insn (insns);
- return;
+ return false;
}
gcc_assert ((len & 3) == 0);
top_label = gen_label_rtx ();
addr = force_reg (Pmode, XEXP (shadow_mem, 0));
+ ret = addr == XEXP (shadow_mem, 0);
shadow_mem = adjust_automodify_address (shadow_mem, SImode, addr, 0);
end = force_reg (Pmode, plus_constant (Pmode, addr, len));
emit_label (top_label);
@@ -912,6 +914,7 @@ asan_clear_shadow (rtx shadow_mem, HOST_
jump = get_last_insn ();
gcc_assert (JUMP_P (jump));
add_int_reg_note (jump, REG_BR_PROB, REG_BR_PROB_BASE * 80 / 100);
+ return ret;
}
/* Insert code to protect stack vars. The prologue sequence should be emitted
@@ -1048,7 +1051,14 @@ asan_emit_stack_protection (rtx base, HO
(last_offset - prev_offset)
>> ASAN_SHADOW_SHIFT);
prev_offset = last_offset;
- asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT);
+ if (asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT))
+ {
+ shadow_mem
+ = adjust_automodify_address (shadow_mem, VOIDmode,
+ XEXP (shadow_mem, 0),
+ last_size >> ASAN_SHADOW_SHIFT);
+ prev_offset += last_size;
+ }
last_offset = offset;
last_size = 0;
}