lemonlang 0.0.3

an experimental, modern, purely safe, programming language.
use inkwell::{types::StructType, values::IntValue, AddressSpace};

use crate::report::throw_llvm_error;

use super::Llvm;
impl<'ll> Llvm<'ll> {
	pub fn calculate_struct_size(&mut self, struct_type: StructType<'ll>) -> IntValue<'ll> {
		let i32_type = self.ctx.i32_type();
		let i64_type = self.ctx.i64_type();
		let address = self.ctx.ptr_type(AddressSpace::default());
		let null_ptr = address.const_null();

		let size_register = self.stack.temp_register();
		let i32_one = i32_type.const_int(1, false);

		#[rustfmt::skip]
		let size_ptr = unsafe {
			self.builder.build_gep(struct_type, null_ptr, &[i32_one], &size_register)
			.unwrap_or_else(|_| {
					throw_llvm_error("failed to calculate struct size using gep")
				})
		};

		let size_register = self.stack.temp_register();

		#[rustfmt::skip]
		let size = self.builder.build_ptr_to_int(size_ptr, i64_type, &size_register).unwrap_or_else(|_| {
			throw_llvm_error("failed to cast pointer size")
		});

		size
	}
}