[][src]Enum rustc_middle::ty::instance::InstanceDef

pub enum InstanceDef<'tcx> {
    Item(WithOptConstParam<DefId>),
    Intrinsic(DefId),
    VtableShim(DefId),
    ReifyShim(DefId),
    FnPtrShim(DefIdTy<'tcx>),
    Virtual(DefIdusize),
    ClosureOnceShim {
        call_once: DefId,
    },
    DropGlue(DefIdOption<Ty<'tcx>>),
    CloneShim(DefIdTy<'tcx>),
}

Variants

Item(WithOptConstParam<DefId>)

A user-defined callable item.

This includes:

Intrinsic(DefId)

An intrinsic fn item (with "rust-intrinsic" or "platform-intrinsic" ABI).

Alongside Virtual, this is the only InstanceDef that does not have its own callable MIR. Instead, codegen and const eval "magically" evaluate calls to intrinsics purely in the caller.

VtableShim(DefId)

<T as Trait>::method where method receives unsizeable self: Self (part of the unsized_locals feature).

The generated shim will take Self via *mut Self - conceptually this is &owned Self - and dereference the argument to call the original function.

ReifyShim(DefId)

fn() pointer where the function itself cannot be turned into a pointer.

One example is <dyn Trait as Trait>::fn, where the shim contains a virtual call, which codegen supports only via a direct call to the <dyn Trait as Trait>::fn instance (an InstanceDef::Virtual).

Another example is functions annotated with #[track_caller], which must have their implicit caller location argument populated for a call. Because this is a required part of the function's ABI but can't be tracked as a property of the function pointer, we use a single "caller location" (the definition of the function itself).

FnPtrShim(DefIdTy<'tcx>)

<fn() as FnTrait>::call_* (generated FnTrait implementation for fn() pointers).

DefId is FnTrait::call_*.

Virtual(DefIdusize)

Dynamic dispatch to <dyn Trait as Trait>::fn.

This InstanceDef does not have callable MIR. Calls to Virtual instances must be codegen'd as virtual calls through the vtable.

If this is reified to a fn pointer, a ReifyShim is used (see ReifyShim above for more details on that).

ClosureOnceShim

<[FnMut closure] as FnOnce>::call_once.

The DefId is the ID of the call_once method in FnOnce.

Fields of ClosureOnceShim

call_once: DefId
DropGlue(DefIdOption<Ty<'tcx>>)

core::ptr::drop_in_place::<T>.

The DefId is for core::ptr::drop_in_place. The Option<Ty<'tcx>> is either Some(T), or None for empty drop glue.

CloneShim(DefIdTy<'tcx>)

Compiler-generated <T as Clone>::clone implementation.

For all types that automatically implement Copy, a trivial Clone impl is provided too. Additionally, arrays, tuples, and closures get a Clone shim even if they aren't Copy.

The DefId is for Clone::clone, the Ty is the type T with the builtin Clone impl.

Implementations

impl<'tcx> InstanceDef<'tcx>[src]

pub fn def_id(self) -> DefId[src]

pub fn with_opt_param(self) -> WithOptConstParam<DefId>[src]

pub fn attrs(&self, tcx: TyCtxt<'tcx>) -> Attributes<'tcx>[src]

pub fn requires_inline(&self, tcx: TyCtxt<'tcx>) -> bool[src]

Returns true if the LLVM version of this instance is unconditionally marked with inline. This implies that a copy of this instance is generated in every codegen unit. Note that this is only a hint. See the documentation for generates_cgu_internal_copy for more information.

pub fn generates_cgu_internal_copy(&self, tcx: TyCtxt<'tcx>) -> bool[src]

Returns true if the machine code for this instance is instantiated in each codegen unit that references it. Note that this is only a hint! The compiler can globally decide to not do this in order to speed up compilation. CGU-internal copies are only exist to enable inlining. If inlining is not performed (e.g. at -Copt-level=0) then the time for generating them is wasted and it's better to create a single copy with external linkage.

pub fn requires_caller_location(&self, tcx: TyCtxt<'_>) -> bool[src]

pub fn has_polymorphic_mir_body(&self) -> bool[src]

Returns true when the MIR body associated with this instance should be monomorphized by its users (e.g. codegen or miri) by substituting the substs from Instance (see Instance::substs_for_mir_body).

Otherwise, returns false only for some kinds of shims where the construction of the MIR body should perform necessary substitutions.

Trait Implementations

impl<'tcx> Clone for InstanceDef<'tcx>[src]

impl<'tcx> Copy for InstanceDef<'tcx>[src]

impl<'tcx> Debug for InstanceDef<'tcx>[src]

impl<'tcx, __D: TyDecoder<'tcx>> Decodable<__D> for InstanceDef<'tcx>[src]

impl<'tcx, __E: TyEncoder<'tcx>> Encodable<__E> for InstanceDef<'tcx>[src]

impl<'tcx> Eq for InstanceDef<'tcx>[src]

impl<'tcx> Hash for InstanceDef<'tcx>[src]

impl<'tcx, '__ctx> HashStable<StableHashingContext<'__ctx>> for InstanceDef<'tcx>[src]

impl<'tcx> Key for InstanceDef<'tcx>[src]

type CacheSelector = DefaultCacheSelector

impl<'a, 'tcx> Lift<'tcx> for InstanceDef<'a>[src]

type Lifted = InstanceDef<'tcx>

impl<'tcx> Ord for InstanceDef<'tcx>[src]

impl<'tcx> PartialEq<InstanceDef<'tcx>> for InstanceDef<'tcx>[src]

impl<'tcx> PartialOrd<InstanceDef<'tcx>> for InstanceDef<'tcx>[src]

impl<'tcx> StructuralEq for InstanceDef<'tcx>[src]

impl<'tcx> StructuralPartialEq for InstanceDef<'tcx>[src]

impl<'tcx> TypeFoldable<'tcx> for InstanceDef<'tcx>[src]

Auto Trait Implementations

impl<'tcx> !RefUnwindSafe for InstanceDef<'tcx>

impl<'tcx> !Send for InstanceDef<'tcx>

impl<'tcx> !Sync for InstanceDef<'tcx>

impl<'tcx> Unpin for InstanceDef<'tcx>

impl<'tcx> !UnwindSafe for InstanceDef<'tcx>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<'tcx, T> ArenaAllocatable<'tcx, ()> for T where
    T: Copy
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<'a, T> Captures<'a> for T where
    T: ?Sized
[src]

impl<Ctxt, T> DepNodeParams<Ctxt> for T where
    Ctxt: DepContext,
    T: HashStable<<Ctxt as DepContext>::StableHashingContext> + Debug
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> MaybeResult<T> for T[src]

type Error = !

impl<'tcx, T> Subst<'tcx> for T where
    T: TypeFoldable<'tcx>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<T> WithConstness for T[src]