Struct cranelift_codegen::binemit::StackMap [−][src]
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 IncomingArg
s in the
callee’s stack map.
Implementations
impl StackMap
[src]
pub fn from_values(args: &[Value], func: &Function, isa: &dyn TargetIsa) -> Self
[src]
Create a StackMap
based on where references are located on a
function’s stack.
pub fn from_slice(vec: &[bool]) -> Self
[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]
impl Debug for StackMap
[src]
impl<'de> Deserialize<'de> for StackMap
[src]
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
[src]
__D: Deserializer<'de>,
impl Eq for StackMap
[src]
impl PartialEq<StackMap> for StackMap
[src]
impl Serialize for StackMap
[src]
fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error> where
__S: Serializer,
[src]
__S: Serializer,
impl StructuralEq for StackMap
[src]
impl StructuralPartialEq for StackMap
[src]
Auto Trait Implementations
impl RefUnwindSafe for StackMap
impl Send for StackMap
impl Sync for StackMap
impl Unpin for StackMap
impl UnwindSafe for StackMap
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> DeserializeOwned for T where
T: for<'de> Deserialize<'de>,
[src]
T: for<'de> Deserialize<'de>,
impl<Q, K> Equivalent<K> for Q where
K: Borrow<Q> + ?Sized,
Q: Eq + ?Sized,
[src]
K: Borrow<Q> + ?Sized,
Q: Eq + ?Sized,
pub fn equivalent(&self, key: &K) -> bool
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
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]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,