diff options
| author | bors <bors@rust-lang.org> | 2018-11-15 01:12:01 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-11-15 01:12:01 +0000 |
| commit | 4ec0ba9545f7c848aafc0bc1b8762507395edd41 (patch) | |
| tree | f4ba507ff41add222bcb5d2d34c25cef07817630 /src/librustc | |
| parent | 7d3b9b1640611c52eb949dd60e8b9565997c6cea (diff) | |
| parent | b891a81164e86fa21f55607bc56b0b8e04083936 (diff) | |
| download | rust-4ec0ba9545f7c848aafc0bc1b8762507395edd41.tar.gz rust-4ec0ba9545f7c848aafc0bc1b8762507395edd41.zip | |
Auto merge of #55716 - RalfJung:escape-to-raw, r=oli-obk
Add escape-to-raw MIR statement Add a new MIR "ghost state statement": Escaping a ptr to permit raw accesses. ~~This includes #55549, [click here](https://github.com/RalfJung/rust/compare/miri-visitor...RalfJung:escape-to-raw) for just the new commits.~~
Diffstat (limited to 'src/librustc')
| -rw-r--r-- | src/librustc/ich/impls_mir.rs | 3 | ||||
| -rw-r--r-- | src/librustc/mir/mod.rs | 9 | ||||
| -rw-r--r-- | src/librustc/mir/visit.rs | 5 |
3 files changed, 16 insertions, 1 deletions
diff --git a/src/librustc/ich/impls_mir.rs b/src/librustc/ich/impls_mir.rs index c42c19e82c7..d6ad74f16a9 100644 --- a/src/librustc/ich/impls_mir.rs +++ b/src/librustc/ich/impls_mir.rs @@ -220,6 +220,9 @@ for mir::StatementKind<'gcx> { mir::StatementKind::EndRegion(ref region_scope) => { region_scope.hash_stable(hcx, hasher); } + mir::StatementKind::EscapeToRaw(ref place) => { + place.hash_stable(hcx, hasher); + } mir::StatementKind::Retag { fn_entry, ref place } => { fn_entry.hash_stable(hcx, hasher); place.hash_stable(hcx, hasher); diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 548d0e0c790..d8e45c881f5 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -1782,6 +1782,13 @@ pub enum StatementKind<'tcx> { place: Place<'tcx>, }, + /// Escape the given reference to a raw pointer, so that it can be accessed + /// without precise provenance tracking. These statements are currently only interpreted + /// by miri and only generated when "-Z mir-emit-retag" is passed. + /// See <https://internals.rust-lang.org/t/stacked-borrows-an-aliasing-model-for-rust/8153/> + /// for more details. + EscapeToRaw(Operand<'tcx>), + /// Mark one terminating point of a region scope (i.e. static region). /// (The starting point(s) arise implicitly from borrows.) EndRegion(region::Scope), @@ -1843,6 +1850,7 @@ impl<'tcx> Debug for Statement<'tcx> { EndRegion(ref ce) => write!(fmt, "EndRegion({})", ty::ReScope(*ce)), Retag { fn_entry, ref place } => write!(fmt, "Retag({}{:?})", if fn_entry { "[fn entry] " } else { "" }, place), + EscapeToRaw(ref place) => write!(fmt, "EscapeToRaw({:?})", place), StorageLive(ref place) => write!(fmt, "StorageLive({:?})", place), StorageDead(ref place) => write!(fmt, "StorageDead({:?})", place), SetDiscriminant { @@ -3019,6 +3027,7 @@ EnumTypeFoldableImpl! { (StatementKind::StorageDead)(a), (StatementKind::InlineAsm) { asm, outputs, inputs }, (StatementKind::Retag) { fn_entry, place }, + (StatementKind::EscapeToRaw)(place), (StatementKind::EndRegion)(a), (StatementKind::AscribeUserType)(a, v, b), (StatementKind::Nop), diff --git a/src/librustc/mir/visit.rs b/src/librustc/mir/visit.rs index c130e047e47..2a994ee0509 100644 --- a/src/librustc/mir/visit.rs +++ b/src/librustc/mir/visit.rs @@ -385,6 +385,9 @@ macro_rules! make_mir_visitor { location ); } + StatementKind::EscapeToRaw(ref $($mutability)* op) => { + self.visit_operand(op, location); + } StatementKind::StorageLive(ref $($mutability)* local) => { self.visit_local( local, @@ -1022,7 +1025,7 @@ pub enum MutatingUseContext<'tcx> { /// f(&mut x.y); /// Projection, - /// Retagging (updating the "Stacked Borrows" tag) + /// Retagging, a "Stacked Borrows" shadow state operation Retag, } |
