[−][src]Struct inkwell::values::BasicValueUse
A usage of a BasicValue
in an InstructionValue
.
Methods
impl BasicValueUse
[src]
pub fn get_next_use(&self) -> Option<Self>
[src]
Gets the next use of an InstructionValue
or BasicValue
if any.
The following example,
use inkwell::AddressSpace; use inkwell::context::Context; use inkwell::values::BasicValue; let context = Context::create(); let module = context.create_module("ivs"); let builder = context.create_builder(); let void_type = context.void_type(); let f32_type = context.f32_type(); let f32_ptr_type = f32_type.ptr_type(AddressSpace::Generic); let fn_type = void_type.fn_type(&[f32_ptr_type.into()], false); let function = module.add_function("take_f32_ptr", fn_type, None); let basic_block = context.append_basic_block(&function, "entry"); builder.position_at_end(&basic_block); let arg1 = function.get_first_param().unwrap().into_pointer_value(); let f32_val = f32_type.const_float(::std::f64::consts::PI); let store_instruction = builder.build_store(arg1, f32_val); let free_instruction = builder.build_free(arg1); let return_instruction = builder.build_return(None); let arg1_first_use = arg1.get_first_use().unwrap(); assert!(arg1_first_use.get_next_use().is_some());
will generate LLVM IR roughly like (varying slightly across LLVM versions):
; ModuleID = 'ivs'
source_filename = "ivs"
define void @take_f32_ptr(float* %0) {
entry:
store float 0x400921FB60000000, float* %0
%1 = bitcast float* %0 to i8*
tail call void @free(i8* %1)
ret void
}
declare void @free(i8*)
which makes the arg1 (%0) uses clear:
- In the store instruction
- In the pointer bitcast
pub fn get_user(&self) -> InstructionValue
[src]
Gets the user(an InstructionValue
) of this use.
use inkwell::AddressSpace; use inkwell::context::Context; use inkwell::values::BasicValue; let context = Context::create(); let module = context.create_module("ivs"); let builder = context.create_builder(); let void_type = context.void_type(); let f32_type = context.f32_type(); let f32_ptr_type = f32_type.ptr_type(AddressSpace::Generic); let fn_type = void_type.fn_type(&[f32_ptr_type.into()], false); let function = module.add_function("take_f32_ptr", fn_type, None); let basic_block = context.append_basic_block(&function, "entry"); builder.position_at_end(&basic_block); let arg1 = function.get_first_param().unwrap().into_pointer_value(); let f32_val = f32_type.const_float(::std::f64::consts::PI); let store_instruction = builder.build_store(arg1, f32_val); let free_instruction = builder.build_free(arg1); let return_instruction = builder.build_return(None); let store_operand_use0 = store_instruction.get_operand_use(0).unwrap(); let store_operand_use1 = store_instruction.get_operand_use(1).unwrap(); assert_eq!(store_operand_use0.get_user(), store_instruction); assert_eq!(store_operand_use1.get_user(), store_instruction);
pub fn get_used_value(&self) -> Either<BasicValueEnum, BasicBlock>
[src]
Gets the used value(a BasicValueEnum
or BasicBlock
) of this use.
use inkwell::AddressSpace; use inkwell::context::Context; use inkwell::values::BasicValue; let context = Context::create(); let module = context.create_module("ivs"); let builder = context.create_builder(); let void_type = context.void_type(); let f32_type = context.f32_type(); let f32_ptr_type = f32_type.ptr_type(AddressSpace::Generic); let fn_type = void_type.fn_type(&[f32_ptr_type.into()], false); let function = module.add_function("take_f32_ptr", fn_type, None); let basic_block = context.append_basic_block(&function, "entry"); builder.position_at_end(&basic_block); let arg1 = function.get_first_param().unwrap().into_pointer_value(); let f32_val = f32_type.const_float(::std::f64::consts::PI); let store_instruction = builder.build_store(arg1, f32_val); let free_instruction = builder.build_free(arg1); let return_instruction = builder.build_return(None); let free_operand0 = free_instruction.get_operand(0).unwrap().left().unwrap(); let free_operand0_instruction = free_operand0.as_instruction_value().unwrap(); let bitcast_use_value = free_operand0_instruction .get_first_use() .unwrap() .get_used_value() .left() .unwrap(); assert_eq!(bitcast_use_value, free_operand0);
Trait Implementations
impl Eq for BasicValueUse
[src]
impl Clone for BasicValueUse
[src]
fn clone(&self) -> BasicValueUse
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl PartialEq<BasicValueUse> for BasicValueUse
[src]
fn eq(&self, other: &BasicValueUse) -> bool
[src]
fn ne(&self, other: &BasicValueUse) -> bool
[src]
impl Copy for BasicValueUse
[src]
impl Debug for BasicValueUse
[src]
Auto Trait Implementations
impl !Sync for BasicValueUse
impl !Send for BasicValueUse
impl Unpin for BasicValueUse
impl UnwindSafe for BasicValueUse
impl RefUnwindSafe for BasicValueUse
Blanket Implementations
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T> From<T> for T
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
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>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
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>
[src]
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,