pub(crate) struct AddMovesForPackedDrops;Expand description
This pass moves values being dropped that are within a packed struct to a separate local before dropping them, to ensure that they are dropped from an aligned address.
For example, if we have something like
#[repr(packed)]
struct Foo {
dealign: u8,
data: Vec<u8>
}
let foo = ...;We want to call drop_glue::<Vec<u8>> with a reference to data, which must be aligned.
This means we can’t simply drop foo.data directly, because its address is not aligned.
Instead, we move foo.data to a local and drop that:
storage.live(drop_temp)
drop_temp = foo.data;
drop(drop_temp) -> next
next:
storage.dead(drop_temp)The storage instructions are required to avoid stack space blowup.
Trait Implementations§
Source§impl<'tcx> MirPass<'tcx> for AddMovesForPackedDrops
impl<'tcx> MirPass<'tcx> for AddMovesForPackedDrops
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)
Source§fn policy(&self, _sess: &Session) -> PassPolicy
fn policy(&self, _sess: &Session) -> PassPolicy
fn name(&self) -> &'static str
fn profiler_name(&self) -> &'static str
fn is_mir_dump_enabled(&self) -> bool
Auto Trait Implementations§
impl DynSend for AddMovesForPackedDrops
impl DynSync for AddMovesForPackedDrops
impl Freeze for AddMovesForPackedDrops
impl RefUnwindSafe for AddMovesForPackedDrops
impl Send for AddMovesForPackedDrops
impl Sync for AddMovesForPackedDrops
impl Unpin for AddMovesForPackedDrops
impl UnsafeUnpin for AddMovesForPackedDrops
impl UnwindSafe for AddMovesForPackedDrops
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<K> IntoQueryKey<K> for K
impl<K> IntoQueryKey<K> for K
Source§fn into_query_key(self) -> K
fn into_query_key(self) -> K
Self to K.
This should always be a very cheap conversion, e.g. LocalDefId::to_def_id.Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
Source§fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 0 bytes