From 36471293e60f5750ecc728c22ade04013e962929 Mon Sep 17 00:00:00 2001 From: Alexis Beingessner Date: Tue, 3 Oct 2017 19:49:45 -0400 Subject: [PATCH 1/2] Add -Zmutable-noalias flag --- src/librustc/session/config.rs | 2 ++ src/librustc_trans/abi.rs | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 7c1d457a6eeca..7e490dc49ca99 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1060,6 +1060,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "print the result of the translation item collection pass"), mir_opt_level: usize = (1, parse_uint, [TRACKED], "set the MIR optimization level (0-3, default: 1)"), + mutable_noalias: bool = (false, parse_bool, [UNTRACKED], + "emit noalias metadata for mutable references"), dump_mir: Option = (None, parse_opt_string, [UNTRACKED], "dump MIR state at various points in translation"), dump_mir_dir: Option = (None, parse_opt_string, [UNTRACKED], diff --git a/src/librustc_trans/abi.rs b/src/librustc_trans/abi.rs index 2aecc016a5cbd..5dc2e992972b8 100644 --- a/src/librustc_trans/abi.rs +++ b/src/librustc_trans/abi.rs @@ -760,7 +760,16 @@ impl<'a, 'tcx> FnType<'tcx> { // on memory dependencies rather than pointer equality let is_freeze = ccx.shared().type_is_freeze(mt.ty); - if mt.mutbl != hir::MutMutable && is_freeze { + let no_alias_is_safe = + if ccx.shared().tcx().sess.opts.debugging_opts.mutable_noalias { + // Mutable refrences or immutable shared references + mt.mutbl == hir::MutMutable || is_freeze + } else { + // Only immutable shared references + mt.mutbl != hir::MutMutable && is_freeze + }; + + if no_alias_is_safe { arg.attrs.set(ArgAttribute::NoAlias); } From a6dea41d64a244c8f7671dd0eeb498b015c3a712 Mon Sep 17 00:00:00 2001 From: Alexis Beingessner Date: Wed, 4 Oct 2017 17:29:37 -0400 Subject: [PATCH 2/2] Make -Cpanic=abort imply -Zmutable-noalias --- src/librustc_trans/abi.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/librustc_trans/abi.rs b/src/librustc_trans/abi.rs index 5dc2e992972b8..ee295bdf0b4c1 100644 --- a/src/librustc_trans/abi.rs +++ b/src/librustc_trans/abi.rs @@ -37,6 +37,7 @@ use type_of; use rustc::hir; use rustc::ty::{self, Ty}; use rustc::ty::layout::{self, Layout, LayoutTyper, TyLayout, Size}; +use rustc_back::PanicStrategy; use libc::c_uint; use std::cmp; @@ -761,7 +762,8 @@ impl<'a, 'tcx> FnType<'tcx> { let is_freeze = ccx.shared().type_is_freeze(mt.ty); let no_alias_is_safe = - if ccx.shared().tcx().sess.opts.debugging_opts.mutable_noalias { + if ccx.shared().tcx().sess.opts.debugging_opts.mutable_noalias || + ccx.shared().tcx().sess.panic_strategy() == PanicStrategy::Abort { // Mutable refrences or immutable shared references mt.mutbl == hir::MutMutable || is_freeze } else {