Commit c62ccb9a by Yury Gribov Committed by Yury Gribov

Move inlining of Asan memory checks to sanopt pass.

Change asan-instrumentation-with-call-threshold to more closely match LLVM.

2014-08-11  Yury Gribov  <y.gribov@samsung.com>

gcc/
	* asan.c (asan_check_flags): New enum.
	(build_check_stmt_with_calls): Removed function.
	(build_check_stmt): Split inlining logic to
	asan_expand_check_ifn.
	(instrument_derefs): Rename parameter.
	(instrument_mem_region_access): Rename parameter.
	(instrument_strlen_call): Likewise.
	(asan_expand_check_ifn): New function.
	(asan_instrument): Remove old code.
	(pass_sanopt::execute): Change handling of
	asan-instrumentation-with-call-threshold.
	(asan_clear_shadow): Fix formatting.
	(asan_function_start): Likewise.
	(asan_emit_stack_protection): Likewise.
	* doc/invoke.texi (asan-instrumentation-with-call-threshold):
	Update description.
	* internal-fn.c (expand_ASAN_CHECK): New function.
	* internal-fn.def (ASAN_CHECK): New internal function.
	* params.def (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD):
	Update description.
	(PARAM_ASAN_USE_AFTER_RETURN): Likewise.
	* tree.c: Small comment fix.

gcc/testsuite/
	* c-c++-common/asan/inc.c: Update test.
	* c-c++-common/asan/instrument-with-calls-2.c: Likewise.
	* c-c++-common/asan/no-redundant-instrumentation-1.c: Likewise.
	* c-c++-common/asan/no-redundant-instrumentation-2.c: Likewise.
	* c-c++-common/asan/no-redundant-instrumentation-3.c: Likewise.
	* c-c++-common/asan/no-redundant-instrumentation-4.c: Likewise.
	* c-c++-common/asan/no-redundant-instrumentation-5.c: Likewise.
	* c-c++-common/asan/no-redundant-instrumentation-6.c: Likewise.
	* c-c++-common/asan/no-redundant-instrumentation-7.c: Likewise.
	* c-c++-common/asan/no-redundant-instrumentation-8.c: Likewise.
	* c-c++-common/asan/no-redundant-instrumentation-9.c: Likewise.

From-SVN: r213807
parent b78475cf
2014-08-11 Yury Gribov <y.gribov@samsung.com> 2014-08-11 Yury Gribov <y.gribov@samsung.com>
* asan.c (asan_check_flags): New enum.
(build_check_stmt_with_calls): Removed function.
(build_check_stmt): Split inlining logic to
asan_expand_check_ifn.
(instrument_derefs): Rename parameter.
(instrument_mem_region_access): Rename parameter.
(instrument_strlen_call): Likewise.
(asan_expand_check_ifn): New function.
(asan_instrument): Remove old code.
(pass_sanopt::execute): Change handling of
asan-instrumentation-with-call-threshold.
(asan_clear_shadow): Fix formatting.
(asan_function_start): Likewise.
(asan_emit_stack_protection): Likewise.
* doc/invoke.texi (asan-instrumentation-with-call-threshold):
Update description.
* internal-fn.c (expand_ASAN_CHECK): New function.
* internal-fn.def (ASAN_CHECK): New internal function.
* params.def (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD):
Update description.
(PARAM_ASAN_USE_AFTER_RETURN): Likewise.
* tree.c: Small comment fix.
2014-08-11 Yury Gribov <y.gribov@samsung.com>
* gimple.c (gimple_call_fnspec): Support internal functions. * gimple.c (gimple_call_fnspec): Support internal functions.
(gimple_call_return_flags): Use const. (gimple_call_return_flags): Use const.
* Makefile.in (GTFILES): Add internal-fn.h to list of GC files. * Makefile.in (GTFILES): Add internal-fn.h to list of GC files.
......
...@@ -10385,9 +10385,9 @@ To disable use-after-return detection use ...@@ -10385,9 +10385,9 @@ To disable use-after-return detection use
@option{--param asan-use-after-return=0}. @option{--param asan-use-after-return=0}.
@item asan-instrumentation-with-call-threshold @item asan-instrumentation-with-call-threshold
Once number of memory accesses in function becomes greater If number of memory accesses in function being instrumented
or equal than this number, use callbacks instead of is greater or equal to this number, use callbacks instead of inline checks.
generating inline code. E.g. to disable inline code use E.g. to disable inline code use
@option{--param asan-instrumentation-with-call-threshold=0}. @option{--param asan-instrumentation-with-call-threshold=0}.
@end table @end table
......
...@@ -181,6 +181,14 @@ expand_UBSAN_BOUNDS (gimple stmt ATTRIBUTE_UNUSED) ...@@ -181,6 +181,14 @@ expand_UBSAN_BOUNDS (gimple stmt ATTRIBUTE_UNUSED)
gcc_unreachable (); gcc_unreachable ();
} }
/* This should get expanded in the sanopt pass. */
static void
expand_ASAN_CHECK (gimple stmt ATTRIBUTE_UNUSED)
{
gcc_unreachable ();
}
/* Add sub/add overflow checking to the statement STMT. /* Add sub/add overflow checking to the statement STMT.
CODE says whether the operation is +, or -. */ CODE says whether the operation is +, or -. */
......
...@@ -55,3 +55,4 @@ DEF_INTERNAL_FN (UBSAN_CHECK_SUB, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) ...@@ -55,3 +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 (UBSAN_CHECK_MUL, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN, NULL) DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN, NULL)
DEF_INTERNAL_FN (BUILTIN_EXPECT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, 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..")
...@@ -1085,14 +1085,14 @@ DEFPARAM (PARAM_ASAN_MEMINTRIN, ...@@ -1085,14 +1085,14 @@ DEFPARAM (PARAM_ASAN_MEMINTRIN,
DEFPARAM (PARAM_ASAN_USE_AFTER_RETURN, DEFPARAM (PARAM_ASAN_USE_AFTER_RETURN,
"asan-use-after-return", "asan-use-after-return",
"Enable asan builtin functions protection", "Enable asan detection of use-after-return bugs",
1, 0, 1) 1, 0, 1)
DEFPARAM (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD, DEFPARAM (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD,
"asan-instrumentation-with-call-threshold", "asan-instrumentation-with-call-threshold",
"Use callbacks instead of inline code once number of accesses " "Use callbacks instead of inline code if number of accesses "
" in function becomes greater or equal than this threshold", "in function becomes greater or equal to this number",
10000, 0, INT_MAX) 7000, 0, INT_MAX)
DEFPARAM (PARAM_UNINIT_CONTROL_DEP_ATTEMPTS, DEFPARAM (PARAM_UNINIT_CONTROL_DEP_ATTEMPTS,
"uninit-control-dep-attempts", "uninit-control-dep-attempts",
......
2014-08-11 Yury Gribov <y.gribov@samsung.com>
* c-c++-common/asan/inc.c: Update test.
* c-c++-common/asan/instrument-with-calls-2.c: Likewise.
* c-c++-common/asan/no-redundant-instrumentation-1.c: Likewise.
* c-c++-common/asan/no-redundant-instrumentation-2.c: Likewise.
* c-c++-common/asan/no-redundant-instrumentation-3.c: Likewise.
* c-c++-common/asan/no-redundant-instrumentation-4.c: Likewise.
* c-c++-common/asan/no-redundant-instrumentation-5.c: Likewise.
* c-c++-common/asan/no-redundant-instrumentation-6.c: Likewise.
* c-c++-common/asan/no-redundant-instrumentation-7.c: Likewise.
* c-c++-common/asan/no-redundant-instrumentation-8.c: Likewise.
* c-c++-common/asan/no-redundant-instrumentation-9.c: Likewise.
2014-08-10 Marek Polacek <polacek@redhat.com> 2014-08-10 Marek Polacek <polacek@redhat.com>
PR c/51849 PR c/51849
......
...@@ -16,6 +16,6 @@ main () ...@@ -16,6 +16,6 @@ main ()
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "__builtin___asan_report" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "ASAN_" 1 "asan0" } } */
/* { dg-final { scan-tree-dump "__builtin___asan_report_load4" "asan0" } } */ /* { dg-final { scan-tree-dump "ASAN_CHECK \\(.*, 4\\);" "asan0" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "asan0" } } */
...@@ -9,8 +9,8 @@ void f(int *a, int *b) { ...@@ -9,8 +9,8 @@ void f(int *a, int *b) {
x = *b; x = *b;
} }
/* { dg-final { scan-assembler-not "__asan_store4" } } */ /* { dg-final { scan-assembler "__asan_store4" } } */
/* { dg-final { scan-assembler "__asan_report_store4" } } */ /* { dg-final { scan-assembler-not "__asan_report_store4" } } */
/* { dg-final { scan-assembler "__asan_load4" } } */ /* { dg-final { scan-assembler "__asan_load4" } } */
/* { dg-final { scan-assembler-not "__asan_report_load4" } } */ /* { dg-final { scan-assembler-not "__asan_report_load4" } } */
/* { dg-final { cleanup-saved-temps } } */ /* { dg-final { cleanup-saved-temps } } */
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
location in the same basic block, the second reference should not location in the same basic block, the second reference should not
be instrumented by the Address Sanitizer. */ be instrumented by the Address Sanitizer. */
/* { dg-options "-fdump-tree-asan0" } */ /* { dg-options "-fdump-tree-sanopt" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
...@@ -62,7 +62,7 @@ main () ...@@ -62,7 +62,7 @@ main ()
return test0 () && test1 (0); return test0 () && test1 (0);
} }
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store1" 3 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_store1" 3 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 2 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load" 1 "sanopt" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "sanopt" } } */
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
be instrumented by the Address Sanitizer. But in case of access to be instrumented by the Address Sanitizer. But in case of access to
overlapping regions we must be precise. */ overlapping regions we must be precise. */
/* { dg-options "-fdump-tree-asan0" } */ /* { dg-options "-fdump-tree-sanopt" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
...@@ -20,7 +20,7 @@ main () ...@@ -20,7 +20,7 @@ main ()
__builtin_memset (tab, 1, 3); __builtin_memset (tab, 1, 3);
} }
/* { dg-final { scan-tree-dump-times "& 7" 3 "asan0" } } */ /* { dg-final { scan-tree-dump-times "& 7" 3 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 2 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report" 2 "sanopt" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "sanopt" } } */
/* { dg-options "-fdump-tree-asan0" } */ /* { dg-options "-fdump-tree-sanopt" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
...@@ -12,7 +12,7 @@ foo (__INT32_TYPE__ *p) ...@@ -12,7 +12,7 @@ foo (__INT32_TYPE__ *p)
return ret; return ret;
} }
/* { dg-final { scan-tree-dump-times "__builtin___asan_report" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report" 2 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_store" 1 "sanopt" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "sanopt" } } */
/* { dg-options "-fdump-tree-asan0" } */ /* { dg-options "-fdump-tree-sanopt" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
...@@ -10,8 +10,8 @@ foo (int *a, char *b, char *c) ...@@ -10,8 +10,8 @@ foo (int *a, char *b, char *c)
/* For a total of 5 checks. */ /* For a total of 5 checks. */
} }
/* { dg-final { scan-tree-dump-times "& 7" 5 "asan0" } } */ /* { dg-final { scan-tree-dump-times "& 7" 5 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 1 "sanopt" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "sanopt" } } */
/* { dg-options "-fdump-tree-asan0" } */ /* { dg-options "-fdump-tree-sanopt" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
...@@ -10,9 +10,9 @@ foo (int *a, char *b, char *c) ...@@ -10,9 +10,9 @@ foo (int *a, char *b, char *c)
/* For a total of 5 checks. */ /* For a total of 5 checks. */
} }
/* { dg-final { scan-tree-dump-times "& 7" 5 "asan0" } } */ /* { dg-final { scan-tree-dump-times "& 7" 5 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load4" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load4" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 1 "sanopt" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "sanopt" } } */
/* { dg-options "-fdump-tree-asan0" } */ /* { dg-options "-fdump-tree-sanopt" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
...@@ -12,9 +12,9 @@ foo (int *a, char *b, char *c) ...@@ -12,9 +12,9 @@ foo (int *a, char *b, char *c)
/* For a total of 8 checks. */ /* For a total of 8 checks. */
} }
/* { dg-final { scan-tree-dump-times "& 7" 8 "asan0" } } */ /* { dg-final { scan-tree-dump-times "& 7" 8 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load4" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load4" 2 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 2 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 2 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 2 "sanopt" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "sanopt" } } */
/* { dg-options "-fdump-tree-asan0" } */ /* { dg-options "-fdump-tree-sanopt" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
...@@ -21,7 +21,7 @@ foo (int *a, char *b, char *c) ...@@ -21,7 +21,7 @@ foo (int *a, char *b, char *c)
return d; return d;
} }
/* { dg-final { scan-tree-dump-times "& 7" 6 "asan0" } } */ /* { dg-final { scan-tree-dump-times "& 7" 6 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 4 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 4 "sanopt" } } */
/* { dg-final { scan-tree-dump-not "__builtin___asan_report_store" "asan0" } } */ /* { dg-final { scan-tree-dump-not "__builtin___asan_report_store" "sanopt" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "sanopt" } } */
/* { dg-options "-fdump-tree-asan0" } */ /* { dg-options "-fdump-tree-sanopt" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
...@@ -12,9 +12,9 @@ foo (int *a, char *b, char *c) ...@@ -12,9 +12,9 @@ foo (int *a, char *b, char *c)
/* For a total of 5 checks. */ /* For a total of 5 checks. */
} }
/* { dg-final { scan-tree-dump-times "& 7" 5 "asan0" } } */ /* { dg-final { scan-tree-dump-times "& 7" 5 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load4" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load4" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_load_n" 1 "sanopt" } } */
/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__builtin___asan_report_store_n" 1 "sanopt" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "sanopt" } } */
/* { dg-options "-fdump-tree-asan0" } */ /* { dg-options "-fdump-tree-sanopt" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
...@@ -9,5 +9,5 @@ f (char *a) ...@@ -9,5 +9,5 @@ f (char *a)
return __builtin_strlen (a); return __builtin_strlen (a);
} }
/* { dg-final { scan-tree-dump-times "__asan_report_load1" 1 "asan0" } } */ /* { dg-final { scan-tree-dump-times "__asan_report_load1" 1 "sanopt" } } */
/* { dg-final { cleanup-tree-dump "asan0" } } */ /* { dg-final { cleanup-tree-dump "sanopt" } } */
...@@ -9870,7 +9870,7 @@ local_define_builtin (const char *name, tree type, enum built_in_function code, ...@@ -9870,7 +9870,7 @@ local_define_builtin (const char *name, tree type, enum built_in_function code,
/* Call this function after instantiating all builtins that the language /* Call this function after instantiating all builtins that the language
front end cares about. This will build the rest of the builtins front end cares about. This will build the rest of the builtins
and internal function that are relied upon by the tree optimizers and and internal functions that are relied upon by the tree optimizers and
the middle-end. */ the middle-end. */
void void
......
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