pub struct CallSiteValue<'ctx>(/* private fields */);Expand description
A value resulting from a function call. It may have function attributes applied to it.
This struct may be removed in the future in favor of an InstructionValue<CallSite> type.
Implementations§
Source§impl<'ctx> CallSiteValue<'ctx>
impl<'ctx> CallSiteValue<'ctx>
Sourcepub unsafe fn new(value: LLVMValueRef) -> Self
pub unsafe fn new(value: LLVMValueRef) -> Self
Sourcepub fn set_tail_call(self, tail_call: bool)
pub fn set_tail_call(self, tail_call: bool)
Sets whether or not this call is a tail call.
§Example
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.set_tail_call(true);Sourcepub fn is_tail_call(self) -> bool
pub fn is_tail_call(self) -> bool
Determines whether or not this call is a tail call.
§Example
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.set_tail_call(true);
assert!(call_site_value.is_tail_call());Sourcepub fn try_as_basic_value(self) -> ValueKind<'ctx>
pub fn try_as_basic_value(self) -> ValueKind<'ctx>
Try to convert this CallSiteValue to a BasicValueEnum if not a void return type.
§Example
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
assert!(call_site_value.try_as_basic_value().is_instruction());Sourcepub fn add_attribute(self, loc: AttributeLoc, attribute: Attribute)
pub fn add_attribute(self, loc: AttributeLoc, attribute: Attribute)
Adds an Attribute to this CallSiteValue.
§Example
use inkwell::attributes::AttributeLoc;
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let string_attribute = context.create_string_attribute("my_key", "my_val");
// Enum attribute cannot have non-zero value
let enum_attribute = context.create_enum_attribute(1, 0);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.add_attribute(AttributeLoc::Return, string_attribute);
call_site_value.add_attribute(AttributeLoc::Return, enum_attribute);Sourcepub fn get_called_fn_value(self) -> Option<FunctionValue<'ctx>>
pub fn get_called_fn_value(self) -> Option<FunctionValue<'ctx>>
Gets the FunctionValue this CallSiteValue is based on.
Returns None if the call this value bases on is indirect or the retrieved function
value doesn’t have the same type as the underlying call instruction.
§Example
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let string_attribute = context.create_string_attribute("my_key", "my_val");
// Enum attribute cannot have non-zero value
let enum_attribute = context.create_enum_attribute(1, 0);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
assert_eq!(call_site_value.get_called_fn_value(), Some(fn_value));Sourcepub fn get_called_fn_type(self) -> FunctionType<'ctx>
pub fn get_called_fn_type(self) -> FunctionType<'ctx>
Gets the type of the function called by the instruction this CallSiteValue is based on.
§Example
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let i32_type = context.i32_type();
let fn_type = i32_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
// Recursive call.
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
assert_eq!(call_site_value.get_called_fn_type(), fn_type);Sourcepub fn count_attributes(self, loc: AttributeLoc) -> u32
pub fn count_attributes(self, loc: AttributeLoc) -> u32
Counts the number of Attributes on this CallSiteValue at an index.
§Example
use inkwell::attributes::AttributeLoc;
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let string_attribute = context.create_string_attribute("my_key", "my_val");
// Enum attribute cannot have non-zero value
let enum_attribute = context.create_enum_attribute(1, 0);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.add_attribute(AttributeLoc::Return, string_attribute);
call_site_value.add_attribute(AttributeLoc::Return, enum_attribute);
assert_eq!(call_site_value.count_attributes(AttributeLoc::Return), 2);Sourcepub fn attributes(self, loc: AttributeLoc) -> Vec<Attribute>
pub fn attributes(self, loc: AttributeLoc) -> Vec<Attribute>
Get all Attributes on this CallSiteValue at an index.
§Example
use inkwell::attributes::AttributeLoc;
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let string_attribute = context.create_string_attribute("my_key", "my_val");
// Enum attribute cannot have non-zero value
let enum_attribute = context.create_enum_attribute(1, 0);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.add_attribute(AttributeLoc::Return, string_attribute);
call_site_value.add_attribute(AttributeLoc::Return, enum_attribute);
assert_eq!(call_site_value.attributes(AttributeLoc::Return), vec![ string_attribute, enum_attribute ]);Sourcepub fn get_enum_attribute(
self,
loc: AttributeLoc,
kind_id: u32,
) -> Option<Attribute>
pub fn get_enum_attribute( self, loc: AttributeLoc, kind_id: u32, ) -> Option<Attribute>
Gets an enum Attribute on this CallSiteValue at an index and kind id.
§Example
use inkwell::attributes::AttributeLoc;
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let string_attribute = context.create_string_attribute("my_key", "my_val");
// Enum attribute cannot have non-zero value
let enum_attribute = context.create_enum_attribute(1, 0);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.add_attribute(AttributeLoc::Return, string_attribute);
call_site_value.add_attribute(AttributeLoc::Return, enum_attribute);
assert_eq!(call_site_value.get_enum_attribute(AttributeLoc::Return, 1).unwrap(), enum_attribute);Sourcepub fn get_string_attribute(
self,
loc: AttributeLoc,
key: &str,
) -> Option<Attribute>
pub fn get_string_attribute( self, loc: AttributeLoc, key: &str, ) -> Option<Attribute>
Gets a string Attribute on this CallSiteValue at an index and key.
§Example
use inkwell::attributes::AttributeLoc;
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let string_attribute = context.create_string_attribute("my_key", "my_val");
// Enum attribute cannot have non-zero value
let enum_attribute = context.create_enum_attribute(1, 0);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.add_attribute(AttributeLoc::Return, string_attribute);
call_site_value.add_attribute(AttributeLoc::Return, enum_attribute);
assert_eq!(call_site_value.get_string_attribute(AttributeLoc::Return, "my_key").unwrap(), string_attribute);Sourcepub fn remove_enum_attribute(self, loc: AttributeLoc, kind_id: u32)
pub fn remove_enum_attribute(self, loc: AttributeLoc, kind_id: u32)
Removes an enum Attribute on this CallSiteValue at an index and kind id.
§Example
use inkwell::attributes::AttributeLoc;
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let string_attribute = context.create_string_attribute("my_key", "my_val");
// Enum attribute cannot have non-zero value
let enum_attribute = context.create_enum_attribute(1, 0);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.add_attribute(AttributeLoc::Return, string_attribute);
call_site_value.add_attribute(AttributeLoc::Return, enum_attribute);
call_site_value.remove_enum_attribute(AttributeLoc::Return, 1);
assert_eq!(call_site_value.get_enum_attribute(AttributeLoc::Return, 1), None);Sourcepub fn remove_string_attribute(self, loc: AttributeLoc, key: &str)
pub fn remove_string_attribute(self, loc: AttributeLoc, key: &str)
Removes a string Attribute on this CallSiteValue at an index and key.
§Example
use inkwell::attributes::AttributeLoc;
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let string_attribute = context.create_string_attribute("my_key", "my_val");
// Enum attribute cannot have non-zero value
let enum_attribute = context.create_enum_attribute(1, 0);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.add_attribute(AttributeLoc::Return, string_attribute);
call_site_value.add_attribute(AttributeLoc::Return, enum_attribute);
call_site_value.remove_string_attribute(AttributeLoc::Return, "my_key");
assert_eq!(call_site_value.get_string_attribute(AttributeLoc::Return, "my_key"), None);Sourcepub fn count_arguments(self) -> u32
pub fn count_arguments(self) -> u32
Counts the number of arguments this CallSiteValue was called with.
§Example
use inkwell::attributes::AttributeLoc;
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let string_attribute = context.create_string_attribute("my_key", "my_val");
// Enum attribute cannot have non-zero value
let enum_attribute = context.create_enum_attribute(1, 0);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
assert_eq!(call_site_value.count_arguments(), 0);Sourcepub fn get_call_convention(self) -> u32
pub fn get_call_convention(self) -> u32
Gets the calling convention for this CallSiteValue.
§Example
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
assert_eq!(call_site_value.get_call_convention(), 0);Sourcepub fn set_call_convention(self, conv: u32)
pub fn set_call_convention(self, conv: u32)
Sets the calling convention for this CallSiteValue.
§Example
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.set_call_convention(2);
assert_eq!(call_site_value.get_call_convention(), 2);Sourcepub fn set_alignment_attribute(self, loc: AttributeLoc, alignment: u32)
pub fn set_alignment_attribute(self, loc: AttributeLoc, alignment: u32)
Shortcut for setting the alignment Attribute for this CallSiteValue.
§Panics
When the alignment is not a power of 2.
§Example
use inkwell::attributes::AttributeLoc;
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_bb = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_bb);
let call_site_value = builder.build_call(fn_value, &[], "my_fn").unwrap();
call_site_value.set_alignment_attribute(AttributeLoc::Param(0), 2);Trait Implementations§
Source§impl<'ctx> AnyValue<'ctx> for CallSiteValue<'ctx>
impl<'ctx> AnyValue<'ctx> for CallSiteValue<'ctx>
Source§fn as_any_value_enum(&self) -> AnyValueEnum<'ctx>
fn as_any_value_enum(&self) -> AnyValueEnum<'ctx>
AnyValue.Source§fn print_to_string(&self) -> LLVMString
fn print_to_string(&self) -> LLVMString
LLVMStringSource§impl AsValueRef for CallSiteValue<'_>
impl AsValueRef for CallSiteValue<'_>
fn as_value_ref(&self) -> LLVMValueRef
Source§impl<'ctx> Clone for CallSiteValue<'ctx>
impl<'ctx> Clone for CallSiteValue<'ctx>
Source§fn clone(&self) -> CallSiteValue<'ctx>
fn clone(&self) -> CallSiteValue<'ctx>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more