Commit 56b7aede by Martin Liska Committed by Martin Liska

Add pretty printer for ASAN_MARK and add a helper fn

	* asan.c (asan_mark_poison_p): Remove.
	(asan_mark_p): New function.
	(transform_statements): Use the function.
	(asan_expand_mark_ifn): Do not use masked enum.
	* asan.h (enum asan_mark_flags): Declare it via a macro.
	* gimple-pretty-print.c (dump_gimple_call_args): Dump first
	argument of ASAN_MARK.
	* gimplify.c (build_asan_poison_call_expr): Use new enum values.
	(asan_poison_variable): Likewise.
	* gcc.dg/asan/use-after-scope-goto-1.c: Update first argument of
	scanned pattern ASAN_MARK.
	* gcc.dg/asan/use-after-scope-goto-2.c: Likewise.
	* gcc.dg/asan/use-after-scope-switch-1.c: Likewise.
	* gcc.dg/asan/use-after-scope-switch-2.c: Likewise.
	* gcc.dg/asan/use-after-scope-switch-3.c: Likewise.

From-SVN: r243597
parent cd6d518b
2016-12-13 Martin Liska <mliska@suse.cz>
* asan.c (asan_mark_poison_p): Remove.
(asan_mark_p): New function.
(transform_statements): Use the function.
(asan_expand_mark_ifn): Do not use masked enum.
* asan.h (enum asan_mark_flags): Declare it via a macro.
* gimple-pretty-print.c (dump_gimple_call_args): Dump first
argument of ASAN_MARK.
* gimplify.c (build_asan_poison_call_expr): Use new enum values.
(asan_poison_variable): Likewise.
2016-12-13 Jakub Jelinek <jakub@redhat.com> 2016-12-13 Jakub Jelinek <jakub@redhat.com>
PR ipa/77905 PR ipa/77905
...@@ -245,15 +245,6 @@ static unsigned HOST_WIDE_INT asan_shadow_offset_value; ...@@ -245,15 +245,6 @@ static unsigned HOST_WIDE_INT asan_shadow_offset_value;
static bool asan_shadow_offset_computed; static bool asan_shadow_offset_computed;
static vec<char *> sanitized_sections; static vec<char *> sanitized_sections;
/* Return true if STMT is ASAN_MARK poisoning internal function call. */
static inline bool
asan_mark_poison_p (gimple *stmt)
{
return (gimple_call_internal_p (stmt, IFN_ASAN_MARK)
&& tree_to_uhwi (gimple_call_arg (stmt, 0)) == ASAN_MARK_CLOBBER);
}
/* Set of variable declarations that are going to be guarded by /* Set of variable declarations that are going to be guarded by
use-after-scope sanitizer. */ use-after-scope sanitizer. */
...@@ -304,6 +295,13 @@ set_sanitized_sections (const char *sections) ...@@ -304,6 +295,13 @@ set_sanitized_sections (const char *sections)
} }
bool bool
asan_mark_p (gimple *stmt, enum asan_mark_flags flag)
{
return (gimple_call_internal_p (stmt, IFN_ASAN_MARK)
&& tree_to_uhwi (gimple_call_arg (stmt, 0)) == flag);
}
bool
asan_sanitize_stack_p (void) asan_sanitize_stack_p (void)
{ {
return ((flag_sanitize & SANITIZE_ADDRESS) return ((flag_sanitize & SANITIZE_ADDRESS)
...@@ -2222,7 +2220,8 @@ transform_statements (void) ...@@ -2222,7 +2220,8 @@ transform_statements (void)
miss some instrumentation opportunities. Do the same miss some instrumentation opportunities. Do the same
for a ASAN_MARK poisoning internal function. */ for a ASAN_MARK poisoning internal function. */
if (is_gimple_call (s) if (is_gimple_call (s)
&& (!nonfreeing_call_p (s) || asan_mark_poison_p (s))) && (!nonfreeing_call_p (s)
|| asan_mark_p (s, ASAN_MARK_POISON)))
empty_mem_ref_hash_table (); empty_mem_ref_hash_table ();
gsi_next (&i); gsi_next (&i);
...@@ -2777,9 +2776,8 @@ asan_expand_mark_ifn (gimple_stmt_iterator *iter) ...@@ -2777,9 +2776,8 @@ asan_expand_mark_ifn (gimple_stmt_iterator *iter)
{ {
gimple *g = gsi_stmt (*iter); gimple *g = gsi_stmt (*iter);
location_t loc = gimple_location (g); location_t loc = gimple_location (g);
HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (g, 0)); HOST_WIDE_INT flag = tree_to_shwi (gimple_call_arg (g, 0));
gcc_assert (flags < ASAN_MARK_LAST); bool is_poison = ((asan_mark_flags)flag) == ASAN_MARK_POISON;
bool is_clobber = (flags & ASAN_MARK_CLOBBER) != 0;
tree base = gimple_call_arg (g, 1); tree base = gimple_call_arg (g, 1);
gcc_checking_assert (TREE_CODE (base) == ADDR_EXPR); gcc_checking_assert (TREE_CODE (base) == ADDR_EXPR);
...@@ -2827,7 +2825,7 @@ asan_expand_mark_ifn (gimple_stmt_iterator *iter) ...@@ -2827,7 +2825,7 @@ asan_expand_mark_ifn (gimple_stmt_iterator *iter)
if (s > size_in_bytes) if (s > size_in_bytes)
last_chunk_size = ASAN_SHADOW_GRANULARITY - (s - size_in_bytes); last_chunk_size = ASAN_SHADOW_GRANULARITY - (s - size_in_bytes);
asan_store_shadow_bytes (iter, loc, shadow, offset, is_clobber, asan_store_shadow_bytes (iter, loc, shadow, offset, is_poison,
size, last_chunk_size); size, last_chunk_size);
offset += size; offset += size;
} }
...@@ -2840,7 +2838,7 @@ asan_expand_mark_ifn (gimple_stmt_iterator *iter) ...@@ -2840,7 +2838,7 @@ asan_expand_mark_ifn (gimple_stmt_iterator *iter)
gsi_insert_before (iter, g, GSI_SAME_STMT); gsi_insert_before (iter, g, GSI_SAME_STMT);
tree sz_arg = gimple_assign_lhs (g); tree sz_arg = gimple_assign_lhs (g);
tree fun = builtin_decl_implicit (is_clobber ? BUILT_IN_ASAN_CLOBBER_N tree fun = builtin_decl_implicit (is_poison ? BUILT_IN_ASAN_CLOBBER_N
: BUILT_IN_ASAN_UNCLOBBER_N); : BUILT_IN_ASAN_UNCLOBBER_N);
g = gimple_build_call (fun, 2, base_addr, sz_arg); g = gimple_build_call (fun, 2, base_addr, sz_arg);
gimple_set_location (g, loc); gimple_set_location (g, loc);
......
...@@ -75,13 +75,18 @@ enum asan_check_flags ...@@ -75,13 +75,18 @@ enum asan_check_flags
}; };
/* Flags for Asan check builtins. */ /* Flags for Asan check builtins. */
#define IFN_ASAN_MARK_FLAGS DEF(POISON), DEF(UNPOISON)
enum asan_mark_flags enum asan_mark_flags
{ {
ASAN_MARK_CLOBBER = 1 << 0, #define DEF(X) ASAN_MARK_##X
ASAN_MARK_UNCLOBBER = 1 << 1, IFN_ASAN_MARK_FLAGS
ASAN_MARK_LAST = 1 << 2 #undef DEF
}; };
/* Return true if STMT is ASAN_MARK with FLAG as first argument. */
extern bool asan_mark_p (gimple *stmt, enum asan_mark_flags flag);
/* Return the size of padding needed to insert after a protected /* Return the size of padding needed to insert after a protected
decl of SIZE. */ decl of SIZE. */
......
...@@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see
#include "value-prof.h" #include "value-prof.h"
#include "trans-mem.h" #include "trans-mem.h"
#include "cfganal.h" #include "cfganal.h"
#include "asan.h"
#define INDENT(SPACE) \ #define INDENT(SPACE) \
do { int i; for (i = 0; i < SPACE; i++) pp_space (buffer); } while (0) do { int i; for (i = 0; i < SPACE; i++) pp_space (buffer); } while (0)
...@@ -644,6 +645,14 @@ dump_gimple_call_args (pretty_printer *buffer, gcall *gs, int flags) ...@@ -644,6 +645,14 @@ dump_gimple_call_args (pretty_printer *buffer, gcall *gs, int flags)
limit = ARRAY_SIZE (reduction_args); limit = ARRAY_SIZE (reduction_args);
break; break;
case IFN_ASAN_MARK:
#define DEF(X) #X
static const char *const asan_mark_args[] = {IFN_ASAN_MARK_FLAGS};
#undef DEF
enums = asan_mark_args;
limit = ARRAY_SIZE (asan_mark_args);
break;
default: default:
break; break;
} }
......
...@@ -2631,7 +2631,7 @@ nonfreeing_call_p (gimple *call) ...@@ -2631,7 +2631,7 @@ nonfreeing_call_p (gimple *call)
case IFN_ABNORMAL_DISPATCHER: case IFN_ABNORMAL_DISPATCHER:
return true; return true;
case IFN_ASAN_MARK: case IFN_ASAN_MARK:
return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNCLOBBER; return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON;
default: default:
if (gimple_call_flags (call) & ECF_LEAF) if (gimple_call_flags (call) & ECF_LEAF)
return true; return true;
......
...@@ -1109,7 +1109,7 @@ build_asan_poison_call_expr (tree decl) ...@@ -1109,7 +1109,7 @@ build_asan_poison_call_expr (tree decl)
return build_call_expr_internal_loc (UNKNOWN_LOCATION, IFN_ASAN_MARK, return build_call_expr_internal_loc (UNKNOWN_LOCATION, IFN_ASAN_MARK,
void_type_node, 3, void_type_node, 3,
build_int_cst (integer_type_node, build_int_cst (integer_type_node,
ASAN_MARK_CLOBBER), ASAN_MARK_POISON),
base, unit_size); base, unit_size);
} }
...@@ -1138,7 +1138,7 @@ asan_poison_variable (tree decl, bool poison, gimple_stmt_iterator *it, ...@@ -1138,7 +1138,7 @@ asan_poison_variable (tree decl, bool poison, gimple_stmt_iterator *it,
if (DECL_ALIGN_UNIT (decl) <= ASAN_SHADOW_GRANULARITY) if (DECL_ALIGN_UNIT (decl) <= ASAN_SHADOW_GRANULARITY)
SET_DECL_ALIGN (decl, BITS_PER_UNIT * ASAN_SHADOW_GRANULARITY); SET_DECL_ALIGN (decl, BITS_PER_UNIT * ASAN_SHADOW_GRANULARITY);
HOST_WIDE_INT flags = poison ? ASAN_MARK_CLOBBER : ASAN_MARK_UNCLOBBER; HOST_WIDE_INT flags = poison ? ASAN_MARK_POISON : ASAN_MARK_UNPOISON;
gimple *g gimple *g
= gimple_build_call_internal (IFN_ASAN_MARK, 3, = gimple_build_call_internal (IFN_ASAN_MARK, 3,
......
2016-12-13 Martin Liska <mliska@suse.cz>
* gcc.dg/asan/use-after-scope-goto-1.c: Update first argument of
scanned pattern ASAN_MARK.
* gcc.dg/asan/use-after-scope-goto-2.c: Likewise.
* gcc.dg/asan/use-after-scope-switch-1.c: Likewise.
* gcc.dg/asan/use-after-scope-switch-2.c: Likewise.
* gcc.dg/asan/use-after-scope-switch-3.c: Likewise.
2016-12-13 Jakub Jelinek <jakub@redhat.com> 2016-12-13 Jakub Jelinek <jakub@redhat.com>
PR ipa/77905 PR ipa/77905
......
...@@ -42,6 +42,6 @@ int main(int argc, char **argv) ...@@ -42,6 +42,6 @@ int main(int argc, char **argv)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(2, &a, 4\\);" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &a, 4\\);" 2 "asan0" } } */
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(2, &c, 4\\);" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &c, 4\\);" 2 "asan0" } } */
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(2, &e, 4\\);" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &e, 4\\);" 2 "asan0" } } */
...@@ -22,4 +22,4 @@ int main(int argc, char **argv) ...@@ -22,4 +22,4 @@ int main(int argc, char **argv)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(2, &a, 4\\);" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &a, 4\\);" 1 "asan0" } } */
...@@ -21,5 +21,5 @@ main (int argc, char **argv) ...@@ -21,5 +21,5 @@ main (int argc, char **argv)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(2, &a, \[0-9\]\\);" 2 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &a, \[0-9\]\\);" 2 "gimple" } } */
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(1, &a, \[0-9\]\\);" 1 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(POISON, &a, \[0-9\]\\);" 1 "gimple" } } */
...@@ -25,9 +25,9 @@ main (int argc, char **argv) ...@@ -25,9 +25,9 @@ main (int argc, char **argv)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(2, &a, \[0-9\]\\);" 2 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &a, \[0-9\]\\);" 2 "gimple" } } */
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(2, &b, \[0-9\]\\);" 2 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &b, \[0-9\]\\);" 2 "gimple" } } */
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(2, &c, \[0-9\]\\);" 2 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &c, \[0-9\]\\);" 2 "gimple" } } */
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(1, &a, \[0-9\]\\);" 1 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(POISON, &a, \[0-9\]\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(1, &b, \[0-9\]\\);" 1 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(POISON, &b, \[0-9\]\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(1, &c, \[0-9\]\\);" 1 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(POISON, &c, \[0-9\]\\);" 1 "gimple" } } */
...@@ -32,5 +32,5 @@ main (int argc, char **argv) ...@@ -32,5 +32,5 @@ main (int argc, char **argv)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(2, &a, \[0-9\]\\);" 4 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &a, \[0-9\]\\);" 4 "gimple" } } */
/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(1, &a, \[0-9\]\\);" 1 "gimple" } } */ /* { dg-final { scan-tree-dump-times "ASAN_MARK \\(POISON, &a, \[0-9\]\\);" 1 "gimple" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment