Hi! As mentioned in the PR, we refuse to inline with -fsanitize=address no_sanitize_address functions into functions without that attribute, which is good and has been requested in PR59600. We also refuse to inline functions without that attribute into no_sanitize_address functions, which is ok if it is optimization matter only, we will just address sanitize the callee and not the caller. But if such callee has always_inline attribute, this causes errors, and e.g. means one can't use target intrinsics in functions with no_sanitize_address attribute, as we refuse to inline any of those.
The following patch allows inlining always_inline functions in that situation, the end result is that both the caller and callee which becomes one function will not be sanitized (still errors if always_inline, no_sanitize_address is being inlined into normal function, that is just user error). Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2019-01-30 Jakub Jelinek <ja...@redhat.com> PR sanitizer/89124 * ipa-inline.c (sanitize_attrs_match_for_inline_p): Allow inlining always_inline callees into no_sanitize_address callers. * c-c++-common/asan/pr89124.c: New test. --- gcc/ipa-inline.c.jj 2019-01-10 11:43:08.956466913 +0100 +++ gcc/ipa-inline.c 2019-01-30 22:21:57.319026848 +0100 @@ -264,6 +264,12 @@ sanitize_attrs_match_for_inline_p (const if (!caller || !callee) return true; + /* Allow inlining always_inline functions into no_sanitize_address + functions. */ + if (!sanitize_flags_p (SANITIZE_ADDRESS, caller) + && lookup_attribute ("always_inline", DECL_ATTRIBUTES (callee))) + return true; + return ((sanitize_flags_p (SANITIZE_ADDRESS, caller) == sanitize_flags_p (SANITIZE_ADDRESS, callee)) && (sanitize_flags_p (SANITIZE_POINTER_COMPARE, caller) --- gcc/testsuite/c-c++-common/asan/pr89124.c.jj 2019-01-30 22:23:27.018546142 +0100 +++ gcc/testsuite/c-c++-common/asan/pr89124.c 2019-01-30 22:23:05.568900221 +0100 @@ -0,0 +1,14 @@ +/* PR sanitizer/89124 */ +/* { dg-do compile } */ + +static int inline __attribute__ ((always_inline)) +foo (int x) +{ + return x + 1; +} + +__attribute__ ((no_sanitize_address)) int +bar (int x) +{ + return foo (x); +} Jakub