diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 258bed5e264..6a146e0279f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-11-23 Jakub Jelinek + + PR sanitizer/55435 + * asan.c (gate_asan): Don't instrument functions with + no_address_safety_analysis attribute. + (gate_asan_O0): Use !optimize && gate_asan (). + * doc/extend.texi (no_address_safety_analysis): Document new + function attribute. + 2012-11-22 Teresa Johnson Jan Hubicka diff --git a/gcc/asan.c b/gcc/asan.c index bd90e0a54d5..26c4178a9f0 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -1587,7 +1587,9 @@ asan_instrument (void) static bool gate_asan (void) { - return flag_asan != 0; + return flag_asan != 0 + && !lookup_attribute ("no_address_safety_analysis", + DECL_ATTRIBUTES (current_function_decl)); } struct gimple_opt_pass pass_asan = @@ -1614,7 +1616,7 @@ struct gimple_opt_pass pass_asan = static bool gate_asan_O0 (void) { - return flag_asan != 0 && !optimize; + return !optimize && gate_asan (); } struct gimple_opt_pass pass_asan_O0 = diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 29386629437..ce794a29273 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2012-11-23 Jakub Jelinek + + PR sanitizer/55435 + * c-common.c (handle_no_address_safety_analysis_attribute): New + function. + (c_common_attribute_table): Add no_address_safety_analysis. + 2012-11-16 Simon Baldwin * c.opt: Add f[no-]canonical-system-headers. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index fac71901e0f..0c9cccd3146 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -309,6 +309,8 @@ static tree handle_common_attribute (tree *, tree, tree, int, bool *); static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *); static tree handle_hot_attribute (tree *, tree, tree, int, bool *); static tree handle_cold_attribute (tree *, tree, tree, int, bool *); +static tree handle_no_address_safety_analysis_attribute (tree *, tree, tree, + int, bool *); static tree handle_noinline_attribute (tree *, tree, tree, int, bool *); static tree handle_noclone_attribute (tree *, tree, tree, int, bool *); static tree handle_leaf_attribute (tree *, tree, tree, int, bool *); @@ -711,6 +713,10 @@ const struct attribute_spec c_common_attribute_table[] = handle_cold_attribute, false }, { "hot", 0, 0, true, false, false, handle_hot_attribute, false }, + { "no_address_safety_analysis", + 0, 0, true, false, false, + handle_no_address_safety_analysis_attribute, + false }, { "warning", 1, 1, true, false, false, handle_error_attribute, false }, { "error", 1, 1, true, false, false, @@ -6482,6 +6488,22 @@ handle_cold_attribute (tree *node, tree name, tree ARG_UNUSED (args), return NULL_TREE; } +/* Handle a "no_address_safety_analysis" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_no_address_safety_analysis_attribute (tree *node, tree name, tree, int, + bool *no_add_attrs) +{ + if (TREE_CODE (*node) != FUNCTION_DECL) + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + + return NULL_TREE; +} + /* Handle a "noinline" attribute; arguments as in struct attribute_spec.handler. */ diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 577643eee2f..f34f0f955e9 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -2130,10 +2130,11 @@ attributes are currently defined for functions on all targets: @code{weak}, @code{malloc}, @code{alias}, @code{ifunc}, @code{warn_unused_result}, @code{nonnull}, @code{gnu_inline}, @code{externally_visible}, @code{hot}, @code{cold}, @code{artificial}, -@code{error} and @code{warning}. Several other attributes are defined -for functions on particular target systems. Other attributes, -including @code{section} are supported for variables declarations -(@pxref{Variable Attributes}) and for types (@pxref{Type Attributes}). +@code{no_address_safety_analysis}, @code{error} and @code{warning}. +Several other attributes are defined for functions on particular +target systems. Other attributes, including @code{section} are +supported for variables declarations (@pxref{Variable Attributes}) +and for types (@pxref{Type Attributes}). GCC plugins may provide their own attributes. @@ -3416,6 +3417,12 @@ with computed goto or @code{asm goto}. The @code{cold} attribute on labels is not implemented in GCC versions earlier than 4.8. +@item no_address_safety_analysis +@cindex @code{no_address_safety_analysis} function attribute +The @code{no_address_safety_analysis} attribute on functions is used +to inform the compiler that it should not instrument memory accesses +in the function when compiling with the @option{-fsanitize=address} option. + @item regparm (@var{number}) @cindex @code{regparm} attribute @cindex functions that are passed arguments in registers on the 386 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 788266ffcee..e3214b1380c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-11-23 Jakub Jelinek + + PR sanitizer/55435 + * c-c++-common/asan/attrib-1.c: New test. + 2012-11-22 Ian Bolton * gcc.target/aarch64/builtin-bswap-1.c: New test. diff --git a/gcc/testsuite/c-c++-common/asan/attrib-1.c b/gcc/testsuite/c-c++-common/asan/attrib-1.c new file mode 100644 index 00000000000..e633bb6181a --- /dev/null +++ b/gcc/testsuite/c-c++-common/asan/attrib-1.c @@ -0,0 +1,34 @@ +/* PR sanitizer/55435 */ +/* { dg-do compile } */ + +__attribute__((no_address_safety_analysis)) int +f1 (int *p, int *q) +{ + *p = 42; + return *q; +} + +void f2 (char *); +void f2 (char *) __attribute__((no_address_safety_analysis)); +void f2 (char *) __attribute__((no_address_safety_analysis)); +void f2 (char *); + +void +f2 (char *p) +{ + *p = 42; +} + +void f3 (short *); +__typeof (f3) f3 __attribute__((__no_address_safety_analysis__)); + +void +f3 (short *p) +{ + *p = 42; +} + +int v __attribute__((no_address_safety_analysis)); /* { dg-warning "attribute ignored" } */ + +/* { dg-final { scan-assembler-not "__asan_report_store" } } */ +/* { dg-final { scan-assembler-not "__asan_report_load" } } */