LabelUse

Enum LabelUse 

Source
pub enum LabelUse {
Show 13 variants X86JmpRel32, RVJal20, RVPCRel32, RVB12, RVPCRelHi20, RVPCRelLo12I, RVCJump, RVCB9, A64Branch14, A64Branch19, A64Branch26, A64Ldr19, A64Adr21,
}

Variants§

§

X86JmpRel32

§

RVJal20

20-bit branch offset (unconditional branches). PC-rel, offset is imm << 1. Immediate is 20 signed bits. Use in Jal instructions.

§

RVPCRel32

The unconditional jump instructions all use PC-relative addressing to help support position independent code. The JALR instruction was defined to enable a two-instruction sequence to jump anywhere in a 32-bit absolute address range. A LUI instruction can first load rs1 with the upper 20 bits of a target address, then JALR can add in the lower bits. Similarly, AUIPC then JALR can jump anywhere in a 32-bit pc-relative address range.

§

RVB12

All branch instructions use the B-type instruction format. The 12-bit B-immediate encodes signed offsets in multiples of 2, and is added to the current pc to give the target address. The conditional branch range is ±4 KiB.

§

RVPCRelHi20

Equivalent to the R_RISCV_PCREL_HI20 relocation, Allows setting the immediate field of an auipc instruction.

§

RVPCRelLo12I

Similar to the R_RISCV_PCREL_LO12_I relocation but pointing to the final address, instead of the PCREL_HI20 label. Allows setting the immediate field of I Type instructions such as addi or lw.

Since we currently don’t support offsets in labels, this relocation has an implicit offset of 4.

§

RVCJump

11-bit PC-relative jump offset. Equivalent to the RVC_JUMP relocation

§

RVCB9

9-bit PC-relative branch offset.

§

A64Branch14

14-bit branch offset (conditional branches). PC-rel, offset is imm << 2. Immediate is 14 signed bits, in bits 18:5. Used by tbz and tbnz.

§

A64Branch19

19-bit branch offset (conditional branches). PC-rel, offset is imm << 2. Immediate is 19 signed bits, in bits 23:5. Used by cbz, cbnz, b.cond.

§

A64Branch26

26-bit branch offset (unconditional branches). PC-rel, offset is imm << 2. Immediate is 26 signed bits, in bits 25:0. Used by b, bl.

§

A64Ldr19

§

A64Adr21

Implementations§

Source§

impl LabelUse

Source

pub const fn max_pos_range(self) -> CodeOffset

Maximum PC-relative range (positive), inclusive.

Source

pub const fn max_neg_range(self) -> CodeOffset

Source

pub const fn patch_size(&self) -> usize

Source

pub const fn align(&self) -> usize

Source

pub const fn supports_veneer(&self) -> bool

Source

pub const fn veneer_size(&self) -> usize

Source

pub fn generate_veneer( &self, buffer: &mut [u8], veneer_offset: CodeOffset, ) -> (CodeOffset, Self)

Source

pub fn patch( &self, buffer: &mut [u8], use_offset: CodeOffset, label_offset: CodeOffset, )

Trait Implementations§

Source§

impl Clone for LabelUse

Source§

fn clone(&self) -> LabelUse

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LabelUse

Source§

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

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

impl Ord for LabelUse

Source§

fn cmp(&self, other: &LabelUse) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for LabelUse

Source§

fn eq(&self, other: &LabelUse) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for LabelUse

Source§

fn partial_cmp(&self, other: &LabelUse) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Copy for LabelUse

Source§

impl Eq for LabelUse

Source§

impl StructuralPartialEq for LabelUse

Auto Trait Implementations§

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

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

fn clone_into(&self, target: &mut T)

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

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

Source§

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>,

Source§

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.