diff options
author | Marat Zakirov <m.zakirov@samsung.com> | 2014-09-19 08:29:04 +0000 |
---|---|---|
committer | Marat Zakirov <mzakirov@gcc.gnu.org> | 2014-09-19 08:29:04 +0000 |
commit | f434eb6997a825387bc5c068b0bd812c04c8e0d8 (patch) | |
tree | 0249efe52d96dad3408dbcabee61c3678d0c668d | |
parent | 4ce351defb1341067c91b0a3f1c204e791fba71d (diff) | |
download | gcc-f434eb6997a825387bc5c068b0bd812c04c8e0d8.zip gcc-f434eb6997a825387bc5c068b0bd812c04c8e0d8.tar.gz gcc-f434eb6997a825387bc5c068b0bd812c04c8e0d8.tar.bz2 |
asan.c (build_check_stmt): Alignment arg was added.
gcc/ChangeLog:
2014-09-19 Marat Zakirov <m.zakirov@samsung.com>
* asan.c (build_check_stmt): Alignment arg was added.
(asan_expand_check_ifn): Optimization for alignment >= 8.
gcc/testsuite/ChangeLog:
2014-09-19 Marat Zakirov <m.zakirov@samsung.com>
* c-c++-common/asan/red-align-1.c: New test.
* c-c++-common/asan/red-align-2.c: New test.
From-SVN: r215380
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/asan.c | 12 | ||||
-rw-r--r-- | gcc/internal-fn.def | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/asan/red-align-1.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/asan/red-align-2.c | 20 |
6 files changed, 60 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 827e5d2..ecfb1a6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-09-19 Marat Zakirov <m.zakirov@samsung.com> + + * asan.c (build_check_stmt): Alignment arg was added. + (asan_expand_check_ifn): Optimization for alignment >= 8. + 2014-09-19 Olivier Hainque <hainque@adacore.com> * config/i386/vxworksae.h: Remove obsolete definitions. @@ -1667,9 +1667,11 @@ build_check_stmt (location_t loc, tree base, tree len, if (end_instrumented) flags |= ASAN_CHECK_END_INSTRUMENTED; - g = gimple_build_call_internal (IFN_ASAN_CHECK, 3, + g = gimple_build_call_internal (IFN_ASAN_CHECK, 4, build_int_cst (integer_type_node, flags), - base, len); + base, len, + build_int_cst (integer_type_node, + align / BITS_PER_UNIT)); gimple_set_location (g, loc); if (before_p) gsi_insert_before (&gsi, g, GSI_SAME_STMT); @@ -2466,6 +2468,7 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls) tree base = gimple_call_arg (g, 1); tree len = gimple_call_arg (g, 2); + HOST_WIDE_INT align = tree_to_shwi (gimple_call_arg (g, 3)); HOST_WIDE_INT size_in_bytes = is_scalar_access && tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1; @@ -2576,7 +2579,10 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls) gimple shadow_test = build_assign (NE_EXPR, shadow, 0); gimple_seq seq = NULL; gimple_seq_add_stmt (&seq, shadow_test); - gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, base_addr, 7)); + /* Aligned (>= 8 bytes) access do not need & 7. */ + if (align < 8) + gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, + base_addr, 7)); gimple_seq_add_stmt (&seq, build_type_cast (shadow_type, gimple_seq_last (seq))); if (real_size_in_bytes > 1) diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def index 7ae60f3..54ade9f 100644 --- a/gcc/internal-fn.def +++ b/gcc/internal-fn.def @@ -55,4 +55,4 @@ DEF_INTERNAL_FN (UBSAN_CHECK_SUB, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) DEF_INTERNAL_FN (UBSAN_CHECK_MUL, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN, NULL) DEF_INTERNAL_FN (BUILTIN_EXPECT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) -DEF_INTERNAL_FN (ASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, ".W..") +DEF_INTERNAL_FN (ASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, ".W...") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ddf4cde..083c78b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-09-19 Marat Zakirov <m.zakirov@samsung.com> + + * c-c++-common/asan/red-align-1.c: New test. + * c-c++-common/asan/red-align-2.c: New test. + 2014-09-18 H.J. Lu <hongjiu.lu@intel.com> * gcc.dg/pr61053.c: Updated for x32. diff --git a/gcc/testsuite/c-c++-common/asan/red-align-1.c b/gcc/testsuite/c-c++-common/asan/red-align-1.c new file mode 100644 index 0000000..afd7467 --- /dev/null +++ b/gcc/testsuite/c-c++-common/asan/red-align-1.c @@ -0,0 +1,20 @@ +/* This tests aligment propagation to structure elem and + abcense of redundant & 7. */ + +/* { dg-options "-fdump-tree-sanopt" } */ +/* { dg-do compile } */ +/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */ + +struct st { + int a; + int b; + int c; +} __attribute__((aligned(16))); + +int foo (struct st * s_p) +{ + return s_p->a; +} + +/* { dg-final { scan-tree-dump-times "& 7" 0 "sanopt" } } */ +/* { dg-final { cleanup-tree-dump "sanopt" } } */ diff --git a/gcc/testsuite/c-c++-common/asan/red-align-2.c b/gcc/testsuite/c-c++-common/asan/red-align-2.c new file mode 100644 index 0000000..d30b1ad --- /dev/null +++ b/gcc/testsuite/c-c++-common/asan/red-align-2.c @@ -0,0 +1,20 @@ +/* This tests aligment propagation to structure elem and + abcense of redundant & 7. */ + +/* { dg-options "-fdump-tree-sanopt" } */ +/* { dg-do compile } */ +/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */ + +struct st { + int a; + int b; + int c; +} __attribute__((aligned(16))); + +int foo (struct st * s_p) +{ + return s_p->b; +} + +/* { dg-final { scan-tree-dump-times "& 7" 1 "sanopt" } } */ +/* { dg-final { cleanup-tree-dump "sanopt" } } */ |