From 61a398eed4de0fc1906e9e9ba77da4c9edabe1de Mon Sep 17 00:00:00 2001 From: Slava Barinov Date: Fri, 23 Sep 2016 14:09:09 +0300 Subject: [PATCH] Import UBSAN_NULL check bugfix from upstream The whole original patch introduces too many changes including new features so only the changes crucial for bugfix are imported. The ASan internal function mode is switched to R together with UBSan one. Upstream hash: 32cf7025dfa4a65f3e4dafb3b46b4816b119a75b git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219695 138bc75d-0d04-0410-961f-82ee72b054a4 Change-Id: I22448d08ddca269f802844b284b3177c3ae97404 Signed-off-by: Slava Barinov --- gcc/internal-fn.def | 4 ++-- gcc/tree-ssa-alias.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def index b8e457c..d362b05 100644 --- a/gcc/internal-fn.def +++ b/gcc/internal-fn.def @@ -48,7 +48,7 @@ DEF_INTERNAL_FN (LOOP_VECTORIZED, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL) DEF_INTERNAL_FN (MASK_LOAD, ECF_PURE | ECF_LEAF, NULL) DEF_INTERNAL_FN (MASK_STORE, ECF_LEAF, NULL) DEF_INTERNAL_FN (ANNOTATE, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) -DEF_INTERNAL_FN (UBSAN_NULL, ECF_LEAF | ECF_NOTHROW, ".W.") +DEF_INTERNAL_FN (UBSAN_NULL, ECF_LEAF | ECF_NOTHROW, ".R.") DEF_INTERNAL_FN (UBSAN_BOUNDS, ECF_LEAF | ECF_NOTHROW, NULL) DEF_INTERNAL_FN (UBSAN_CHECK_ADD, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) DEF_INTERNAL_FN (UBSAN_CHECK_SUB, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) @@ -56,4 +56,4 @@ DEF_INTERNAL_FN (UBSAN_CHECK_MUL, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) DEF_INTERNAL_FN (UBSAN_OBJECT_SIZE, 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, ".R...") diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index cdf3166..7fbb1d6 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1715,6 +1715,21 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref) if (gimple_call_flags (call) & (ECF_PURE|ECF_CONST|ECF_LOOPING_CONST_OR_PURE|ECF_NOVOPS)) return false; + if (gimple_call_internal_p (call)) + switch (gimple_call_internal_fn (call)) + { + /* Treat these internal calls like ECF_PURE for aliasing, + they don't write to any memory the program should care about. + They have important other side-effects, and read memory, + so can't be ECF_NOVOPS. */ + case IFN_UBSAN_NULL: + case IFN_UBSAN_BOUNDS: + case IFN_UBSAN_OBJECT_SIZE: + case IFN_ASAN_CHECK: + return false; + default: + break; + } base = ao_ref_base (ref); if (!base) -- 2.7.4