/// A trait which lets you opt into allocation-free unwinding. The two implementations of /// this trait are [`MustNotAllocateDuringUnwind`] and [`MayAllocateDuringUnwind`]. pubtrait AllocationPolicy { type GimliUnwindContextStorage<R: gimli::ReaderOffset>: gimli::UnwindContextStorage<R>; type GimliEvaluationStorage<R: gimli::Reader>: gimli::EvaluationStorage<R>;
}
/// Require allocation-free unwinding. This is one of the two [`AllocationPolicy`] /// implementations. /// /// Using this means that the unwinder cache takes up more memory, because it preallocates /// space for DWARF CFI unwind table row evaluation and for DWARF CFI expression evaluation. /// And because those preallocations are of a fixed size, it is possible that this fixed /// size is not large enough for certain DWARF unwinding tasks. pubstruct MustNotAllocateDuringUnwind;
/// This is only used in the implementation of [MustNotAllocateDuringUnwind] and /// is not intended to be used by the outside world. #[doc(hidden)] pubstruct StoreOnStack;
impl<RO: gimli::ReaderOffset> gimli::UnwindContextStorage<RO> for StoreOnStack { type Rules = [(gimli::Register, gimli::RegisterRule<RO>); 192]; type Stack = [gimli::UnwindTableRow<RO, Self>; 4];
}
impl<R: gimli::Reader> gimli::EvaluationStorage<R> for StoreOnStack { type Stack = [gimli::Value; 64]; type ExpressionStack = [(R, R); 4]; type Result = [gimli::Piece<R>; 1];
}
impl AllocationPolicy for MustNotAllocateDuringUnwind { type GimliUnwindContextStorage<R: gimli::ReaderOffset> = StoreOnStack; type GimliEvaluationStorage<R: gimli::Reader> = StoreOnStack;
}
/// Allow allocation during unwinding. This is one of the two [`AllocationPolicy`] /// implementations. /// /// This is the preferred policy because it saves memory and places no limitations on /// DWARF CFI evaluation. pubstruct MayAllocateDuringUnwind; impl AllocationPolicy for MayAllocateDuringUnwind { type GimliUnwindContextStorage<R: gimli::ReaderOffset> = gimli::StoreOnHeap; type GimliEvaluationStorage<R: gimli::Reader> = gimli::StoreOnHeap;
}
/// The unwinder cache. This needs to be created upfront before unwinding. During /// unwinding, the unwinder needs exclusive access to this cache. /// /// A single unwinder cache can be used with multiple unwinders alternatingly. /// /// The cache stores unwind rules for addresses it has seen before, and it stores the /// unwind context which gimli needs for DWARF CFI evaluation. pubstruct Cache<R: UnwindRule, P: AllocationPolicy = MayAllocateDuringUnwind> { pub(crate) gimli_unwind_context: Box<gimli::UnwindContext<usize, P::GimliUnwindContextStorage<usize>>>, pub(crate) rule_cache: RuleCache<R>,
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.