Add support for compiler instrumentation with non-default ASan scale 75/210375/9 accepted/tizen/base/20190730.013334 submit/tizen_base/20190724.060247
authorMikhail Kashkarov <m.kashkarov@partner.samsung.com>
Fri, 12 Jul 2019 17:55:45 +0000 (20:55 +0300)
committerDongkyun Son <dongkyun.s@samsung.com>
Mon, 22 Jul 2019 12:19:18 +0000 (12:19 +0000)
* asan.c (asan_clear_shadow): Adjust for the custom ASAN_SHADOW_SHIFT.
(asan_redzone_buffer::emit_redzone_byte): Same.
(asan_redzone_buffer): New assert.
(asan_emit_stack_protection): New asserts for custom ASAN_SHADOW_SHIFT.
(asan_emit_stack_protection): Additional redzone flush for the high shadow
granularities.
(asan_expand_check_ifn): Adjust for custom ASAN_SHADOW_SHIFT.
(asan_expand_check_ifn): Same.
* asan.h (ASAN_RED_ZONE_SIZE): Adjust for custom ASAN_SHADOW_SHIFT.
(ASAN_MIN_RED_ZONE_SIZE): Same.
* cfgexpand.c (expand_used_vars): Remove cast.

Change-Id: I770677b502d8a83c765d34a1c5217a947d501693

gcc/asan.c
gcc/asan.h
gcc/cfgexpand.c

index ae83c69..a2e4ff9 100644 (file)
@@ -983,7 +983,7 @@ asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len)
   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 ();
@@ -1101,7 +1101,7 @@ asan_redzone_buffer::emit_redzone_byte (HOST_WIDE_INT offset,
       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);
        }
 
@@ -1131,6 +1131,7 @@ asan_redzone_buffer::flush_redzone_payload (void)
 
   /* 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);
 
@@ -1347,8 +1348,12 @@ asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
     = 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)
@@ -1386,6 +1391,11 @@ asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
       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.  */
@@ -2985,7 +2995,8 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls)
 
   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;
@@ -3036,7 +3047,7 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls)
   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);
@@ -3055,10 +3066,11 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls)
       /* 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)));
@@ -3100,7 +3112,8 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls)
          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,
index 66f7e90..333d11c 100644 (file)
@@ -52,12 +52,13 @@ extern hash_set <tree> *asan_used_labels;
 
 /* 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
index 1c4736a..48ecb16 100644 (file)
@@ -2215,7 +2215,7 @@ expand_used_vars (void)
          sz = data.asan_vec[0] - prev_offset;
          if (data.asan_alignb > ASAN_RED_ZONE_SIZE
              && data.asan_alignb <= 4096
-             && sz + ASAN_RED_ZONE_SIZE >= (int) data.asan_alignb)
+             && sz + ASAN_RED_ZONE_SIZE >= data.asan_alignb)
            redzonesz = ((sz + ASAN_RED_ZONE_SIZE + data.asan_alignb - 1)
                         & ~(data.asan_alignb - HOST_WIDE_INT_1)) - sz;
          offset