Struct wasmtime_environ::ir::StackMap[][src]

pub struct StackMap { /* fields omitted */ }
Expand description

Stack maps record which words in a stack frame contain live GC references at a given instruction pointer.

Logically, a set of stack maps for a function record a table of the form:

+---------------------+-------------------------------------------+
| Instruction Pointer | SP-Relative Offsets of Live GC References |
+---------------------+-------------------------------------------+
| 0x12345678          | 2, 6, 12                                  |
| 0x1234abcd          | 2, 6                                      |
| ...                 | ...                                       |
+---------------------+-------------------------------------------+

Where “instruction pointer” is an instruction pointer within the function, and “offsets of live GC references” contains the offsets (in units of words) from the frame’s stack pointer where live GC references are stored on the stack. Instruction pointers within the function that do not have an entry in this table are not GC safepoints.

Because

  • offsets of live GC references are relative from the stack pointer, and
  • stack frames grow down from higher addresses to lower addresses,

to get a pointer to a live reference at offset x within a stack frame, you add x from the frame’s stack pointer.

For example, to calculate the pointer to the live GC reference inside “frame 1” below, you would do frame_1_sp + x:

          Stack
        +-------------------+
        | Frame 0           |
        |                   |
   |    |                   |
   |    +-------------------+ <--- Frame 0's SP
   |    | Frame 1           |
 Grows  |                   |
 down   |                   |
   |    | Live GC reference | --+--
   |    |                   |   |
   |    |                   |   |
   V    |                   |   x = offset of live GC reference
        |                   |   |
        |                   |   |
        +-------------------+ --+--  <--- Frame 1's SP
        | Frame 2           |
        | ...               |

An individual StackMap is associated with just one instruction pointer within the function, contains the size of the stack frame, and represents the stack frame as a bitmap. There is one bit per word in the stack frame, and if the bit is set, then the word contains a live GC reference.

Note that a caller’s OutgoingArg stack slots and callee’s IncomingArg stack slots overlap, so we must choose which function’s stack maps record live GC references in these slots. We record the IncomingArgs in the callee’s stack map.

Implementations

impl StackMap[src]

pub fn from_values(
    args: &[Value],
    func: &Function,
    isa: &dyn TargetIsa
) -> StackMap
[src]

Create a StackMap based on where references are located on a function’s stack.

pub fn from_slice(vec: &[bool]) -> StackMap[src]

Create a vec of Bitsets from a slice of bools.

pub fn get_bit(&self, bit_index: usize) -> bool[src]

Returns a specified bit.

pub fn as_slice(&self) -> &[BitSet<u32>][src]

Returns the raw bitmap that represents this stack map.

pub fn mapped_words(&self) -> u32[src]

Returns the number of words represented by this stack map.

Trait Implementations

impl Clone for StackMap[src]

pub fn clone(&self) -> StackMap[src]

Returns a copy of the value. Read more

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl Debug for StackMap[src]

pub fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>[src]

Formats the value using the given formatter. Read more

impl<'de> Deserialize<'de> for StackMap[src]

pub fn deserialize<__D>(
    __deserializer: __D
) -> Result<StackMap, <__D as Deserializer<'de>>::Error> where
    __D: Deserializer<'de>, 
[src]

Deserialize this value from the given Serde deserializer. Read more

impl PartialEq<StackMap> for StackMap[src]

pub fn eq(&self, other: &StackMap) -> bool[src]

This method tests for self and other values to be equal, and is used by ==. Read more

pub fn ne(&self, other: &StackMap) -> bool[src]

This method tests for !=.

impl Serialize for StackMap[src]

pub fn serialize<__S>(
    &self,
    __serializer: __S
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error> where
    __S: Serializer
[src]

Serialize this value into the given Serde serializer. Read more

impl Eq for StackMap[src]

impl StructuralEq for StackMap[src]

impl StructuralPartialEq for StackMap[src]

Auto Trait Implementations

Blanket Implementations

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

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

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

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

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

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<Q, K> Equivalent<K> for Q where
    K: Borrow<Q> + ?Sized,
    Q: Eq + ?Sized
[src]

pub fn equivalent(&self, key: &K) -> bool[src]

Compare self to key and return true if they are equal.

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

pub fn from(t: T) -> T[src]

Performs the conversion.

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

pub fn into(self) -> U[src]

Performs the conversion.

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

type Owned = T

The resulting type after obtaining ownership.

pub fn to_owned(&self) -> T[src]

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

pub fn clone_into(&self, target: &mut T)[src]

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

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

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.

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

Performs the conversion.

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.

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

Performs the conversion.

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