MachBufferFinalized

Struct MachBufferFinalized 

Source
pub struct MachBufferFinalized<T: CompilePhase> {
    pub unwind_info: SmallVec<[(CodeOffset, UnwindInst); 8]>,
    pub alignment: u32,
    pub nop_units: Vec<Vec<u8>>,
    /* private fields */
}
Expand description

A MachBuffer once emission is completed: holds generated code and records, without fixups. This allows the type to be independent of the backend.

Fields§

§unwind_info: SmallVec<[(CodeOffset, UnwindInst); 8]>

Any unwind info at a given location.

§alignment: u32

The required alignment of this buffer.

§nop_units: Vec<Vec<u8>>

The means by which to NOP out patchable call sites.

This allows a consumer of a MachBufferFinalized to disable patchable call sites (which are enabled by default) without specific knowledge of the target ISA.

Each entry is one form of nop, and these are required to be sorted in ascending-size order.

Implementations§

Source§

impl MachBufferFinalized<Stencil>

Source

pub fn apply_base_srcloc( self, base_srcloc: SourceLoc, ) -> MachBufferFinalized<Final>

Get a finalized machine buffer by applying the function’s base source location.

Source§

impl<T: CompilePhase> MachBufferFinalized<T>

Source

pub fn get_srclocs_sorted(&self) -> &[T::MachSrcLocType]

Get a list of source location mapping tuples in sorted-by-start-offset order.

Source

pub fn debug_tags(&self) -> impl Iterator<Item = MachBufferDebugTagList<'_>>

Get all debug tags, sorted by associated offset.

Source

pub fn total_size(&self) -> CodeOffset

Get the total required size for the code.

Source

pub fn stringify_code_bytes(&self) -> String

Return the code in this mach buffer as a hex string for testing purposes.

Source

pub fn data(&self) -> &[u8]

Get the code bytes.

Source

pub fn data_mut(&mut self) -> &mut [u8]

Get a mutable slice of the code bytes, allowing patching post-passes.

Source

pub fn relocs(&self) -> &[FinalizedMachReloc]

Get the list of external relocations for this code.

Source

pub fn traps(&self) -> &[MachTrap]

Get the list of trap records for this code.

Source

pub fn user_stack_maps(&self) -> &[(CodeOffset, u32, UserStackMap)]

Get the user stack map metadata for this code.

Source

pub fn take_user_stack_maps( &mut self, ) -> SmallVec<[(CodeOffset, u32, UserStackMap); 8]>

Take this buffer’s user strack map metadata.

Source

pub fn call_sites(&self) -> impl Iterator<Item = FinalizedMachCallSite<'_>> + '_

Get the list of call sites for this code, along with associated exception handlers.

Each item yielded by the returned iterator is a struct with:

  • The call site metadata record, with a ret_addr field directly accessible and denoting the offset of the return address into this buffer’s code.
  • The slice of pairs of exception tags and code offsets denoting exception-handler entry points associated with this call site.
Source

pub fn frame_layout(&self) -> Option<&MachBufferFrameLayout>

Get the frame layout, if known.

Source

pub fn patchable_call_sites( &self, ) -> impl Iterator<Item = &MachPatchableCallSite> + '_

Get the list of patchable call sites for this code.

Each location in the buffer contains the bytes for a call instruction to the specified target. If the call is to be patched out, the bytes in the region should be replaced with those given in the MachBufferFinalized::nop array, repeated as many times as necessary. (The length of the patchable region is guaranteed to be an integer multiple of that NOP unit size.)

Trait Implementations§

Source§

impl<T: Clone + CompilePhase> Clone for MachBufferFinalized<T>
where T::MachSrcLocType: Clone,

Source§

fn clone(&self) -> MachBufferFinalized<T>

Returns a duplicate of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Debug + CompilePhase> Debug for MachBufferFinalized<T>
where T::MachSrcLocType: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de, T: CompilePhase> Deserialize<'de> for MachBufferFinalized<T>

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<T: PartialEq + CompilePhase> PartialEq for MachBufferFinalized<T>
where T::MachSrcLocType: PartialEq,

Source§

fn eq(&self, other: &MachBufferFinalized<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T: CompilePhase> Serialize for MachBufferFinalized<T>

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl<T: CompilePhase> StructuralPartialEq for MachBufferFinalized<T>

Auto Trait Implementations§

§

impl<T> Freeze for MachBufferFinalized<T>
where <T as CompilePhase>::MachSrcLocType: Freeze,

§

impl<T> RefUnwindSafe for MachBufferFinalized<T>
where <T as CompilePhase>::MachSrcLocType: RefUnwindSafe,

§

impl<T> Send for MachBufferFinalized<T>
where <T as CompilePhase>::MachSrcLocType: Send,

§

impl<T> Sync for MachBufferFinalized<T>
where <T as CompilePhase>::MachSrcLocType: Sync,

§

impl<T> Unpin for MachBufferFinalized<T>
where <T as CompilePhase>::MachSrcLocType: Unpin,

§

impl<T> UnwindSafe for MachBufferFinalized<T>
where <T as CompilePhase>::MachSrcLocType: RefUnwindSafe + UnwindSafe,

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

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

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,