Struct dynasmrt::Assembler

source ·
pub struct Assembler<R: Relocation> { /* private fields */ }
Expand description

A full assembler implementation. Supports labels, all types of relocations, incremental compilation and multithreaded execution with simultaneous compilation. Its implementation guarantees no memory is executable and writable at the same time.

Implementations§

source§

impl<R: Relocation> Assembler<R>

source

pub fn new() -> Result<Self>

Create a new, empty assembler, with initial allocation size page_size.

source

pub fn new_dynamic_label(&mut self) -> DynamicLabel

Create a new dynamic label ID

source

pub fn alter_uncommitted(&mut self) -> UncommittedModifier<'_>

Use an UncommittedModifier to alter uncommitted code. This does not allow the user to change labels/relocations.

source

pub fn alter<F, O>(&mut self, f: F) -> Result<O, DynasmError>
where F: FnOnce(&mut Modifier<'_, R>) -> O,

Use a Modifier to alter committed code directly. While this is happening no code can be executed as the relevant pages are remapped as writable. This API supports defining new labels/relocations, and overwriting previously defined relocations.

source

pub fn commit(&mut self) -> Result<(), DynasmError>

Commit code, flushing the temporary internal assembling buffer to the mapped executable memory. This makes assembled code available for execution.

source

pub fn finalize(self) -> Result<ExecutableBuffer, Self>

Finalize this assembler, returning the internal ExecutableBuffer if no Executor instances exist. This panics if any uncommitted changes caused errors near the end. To handle these, call commit() explicitly beforehand.

source

pub fn reader(&self) -> Executor

Create an executor which can be used to execute code while still assembling code

source

pub fn labels(&self) -> &LabelRegistry

Provides access to the assemblers internal labels registry

source

pub fn labels_mut(&mut self) -> &mut LabelRegistry

Provides mutable access to the assemblers internal labels registry

Trait Implementations§

source§

impl<R: Debug + Relocation> Debug for Assembler<R>

source§

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

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

impl<R: Relocation> DynasmApi for Assembler<R>

source§

fn offset(&self) -> AssemblyOffset

Report the current offset into the assembling target
source§

fn push(&mut self, value: u8)

Push a byte into the assembling target
source§

fn align(&mut self, alignment: usize, with: u8)

Push filler until the assembling target end is aligned to the given alignment.
source§

fn push_i8(&mut self, value: i8)

Push a signed byte into the assembling target
source§

fn push_i16(&mut self, value: i16)

Push a signed word into the assembling target
source§

fn push_i32(&mut self, value: i32)

Push a signed doubleword into the assembling target
source§

fn push_i64(&mut self, value: i64)

Push a signed quadword into the assembling target
source§

fn push_u16(&mut self, value: u16)

Push an usigned word into the assembling target
source§

fn push_u32(&mut self, value: u32)

Push an usigned doubleword into the assembling target
source§

fn push_u64(&mut self, value: u64)

Push an usigned quadword into the assembling target
source§

fn runtime_error(&self, msg: &'static str) -> !

This function is called in when a runtime error has to be generated. It panics.
source§

impl<R: Relocation> DynasmLabelApi for Assembler<R>

§

type Relocation = R

The relocation info type this assembler uses.
source§

fn local_label(&mut self, name: &'static str)

Record the definition of a local label
source§

fn global_label(&mut self, name: &'static str)

Record the definition of a global label
source§

fn dynamic_label(&mut self, id: DynamicLabel)

Record the definition of a dynamic label
source§

fn global_relocation( &mut self, name: &'static str, target_offset: isize, field_offset: u8, ref_offset: u8, kind: R, )

Equivalent of global_reloc, but takes a non-encoded relocation
source§

fn dynamic_relocation( &mut self, id: DynamicLabel, target_offset: isize, field_offset: u8, ref_offset: u8, kind: R, )

Equivalent of dynamic_reloc, but takes a non-encoded relocation
source§

fn forward_relocation( &mut self, name: &'static str, target_offset: isize, field_offset: u8, ref_offset: u8, kind: R, )

Equivalent of forward_reloc, but takes a non-encoded relocation
source§

fn backward_relocation( &mut self, name: &'static str, target_offset: isize, field_offset: u8, ref_offset: u8, kind: R, )

Equivalent of backward_reloc, but takes a non-encoded relocation
source§

fn bare_relocation( &mut self, target: usize, field_offset: u8, ref_offset: u8, kind: R, )

Equivalent of bare_reloc, but takes a non-encoded relocation
source§

fn forward_reloc( &mut self, name: &'static str, target_offset: isize, field_offset: u8, ref_offset: u8, kind: <Self::Relocation as Relocation>::Encoding, )

Record a relocation spot for a forward reference to a local label
source§

fn backward_reloc( &mut self, name: &'static str, target_offset: isize, field_offset: u8, ref_offset: u8, kind: <Self::Relocation as Relocation>::Encoding, )

Record a relocation spot for a backward reference to a local label
source§

fn global_reloc( &mut self, name: &'static str, target_offset: isize, field_offset: u8, ref_offset: u8, kind: <Self::Relocation as Relocation>::Encoding, )

Record a relocation spot for a reference to a global label
source§

fn dynamic_reloc( &mut self, id: DynamicLabel, target_offset: isize, field_offset: u8, ref_offset: u8, kind: <Self::Relocation as Relocation>::Encoding, )

Record a relocation spot for a reference to a dynamic label
source§

fn bare_reloc( &mut self, target: usize, field_offset: u8, ref_offset: u8, kind: <Self::Relocation as Relocation>::Encoding, )

Record a relocation spot to an arbitrary target.
source§

impl<'a, R: Relocation> Extend<&'a u8> for Assembler<R>

source§

fn extend<T>(&mut self, iter: T)
where T: IntoIterator<Item = &'a u8>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
source§

impl<R: Relocation> Extend<u8> for Assembler<R>

source§

fn extend<T>(&mut self, iter: T)
where T: IntoIterator<Item = u8>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more

Auto Trait Implementations§

§

impl<R> Freeze for Assembler<R>

§

impl<R> RefUnwindSafe for Assembler<R>
where R: RefUnwindSafe,

§

impl<R> Send for Assembler<R>
where R: Send,

§

impl<R> Sync for Assembler<R>
where R: Sync,

§

impl<R> Unpin for Assembler<R>
where R: Unpin,

§

impl<R> UnwindSafe for Assembler<R>

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

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

source§

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, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

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

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

Performs the conversion.
source§

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

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

Performs the conversion.