On Wed, Jun 10, 2020 at 11:49:01AM +0200, Martin Liška wrote: > - store_by_pieces (shadow_mem, sz, builtin_memset_read_str, &c, > - BITS_PER_UNIT, true, RETURN_BEGIN); > + { > + /* Emit: > + memset(ShadowBase, kAsanStackAfterReturnMagic, ShadowSize); > + **SavedFlagPtr(FakeStack) = 0
SavedFlagPtr has two arguments, doesn't it? > + */ > + store_by_pieces (shadow_mem, sz, builtin_memset_read_str, &c, > + BITS_PER_UNIT, true, RETURN_BEGIN); > + > + unsigned HOST_WIDE_INT offset > + = (1 << (use_after_return_class + 6)); > + offset -= GET_MODE_SIZE (ptr_mode); So, mem here is a MEM into which we stored ASAN_STACK_RETIRED_MAGIC. > + mem = adjust_address (mem, ptr_mode, offset); This adds offset to it and changes mode to ptr_mode. So, mem is now *(ptr_mode)(&old_mem + offset) > + rtx addr = gen_reg_rtx (ptr_mode); > + emit_move_insn (addr, mem); We load that value. > + mem = gen_rtx_MEM (ptr_mode, addr); > + mem = adjust_address (mem, QImode, 0); And here I'm lost why you do that. If you want to store a single byte into what it points to, then why don't you just mem = gen_rtx_MEM (QImode, addr); instead of the above two lines? adjust_address will return a MEM like the above, with offset not adjusted (as the addition is 0) and mode changed to QImode, but there is no reason not to create it already in QImode. > + emit_move_insn (mem, const0_rtx); > + } > else if (use_after_return_class >= 5 > || !set_storage_via_setmem (shadow_mem, > GEN_INT (sz), > -- > 2.26.2 > Jakub