mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-13 04:26:48 +00:00
Add flag to configure noalias
on Box<T>
To aid making an informed decision about the aliasing rules of box, give users an option to remove `noalias` from box.
This commit is contained in:
parent
9ed0bf9f2b
commit
7c900c9b45
@ -718,6 +718,7 @@ fn test_unstable_options_tracking_hash() {
|
||||
tracked!(asm_comments, true);
|
||||
tracked!(assume_incomplete_release, true);
|
||||
tracked!(binary_dep_depinfo, true);
|
||||
tracked!(box_noalias, Some(false));
|
||||
tracked!(
|
||||
branch_protection,
|
||||
Some(BranchProtection {
|
||||
|
@ -3266,7 +3266,12 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
|
||||
// this attribute doesn't make it UB for the pointed-to data to be undef.
|
||||
attrs.set(ArgAttribute::NoUndef);
|
||||
|
||||
// `Box` pointer parameters never alias because ownership is transferred
|
||||
// The aliasing rules for `Box<T>` are still not decided, but currently we emit
|
||||
// `noalias` for it. This can be turned off using an unstable flag.
|
||||
// See https://github.com/rust-lang/unsafe-code-guidelines/issues/326
|
||||
let noalias_for_box =
|
||||
self.tcx().sess.opts.unstable_opts.box_noalias.unwrap_or(true);
|
||||
|
||||
// `&mut` pointer parameters never alias other parameters,
|
||||
// or mutable global data
|
||||
//
|
||||
@ -3281,7 +3286,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
|
||||
// `-Zmutable-noalias` debugging option.
|
||||
let no_alias = match kind {
|
||||
PointerKind::Shared | PointerKind::UniqueBorrowed => false,
|
||||
PointerKind::UniqueOwned => true,
|
||||
PointerKind::UniqueOwned => noalias_for_box,
|
||||
PointerKind::Frozen => !is_return,
|
||||
};
|
||||
if no_alias {
|
||||
|
@ -1209,6 +1209,8 @@ options! {
|
||||
binary_dep_depinfo: bool = (false, parse_bool, [TRACKED],
|
||||
"include artifacts (sysroot, crate dependencies) used during compilation in dep-info \
|
||||
(default: no)"),
|
||||
box_noalias: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||
"emit noalias metadata for box (default: yes)"),
|
||||
branch_protection: Option<BranchProtection> = (None, parse_branch_protection, [TRACKED],
|
||||
"set options for branch target identification and pointer authentication on AArch64"),
|
||||
cf_protection: CFProtection = (CFProtection::None, parse_cfprotection, [TRACKED],
|
||||
|
8
src/test/codegen/noalias-box-off.rs
Normal file
8
src/test/codegen/noalias-box-off.rs
Normal file
@ -0,0 +1,8 @@
|
||||
// compile-flags: -O -Z box-noalias=no
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// CHECK-LABEL: @box_should_not_have_noalias_if_disabled(
|
||||
// CHECK-NOT: noalias
|
||||
#[no_mangle]
|
||||
pub fn box_should_not_have_noalias_if_disabled(_b: Box<u8>) {}
|
8
src/test/codegen/noalias-box.rs
Normal file
8
src/test/codegen/noalias-box.rs
Normal file
@ -0,0 +1,8 @@
|
||||
// compile-flags: -O
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// CHECK-LABEL: @box_should_have_noalias_by_default(
|
||||
// CHECK: noalias
|
||||
#[no_mangle]
|
||||
pub fn box_should_have_noalias_by_default(_b: Box<u8>) {}
|
@ -4,6 +4,7 @@
|
||||
-Z asm-comments=val -- generate comments into the assembly (may change behavior) (default: no)
|
||||
-Z assert-incr-state=val -- assert that the incremental cache is in given state: either `loaded` or `not-loaded`.
|
||||
-Z binary-dep-depinfo=val -- include artifacts (sysroot, crate dependencies) used during compilation in dep-info (default: no)
|
||||
-Z box-noalias=val -- emit noalias metadata for box (default: yes)
|
||||
-Z branch-protection=val -- set options for branch target identification and pointer authentication on AArch64
|
||||
-Z cf-protection=val -- instrument control-flow architecture protection
|
||||
-Z cgu-partitioning-strategy=val -- the codegen unit partitioning strategy to use
|
||||
|
Loading…
Reference in New Issue
Block a user