implement calldatacopy

Signed-off-by: xermicus <cyrill@parity.io>
This commit is contained in:
xermicus
2024-03-19 10:49:47 +01:00
parent 6d058a42ed
commit 2b9e40225d
12 changed files with 210 additions and 43 deletions
+44 -4
View File
@@ -9,12 +9,52 @@ use crate::eravm::Dependency;
/// Translates the `sha3` instruction.
///
pub fn sha3<'ctx, D>(
_context: &mut Context<'ctx, D>,
_offset: inkwell::values::IntValue<'ctx>,
_length: inkwell::values::IntValue<'ctx>,
context: &mut Context<'ctx, D>,
offset: inkwell::values::IntValue<'ctx>,
length: inkwell::values::IntValue<'ctx>,
) -> anyhow::Result<inkwell::values::BasicValueEnum<'ctx>>
where
D: Dependency + Clone,
{
todo!()
let offset_casted = context.safe_truncate_int_to_i32(offset)?;
let heap_pointer = context.get_global(crate::eravm::GLOBAL_HEAP_MEMORY_POINTER)?;
let input_pointer = unsafe {
context.builder().build_gep(
context.byte_type(),
heap_pointer.value.as_pointer_value(),
&[offset_casted],
"heap_offset_via_gep",
)
}?;
let input_pointer_casted = context.builder().build_ptr_to_int(
input_pointer,
context.integer_type(32),
"input_pointer_casted",
)?;
let length_casted = context.safe_truncate_int_to_i32(length)?;
let output_pointer = context.build_alloca(context.field_type(), "output_pointer");
let output_pointer_casted = context.builder().build_ptr_to_int(
output_pointer.value,
context.integer_type(32),
"output_pointer_casted",
)?;
let function = context
.module()
.get_function("hash_keccak_256")
.expect("is declared");
context.builder().build_call(
function,
&[
input_pointer_casted.into(),
length_casted.into(),
output_pointer_casted.into(),
],
"call_seal_hash_keccak_256",
)?;
Ok(context.build_byte_swap(context.build_load(output_pointer, "sha3_output")?))
}