diff --git a/crates/llvm-context/src/eravm/context/mod.rs b/crates/llvm-context/src/eravm/context/mod.rs index e73955c..edd814e 100644 --- a/crates/llvm-context/src/eravm/context/mod.rs +++ b/crates/llvm-context/src/eravm/context/mod.rs @@ -662,7 +662,10 @@ where ) -> anyhow::Result> { match pointer.address_space { AddressSpace::Heap => { - let heap_pointer = self.get_global(crate::eravm::GLOBAL_HEAP_MEMORY_POINTER)?; + let heap_pointer = self + .get_global(crate::eravm::GLOBAL_HEAP_MEMORY_POINTER)? + .value + .as_pointer_value(); // TODO: Ensure safe casts somehow let offset = self.builder().build_ptr_to_int( @@ -670,17 +673,15 @@ where self.integer_type(32), "offset_ptrtoint", )?; - let pointer_value = unsafe { - self.builder.build_gep( - self.byte_type(), - heap_pointer.value.as_pointer_value(), - &[offset], - "heap_offset_via_gep", - ) - }?; + let pointer_value = self.build_gep( + Pointer::new(self.byte_type(), AddressSpace::Stack, heap_pointer), + &[offset], + self.byte_type(), + "heap_offset_via_gep", + ); let value = self .builder() - .build_load(pointer.r#type, pointer_value, name)?; + .build_load(pointer.r#type, pointer_value.value, name)?; self.basic_block() .get_last_instruction() .expect("Always exists") @@ -786,7 +787,9 @@ where AddressSpace::Heap => { let heap_pointer = self .get_global(crate::eravm::GLOBAL_HEAP_MEMORY_POINTER) - .unwrap(); + .unwrap() + .value + .as_pointer_value(); // TODO: Ensure safe casts somehow let offset = self.builder().build_ptr_to_int( @@ -794,20 +797,19 @@ where self.integer_type(32), "offset_ptrtoint", )?; - let pointer_value = unsafe { - self.builder() - .build_gep( - self.byte_type(), - heap_pointer.value.as_pointer_value(), - &[offset], - "heap_offset_via_gep", - ) - .unwrap() - }; + let pointer_value = self.build_gep( + Pointer::new(self.byte_type(), AddressSpace::Stack, heap_pointer), + &[offset], + self.byte_type(), + "heap_offset_via_gep", + ); let value = self.build_byte_swap(value.as_basic_value_enum()); - let instruction = self.builder.build_store(pointer_value, value).unwrap(); + let instruction = self + .builder + .build_store(pointer_value.value, value) + .unwrap(); instruction .set_alignment(era_compiler_common::BYTE_LENGTH_BYTE as u32) .expect("Alignment is valid"); @@ -909,10 +911,7 @@ where T: BasicType<'ctx>, { assert_ne!(pointer.address_space, AddressSpace::Storage); - assert_ne!(pointer.address_space, AddressSpace::Heap); - assert_ne!(pointer.address_space, AddressSpace::HeapAuxiliary); assert_ne!(pointer.address_space, AddressSpace::TransientStorage); - assert_ne!(pointer.address_space, AddressSpace::Code); let value = unsafe { self.builder @@ -1213,20 +1212,21 @@ where // zkevm_opcode_defs::RetForwardPageType::UseHeap //}; - let heap_pointer = self.get_global(crate::eravm::GLOBAL_HEAP_MEMORY_POINTER)?; + let heap_pointer = self + .get_global(crate::eravm::GLOBAL_HEAP_MEMORY_POINTER)? + .value + .as_pointer_value(); let offset_truncated = self.safe_truncate_int_to_i32(offset)?; - let offset_into_heap = unsafe { - self.builder().build_gep( - self.byte_type(), - heap_pointer.value.as_pointer_value(), - &[offset_truncated], - "heap_offset_via_gep", - ) - }?; + let offset_into_heap = self.build_gep( + Pointer::new(self.byte_type(), AddressSpace::Stack, heap_pointer), + &[offset_truncated], + self.byte_type(), + "heap_offset_via_gep", + ); let length_pointer = self.safe_truncate_int_to_i32(length)?; let offset_pointer = self.builder().build_ptr_to_int( - offset_into_heap, + offset_into_heap.value, self.integer_type(32), "return_data_ptr_to_int", )?; diff --git a/crates/llvm-context/src/eravm/evm/calldata.rs b/crates/llvm-context/src/eravm/evm/calldata.rs index 2117b5c..392d0b7 100644 --- a/crates/llvm-context/src/eravm/evm/calldata.rs +++ b/crates/llvm-context/src/eravm/evm/calldata.rs @@ -63,32 +63,28 @@ where .get_global(crate::eravm::GLOBAL_HEAP_MEMORY_POINTER)? .value .as_pointer_value(); - let destination = unsafe { - context.builder().build_gep( - context.byte_type(), - heap_pointer, - &[destination_offset], - "calldata_pointer_with_offset", - ) - }?; + let destination = context.build_gep( + Pointer::new(context.byte_type(), AddressSpace::Stack, heap_pointer), + &[context.safe_truncate_int_to_i32(destination_offset)?], + context.byte_type(), + "heap_pointer_with_offset", + ); let calldata_pointer = context .get_global(crate::eravm::GLOBAL_CALLDATA_POINTER)? .value .as_pointer_value(); - let source = unsafe { - context.builder().build_gep( - context.byte_type(), - calldata_pointer, - &[source_offset], - "calldata_pointer_with_offset", - ) - }?; + let source = context.build_gep( + Pointer::new(context.byte_type(), AddressSpace::Stack, calldata_pointer), + &[context.safe_truncate_int_to_i32(source_offset)?], + context.byte_type(), + "calldata_pointer_with_offset", + ); context.build_memcpy( context.intrinsics().memory_copy_from_generic, - Pointer::new(context.byte_type(), AddressSpace::Stack, destination), - Pointer::new(context.byte_type(), AddressSpace::Stack, source), + destination, + source, size, "calldata_copy_memcpy_from_child", )