CodeMemory

Struct CodeMemory 

Source
pub struct CodeMemory { /* private fields */ }
Expand description

Management of executable memory within a MmapVec

This type consumes ownership of a region of memory and will manage the executable permissions of the contained JIT code as necessary.

Implementations§

Source§

impl CodeMemory

Source

pub fn new(engine: &Engine, mmap: MmapVec) -> Result<CodeMemory, Error>

Creates a new CodeMemory by taking ownership of the provided MmapVec.

The returned CodeMemory manages the internal MmapVec and the publish method is used to actually make the memory executable.

Source

pub fn mmap(&self) -> &MmapVec

Returns a reference to the underlying MmapVec this memory owns.

Source

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

Returns the contents of the text section of the ELF executable this represents.

Source

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

Returns the contents of the ELF_WASMTIME_DWARF section.

Source

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

Returns the data in the ELF_NAME_DATA section.

Source

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

Returns the concatenated list of all data associated with this wasm module.

This is used for initialization of memories and all data ranges stored in a Module are relative to the slice returned here.

Source

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

Returns the encoded address map section used to pass to wasmtime_environ::lookup_file_pos.

Source

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

Returns the encoded stack map section used to pass to wasmtime_environ::StackMap::lookup.

Source

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

Returns the encoded exception-tables section to pass to wasmtime_unwinder::ExceptionTable::parse.

Source

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

Returns the encoded frame-tables section to pass to wasmtime_environ::FrameTable::parse.

Source

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

Returns the contents of the ELF_WASMTIME_INFO section, or an empty slice if it wasn’t found.

Source

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

Returns the contents of the ELF_WASMTIME_TRAPS section, or an empty slice if it wasn’t found.

Source

pub fn publish(&mut self) -> Result<(), Error>

Publishes the internal ELF image to be ready for execution.

This method can only be when the image is not published (its default state) and will panic if called when already published. This will parse the ELF image from the original MmapVec and do everything necessary to get it ready for execution, including:

  • Change page protections from read/write to read/execute.
  • Register unwinding information with the OS
  • Register this image with the debugger if native DWARF is present

After this function executes all JIT code should be ready to execute.

The action may be reversed by calling [unpublish], as long as that method’s safety requirements are upheld.

Source

pub fn unpublish(&mut self) -> Result<(), Error>

“Unpublish” code memory (transition it from executable to read/writable).

This may be used to edit the code image, as long as the overall size of the memory remains the same. Note the hazards inherent in editing code that may have been executed: any stack frames with PC still active in this code must be suspended (e.g., called into a hostcall that is then invoking this method, or async-yielded) and any active PC values must point to valid instructions. Thus this is mostly useful for patching in-place at particular sites, such as by the use of Cranelift’s patchable_call instruction.

If this fails, then the memory remains executable.

Source

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

Return a mutable borrow to the code, suitable for editing.

Must not be published.

§Panics

This method panics if the code has been published (and not subsequently unpublished).

Source

pub fn lookup_trap_code(&self, text_offset: usize) -> Option<Trap>

Looks up the given offset within this module’s text section and returns the trap code associated with that instruction, if there is one.

Trait Implementations§

Source§

impl Drop for CodeMemory

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

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> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
§

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Pointee for T

Source§

type Pointer = u32

Source§

fn debug( pointer: <T as Pointee>::Pointer, f: &mut Formatter<'_>, ) -> Result<(), Error>

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

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.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more