rtx_code_label *top_label;
rtx end, addr, tmp;
- gcc_assert ((len & 3) == 0);
+ gcc_assert ((len & ((ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) - 1)) == 0);
start_sequence ();
clear_storage (shadow_mem, GEN_INT (len), BLOCK_OP_NORMAL);
insns = get_insns ();
if (align)
{
offset -= align;
- for (unsigned i = 0; i < align / BITS_PER_UNIT; i++)
+ for (unsigned i = 0; i < align / ASAN_SHADOW_GRANULARITY; i++)
m_shadow_bytes.safe_push (0);
}
/* Fill it to RZ_BUFFER_SIZE bytes with zeros if needed. */
unsigned l = m_shadow_bytes.length ();
+ gcc_assert (RZ_BUFFER_SIZE >= l);
for (unsigned i = 0; i <= RZ_BUFFER_SIZE - l; i++)
m_shadow_bytes.safe_push (0);
= plus_constant (Pmode, shadow_base,
asan_shadow_offset ()
+ (base_align_bias >> ASAN_SHADOW_SHIFT));
- gcc_assert (asan_shadow_set != -1
- && (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4);
+ gcc_assert (asan_shadow_set != -1);
+ gcc_assert (ASAN_SHADOW_GRANULARITY >= 8
+ && ASAN_SHADOW_GRANULARITY <= 64);
+ gcc_assert (ASAN_MIN_RED_ZONE_SIZE >= 16
+ && ASAN_MIN_RED_ZONE_SIZE >= ASAN_SHADOW_GRANULARITY);
+ gcc_assert (ASAN_RED_ZONE_SIZE >= 32UL);
shadow_mem = gen_rtx_MEM (SImode, shadow_base);
set_mem_alias_set (shadow_mem, asan_shadow_set);
if (STRICT_ALIGNMENT)
cur_shadow_byte = ASAN_STACK_MAGIC_MIDDLE;
}
+ /* Right redzone could be still in buffer for high shadow scales. */
+ if (ASAN_SHADOW_SHIFT > 3
+ && rz_buffer.m_shadow_bytes.length() < RZ_BUFFER_SIZE)
+ rz_buffer.flush_redzone_payload();
+
/* As the automatic variables are aligned to
ASAN_RED_ZONE_SIZE / ASAN_SHADOW_GRANULARITY, the buffer should be
flushed here. */
HOST_WIDE_INT real_size_in_bytes = size_in_bytes == -1 ? 1 : size_in_bytes;
- tree shadow_ptr_type = shadow_ptr_types[real_size_in_bytes == 16 ? 1 : 0];
+ tree shadow_ptr_type = shadow_ptr_types[real_size_in_bytes ==
+ (2 * ASAN_SHADOW_GRANULARITY) ? 1 : 0];
tree shadow_type = TREE_TYPE (shadow_ptr_type);
gimple_stmt_iterator gsi = *iter;
tree base_addr = gimple_assign_lhs (g);
tree t = NULL_TREE;
- if (real_size_in_bytes >= 8)
+ if (real_size_in_bytes >= ASAN_SHADOW_GRANULARITY)
{
tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
shadow_ptr_type);
/* Aligned (>= 8 bytes) can test just
(real_size_in_bytes - 1 >= shadow), as base_addr & 7 is known
to be 0. */
- if (align < 8)
+ if (align < ASAN_SHADOW_GRANULARITY)
{
gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
- base_addr, 7));
+ base_addr,
+ ASAN_SHADOW_GRANULARITY - 1));
gimple_seq_add_stmt (&seq,
build_type_cast (shadow_type,
gimple_seq_last (seq)));
gimple_seq seq = NULL;
gimple_seq_add_stmt (&seq, shadow_test);
gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
- base_end_addr, 7));
+ base_end_addr,
+ ASAN_SHADOW_GRANULARITY - 1));
gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
gimple_seq_last (seq)));
gimple_seq_add_stmt (&seq, build_assign (GE_EXPR,
/* Red zone size, stack and global variables are padded by ASAN_RED_ZONE_SIZE
up to 2 * ASAN_RED_ZONE_SIZE - 1 bytes. */
-#define ASAN_RED_ZONE_SIZE 32
+#define ASAN_RED_ZONE_SIZE \
+ ((ASAN_SHADOW_GRANULARITY < 32UL) ? 32UL : ASAN_SHADOW_GRANULARITY)
/* Stack variable use more compact red zones. The size includes also
size of variable itself. */
-#define ASAN_MIN_RED_ZONE_SIZE 16
+#define ASAN_MIN_RED_ZONE_SIZE (2 * ASAN_SHADOW_GRANULARITY)
/* Shadow memory values for stack protection. Left is below protected vars,
the first pointer in stack corresponding to that offset contains