pub struct EvmLlvmBuilder<'a, 'ctx> {
pub(crate) backend: &'a mut EvmLlvmBackend<'ctx>,
pub(crate) function: FunctionValue<'ctx>,
}
Expand description
The LLVM-based EVM bytecode compiler function builder.
Fields§
§backend: &'a mut EvmLlvmBackend<'ctx>
§function: FunctionValue<'ctx>
Implementations§
Source§impl<'ctx> EvmLlvmBuilder<'_, 'ctx>
impl<'ctx> EvmLlvmBuilder<'_, 'ctx>
pub(crate) fn extract_value( &mut self, value: BasicValueEnum<'ctx>, index: u32, name: &str, ) -> BasicValueEnum<'ctx>
pub(crate) fn memcpy_inner( &mut self, dst: BasicValueEnum<'ctx>, src: BasicValueEnum<'ctx>, len: BasicValueEnum<'ctx>, inline: bool, )
pub(crate) fn call_overflow_function( &mut self, name: &str, lhs: BasicValueEnum<'ctx>, rhs: BasicValueEnum<'ctx>, ) -> (BasicValueEnum<'ctx>, BasicValueEnum<'ctx>)
pub(crate) fn get_overflow_function( &mut self, name: &str, ty: BasicTypeEnum<'ctx>, ) -> FunctionValue<'ctx>
pub(crate) fn get_sat_function( &mut self, name: &str, ty: BasicTypeEnum<'ctx>, ) -> FunctionValue<'ctx>
pub(crate) fn get_or_add_function( &mut self, name: &str, mk_ty: impl FnOnce(&mut Self) -> FunctionType<'ctx>, ) -> FunctionValue<'ctx>
pub(crate) fn set_branch_weights( &self, inst: InstructionValue<'ctx>, weights: impl IntoIterator<Item = u32>, )
Methods from Deref<Target = EvmLlvmBackend<'ctx>>§
pub(crate) fn exec_engine(&self) -> &ExecutionEngine<'ctx>
pub(crate) fn fn_type( &self, ret: Option<BasicTypeEnum<'ctx>>, params: &[BasicTypeEnum<'ctx>], ) -> FunctionType<'ctx>
pub(crate) fn id_to_name(&self, id: u32) -> &str
pub(crate) fn clear_module(&mut self)
Trait Implementations§
Source§impl<'ctx> BackendTypes for EvmLlvmBuilder<'_, 'ctx>
impl<'ctx> BackendTypes for EvmLlvmBuilder<'_, 'ctx>
type Type = <EvmLlvmBackend<'ctx> as BackendTypes>::Type
type Value = <EvmLlvmBackend<'ctx> as BackendTypes>::Value
type StackSlot = <EvmLlvmBackend<'ctx> as BackendTypes>::StackSlot
type BasicBlock = <EvmLlvmBackend<'ctx> as BackendTypes>::BasicBlock
type Function = <EvmLlvmBackend<'ctx> as BackendTypes>::Function
Source§impl Builder for EvmLlvmBuilder<'_, '_>
impl Builder for EvmLlvmBuilder<'_, '_>
fn create_block(&mut self, name: &str) -> Self::BasicBlock
fn create_block_after( &mut self, after: Self::BasicBlock, name: &str, ) -> Self::BasicBlock
fn switch_to_block(&mut self, block: Self::BasicBlock)
fn seal_block(&mut self, block: Self::BasicBlock)
fn seal_all_blocks(&mut self)
fn set_current_block_cold(&mut self)
fn current_block(&mut self) -> Option<Self::BasicBlock>
fn block_addr(&mut self, block: Self::BasicBlock) -> Option<Self::Value>
fn add_comment_to_current_inst(&mut self, comment: &str)
fn fn_param(&mut self, index: usize) -> Self::Value
fn num_fn_params(&self) -> usize
fn bool_const(&mut self, value: bool) -> Self::Value
Source§fn iconst(&mut self, ty: Self::Type, value: i64) -> Self::Value
fn iconst(&mut self, ty: Self::Type, value: i64) -> Self::Value
Sign-extends negative values to
ty
.fn uconst(&mut self, ty: Self::Type, value: u64) -> Self::Value
fn iconst_256(&mut self, value: U256) -> Self::Value
fn str_const(&mut self, value: &str) -> Self::Value
fn nullptr(&mut self) -> Self::Value
fn new_stack_slot_raw(&mut self, ty: Self::Type, name: &str) -> Self::StackSlot
fn stack_load( &mut self, ty: Self::Type, slot: Self::StackSlot, name: &str, ) -> Self::Value
fn stack_store(&mut self, value: Self::Value, slot: Self::StackSlot)
fn stack_addr(&mut self, ty: Self::Type, slot: Self::StackSlot) -> Self::Value
fn load(&mut self, ty: Self::Type, ptr: Self::Value, name: &str) -> Self::Value
fn load_unaligned( &mut self, ty: Self::Type, ptr: Self::Value, name: &str, ) -> Self::Value
fn store(&mut self, value: Self::Value, ptr: Self::Value)
fn store_unaligned(&mut self, value: Self::Value, ptr: Self::Value)
fn nop(&mut self)
fn ret(&mut self, values: &[Self::Value])
fn icmp( &mut self, cond: IntCC, lhs: Self::Value, rhs: Self::Value, ) -> Self::Value
fn icmp_imm(&mut self, cond: IntCC, lhs: Self::Value, rhs: i64) -> Self::Value
fn is_null(&mut self, ptr: Self::Value) -> Self::Value
fn is_not_null(&mut self, ptr: Self::Value) -> Self::Value
fn br(&mut self, dest: Self::BasicBlock)
fn brif( &mut self, cond: Self::Value, then_block: Self::BasicBlock, else_block: Self::BasicBlock, )
fn brif_cold( &mut self, cond: Self::Value, then_block: Self::BasicBlock, else_block: Self::BasicBlock, then_is_cold: bool, )
fn switch( &mut self, index: Self::Value, default: Self::BasicBlock, targets: &[(u64, Self::BasicBlock)], default_is_cold: bool, )
fn br_indirect( &mut self, address: Self::Value, destinations: &[Self::BasicBlock], )
fn phi( &mut self, ty: Self::Type, incoming: &[(Self::Value, Self::BasicBlock)], ) -> Self::Value
fn select( &mut self, cond: Self::Value, then_value: Self::Value, else_value: Self::Value, ) -> Self::Value
fn lazy_select( &mut self, cond: Self::Value, ty: Self::Type, then_value: impl FnOnce(&mut Self) -> Self::Value, else_value: impl FnOnce(&mut Self) -> Self::Value, ) -> Self::Value
fn iadd(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn isub(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn imul(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn udiv(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn sdiv(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn urem(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn srem(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn iadd_imm(&mut self, lhs: Self::Value, rhs: i64) -> Self::Value
fn isub_imm(&mut self, lhs: Self::Value, rhs: i64) -> Self::Value
fn imul_imm(&mut self, lhs: Self::Value, rhs: i64) -> Self::Value
fn uadd_overflow( &mut self, lhs: Self::Value, rhs: Self::Value, ) -> (Self::Value, Self::Value)
fn usub_overflow( &mut self, lhs: Self::Value, rhs: Self::Value, ) -> (Self::Value, Self::Value)
fn uadd_sat(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn umax(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn umin(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn bswap(&mut self, value: Self::Value) -> Self::Value
fn bitor(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn bitand(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn bitxor(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn bitnot(&mut self, value: Self::Value) -> Self::Value
fn bitor_imm(&mut self, lhs: Self::Value, rhs: i64) -> Self::Value
fn bitand_imm(&mut self, lhs: Self::Value, rhs: i64) -> Self::Value
fn bitxor_imm(&mut self, lhs: Self::Value, rhs: i64) -> Self::Value
fn ishl(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn ushr(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn sshr(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value
fn zext(&mut self, ty: Self::Type, value: Self::Value) -> Self::Value
fn sext(&mut self, ty: Self::Type, value: Self::Value) -> Self::Value
fn ireduce(&mut self, to: Self::Type, value: Self::Value) -> Self::Value
fn gep( &mut self, elem_ty: Self::Type, ptr: Self::Value, indexes: &[Self::Value], name: &str, ) -> Self::Value
fn tail_call( &mut self, function: Self::Function, args: &[Self::Value], tail_call: TailCallKind, ) -> Option<Self::Value>
Source§fn is_compile_time_known(&mut self, value: Self::Value) -> Option<Self::Value>
fn is_compile_time_known(&mut self, value: Self::Value) -> Option<Self::Value>
Returns
Some(is_value_compile_time)
, or None
if unsupported.fn memcpy(&mut self, dst: Self::Value, src: Self::Value, len: Self::Value)
fn memcpy_inline(&mut self, dst: Self::Value, src: Self::Value, len: i64)
fn unreachable(&mut self)
fn get_or_build_function( &mut self, name: &str, params: &[Self::Type], ret: Option<Self::Type>, linkage: Linkage, build: impl FnOnce(&mut Self), ) -> Self::Function
fn get_function(&mut self, name: &str) -> Option<Self::Function>
fn get_printf_function(&mut self) -> Self::Function
Source§fn add_function(
&mut self,
name: &str,
params: &[Self::Type],
ret: Option<Self::Type>,
address: Option<usize>,
linkage: Linkage,
) -> Self::Function
fn add_function( &mut self, name: &str, params: &[Self::Type], ret: Option<Self::Type>, address: Option<usize>, linkage: Linkage, ) -> Self::Function
Adds a function to the module that’s located at
address
. Read moreSource§fn add_function_attribute(
&mut self,
function: Option<Self::Function>,
attribute: Attribute,
loc: FunctionAttributeLocation,
)
fn add_function_attribute( &mut self, function: Option<Self::Function>, attribute: Attribute, loc: FunctionAttributeLocation, )
Adds an attribute to a function, one of its parameters, or its return value. Read more
fn cstr_const(&mut self, value: &CStr) -> Self::Value
fn new_stack_slot(&mut self, ty: Self::Type, name: &str) -> Pointer<Self>
fn call( &mut self, function: Self::Function, args: &[Self::Value], ) -> Option<Self::Value>
Source§impl<'a, 'ctx> Debug for EvmLlvmBuilder<'a, 'ctx>
impl<'a, 'ctx> Debug for EvmLlvmBuilder<'a, 'ctx>
Source§impl<'ctx> Deref for EvmLlvmBuilder<'_, 'ctx>
impl<'ctx> Deref for EvmLlvmBuilder<'_, 'ctx>
Source§impl DerefMut for EvmLlvmBuilder<'_, '_>
impl DerefMut for EvmLlvmBuilder<'_, '_>
Source§impl TypeMethods for EvmLlvmBuilder<'_, '_>
impl TypeMethods for EvmLlvmBuilder<'_, '_>
Auto Trait Implementations§
impl<'a, 'ctx> Freeze for EvmLlvmBuilder<'a, 'ctx>
impl<'a, 'ctx> !RefUnwindSafe for EvmLlvmBuilder<'a, 'ctx>
impl<'a, 'ctx> !Send for EvmLlvmBuilder<'a, 'ctx>
impl<'a, 'ctx> !Sync for EvmLlvmBuilder<'a, 'ctx>
impl<'a, 'ctx> Unpin for EvmLlvmBuilder<'a, 'ctx>
impl<'a, 'ctx> !UnwindSafe for EvmLlvmBuilder<'a, 'ctx>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 16 bytes