@@ -215,6 +215,31 @@ impl Builder {
215
215
PointerValue :: new ( value)
216
216
}
217
217
218
+ /// Builds an instruction which calculates the difference of two pointers.
219
+ ///
220
+ /// # Example
221
+ ///
222
+ /// ```no_run
223
+ /// use inkwell::context::Context;
224
+ /// use inkwell::AddressSpace;
225
+ ///
226
+ /// // Builds a function which diffs two pointers
227
+ /// let context = Context::create();
228
+ /// let module = context.create_module("ret");
229
+ /// let builder = context.create_builder();
230
+ /// let void_type = context.void_type();
231
+ /// let i32_type = context.i32_type();
232
+ /// let i32_ptr_type = i32_type.ptr_type(AddressSpace::Generic);
233
+ /// let fn_type = void_type.fn_type(&[i32_ptr_type.into(), i32_ptr_type.into()], false);
234
+ /// let fn_value = module.add_function("ret", fn_type, None);
235
+ /// let entry = fn_value.append_basic_block("entry");
236
+ /// let i32_ptr_param1 = fn_value.get_first_param().unwrap().into_pointer_value();
237
+ /// let i32_ptr_param2 = fn_value.get_nth_param(1).unwrap().into_pointer_value();
238
+ ///
239
+ /// builder.position_at_end(&entry);
240
+ /// builder.build_ptr_diff(i32_ptr_param1, i32_ptr_param2, "diff");
241
+ /// builder.build_return(None);
242
+ /// ```
218
243
pub fn build_ptr_diff ( & self , lhs_ptr : PointerValue , rhs_ptr : PointerValue , name : & str ) -> IntValue {
219
244
let c_string = CString :: new ( name) . expect ( "Conversion to CString failed unexpectedly" ) ;
220
245
@@ -240,6 +265,31 @@ impl Builder {
240
265
PhiValue :: new ( value)
241
266
}
242
267
268
+ /// Builds a store instruction. It allows you to store a value of type `T` in a pointer to a type `T`.
269
+ ///
270
+ /// # Example
271
+ ///
272
+ /// ```no_run
273
+ /// use inkwell::context::Context;
274
+ /// use inkwell::AddressSpace;
275
+ ///
276
+ /// // Builds a function which takes an i32 pointer and stores a 7 in it.
277
+ /// let context = Context::create();
278
+ /// let module = context.create_module("ret");
279
+ /// let builder = context.create_builder();
280
+ /// let void_type = context.void_type();
281
+ /// let i32_type = context.i32_type();
282
+ /// let i32_ptr_type = i32_type.ptr_type(AddressSpace::Generic);
283
+ /// let i32_seven = i32_type.const_int(7, false);
284
+ /// let fn_type = void_type.fn_type(&[i32_ptr_type.into()], false);
285
+ /// let fn_value = module.add_function("ret", fn_type, None);
286
+ /// let entry = fn_value.append_basic_block("entry");
287
+ /// let i32_ptr_param = fn_value.get_first_param().unwrap().into_pointer_value();
288
+ ///
289
+ /// builder.position_at_end(&entry);
290
+ /// builder.build_store(i32_ptr_param, i32_seven);
291
+ /// builder.build_return(None);
292
+ /// ```
243
293
pub fn build_store < V : BasicValue > ( & self , ptr : PointerValue , value : V ) -> InstructionValue {
244
294
let value = unsafe {
245
295
LLVMBuildStore ( self . builder , value. as_value_ref ( ) , ptr. as_value_ref ( ) )
@@ -248,6 +298,31 @@ impl Builder {
248
298
InstructionValue :: new ( value)
249
299
}
250
300
301
+ /// Builds a load instruction. It allows you to retrieve a value of type `T` from a pointer to a type `T`.
302
+ ///
303
+ /// # Example
304
+ ///
305
+ /// ```no_run
306
+ /// use inkwell::context::Context;
307
+ /// use inkwell::AddressSpace;
308
+ ///
309
+ /// // Builds a function which takes an i32 pointer and returns the pointed at i32.
310
+ /// let context = Context::create();
311
+ /// let module = context.create_module("ret");
312
+ /// let builder = context.create_builder();
313
+ /// let i32_type = context.i32_type();
314
+ /// let i32_ptr_type = i32_type.ptr_type(AddressSpace::Generic);
315
+ /// let fn_type = i32_type.fn_type(&[i32_ptr_type.into()], false);
316
+ /// let fn_value = module.add_function("ret", fn_type, None);
317
+ /// let entry = fn_value.append_basic_block("entry");
318
+ /// let i32_ptr_param = fn_value.get_first_param().unwrap().into_pointer_value();
319
+ ///
320
+ /// builder.position_at_end(&entry);
321
+ ///
322
+ /// let pointee = builder.build_load(i32_ptr_param, "load");
323
+ ///
324
+ /// builder.build_return(Some(&pointee));
325
+ /// ```
251
326
pub fn build_load ( & self , ptr : PointerValue , name : & str ) -> BasicValueEnum {
252
327
let c_string = CString :: new ( name) . expect ( "Conversion to CString failed unexpectedly" ) ;
253
328
0 commit comments