From cf4901f0a956bd596272c564db351c1f028ce70a Mon Sep 17 00:00:00 2001 From: xermicus Date: Thu, 18 Apr 2024 12:33:46 +0200 Subject: [PATCH] do not declare symbols that are already linked via the stdlib Signed-off-by: xermicus --- .../eravm/context/function/llvm_runtime.rs | 119 +++--------------- crates/llvm-context/src/eravm/context/mod.rs | 7 -- 2 files changed, 17 insertions(+), 109 deletions(-) diff --git a/crates/llvm-context/src/eravm/context/function/llvm_runtime.rs b/crates/llvm-context/src/eravm/context/function/llvm_runtime.rs index 82fc944..84264aa 100644 --- a/crates/llvm-context/src/eravm/context/function/llvm_runtime.rs +++ b/crates/llvm-context/src/eravm/context/function/llvm_runtime.rs @@ -5,7 +5,6 @@ use inkwell::types::BasicType; use crate::eravm::context::address_space::AddressSpace; -use crate::eravm::context::attribute::Attribute; use crate::eravm::context::function::declaration::Declaration as FunctionDeclaration; use crate::eravm::context::function::Function; use crate::optimizer::Optimizer; @@ -49,9 +48,6 @@ pub struct LLVMRuntime<'ctx> { /// The corresponding LLVM runtime function. pub sign_extend: FunctionDeclaration<'ctx>, - /// The corresponding LLVM runtime function. - pub mstore8: FunctionDeclaration<'ctx>, - /// The corresponding LLVM runtime function. pub sha3: FunctionDeclaration<'ctx>, @@ -127,9 +123,6 @@ impl<'ctx> LLVMRuntime<'ctx> { /// The corresponding runtime function name. pub const FUNCTION_SIGNEXTEND: &'static str = "__signextend"; - /// The corresponding runtime function name. - pub const FUNCTION_MSTORE8: &'static str = "__mstore8"; - /// The corresponding runtime function name. pub const FUNCTION_SHA3: &'static str = "__sha3"; @@ -350,111 +343,25 @@ impl<'ctx> LLVMRuntime<'ctx> { Function::set_default_attributes(llvm, byte, optimizer); Function::set_pure_function_attributes(llvm, byte); - let add_mod = Self::declare( - module, - Self::FUNCTION_ADDMOD, - llvm.custom_width_int_type(revive_common::BIT_LENGTH_FIELD as u32) - .fn_type( - vec![ - llvm.custom_width_int_type(revive_common::BIT_LENGTH_FIELD as u32) - .as_basic_type_enum() - .into(); - 3 - ] - .as_slice(), - false, - ), - Some(inkwell::module::Linkage::External), - ); + let add_mod = + Self::define(module, Self::FUNCTION_ADDMOD).expect("should be declared in stdlib"); Function::set_default_attributes(llvm, add_mod, optimizer); Function::set_pure_function_attributes(llvm, add_mod); - let mul_mod = Self::declare( - module, - Self::FUNCTION_MULMOD, - llvm.custom_width_int_type(revive_common::BIT_LENGTH_FIELD as u32) - .fn_type( - vec![ - llvm.custom_width_int_type(revive_common::BIT_LENGTH_FIELD as u32) - .as_basic_type_enum() - .into(); - 3 - ] - .as_slice(), - false, - ), - Some(inkwell::module::Linkage::External), - ); + let mul_mod = + Self::define(module, Self::FUNCTION_MULMOD).expect("should be declared in stdlib"); Function::set_default_attributes(llvm, mul_mod, optimizer); Function::set_pure_function_attributes(llvm, mul_mod); - let exp = Self::declare( - module, - Self::FUNCTION_EXP, - llvm.custom_width_int_type(revive_common::BIT_LENGTH_FIELD as u32) - .fn_type( - vec![ - llvm.custom_width_int_type(revive_common::BIT_LENGTH_FIELD as u32) - .as_basic_type_enum() - .into(); - 2 - ] - .as_slice(), - false, - ), - Some(inkwell::module::Linkage::External), - ); + let exp = Self::define(module, Self::FUNCTION_EXP).expect("should be declared in stdlib"); Function::set_default_attributes(llvm, exp, optimizer); Function::set_pure_function_attributes(llvm, exp); - let sign_extend = FunctionDeclaration::new( - llvm.custom_width_int_type(revive_common::BIT_LENGTH_FIELD as u32) - .fn_type( - vec![ - llvm.custom_width_int_type(revive_common::BIT_LENGTH_FIELD as u32) - .as_basic_type_enum() - .into(); - 2 - ] - .as_slice(), - false, - ), - module - .get_function(Self::FUNCTION_SIGNEXTEND) - .expect("should be declared in stdlib"), - ); + let sign_extend = + Self::define(module, Self::FUNCTION_SIGNEXTEND).expect("should be declared in stdlib"); Function::set_default_attributes(llvm, sign_extend, optimizer); Function::set_pure_function_attributes(llvm, sign_extend); - let mstore8 = Self::declare( - module, - Self::FUNCTION_MSTORE8, - llvm.void_type().fn_type( - vec![ - llvm.ptr_type(AddressSpace::Heap.into()) - .as_basic_type_enum() - .into(), - llvm.custom_width_int_type(revive_common::BIT_LENGTH_FIELD as u32) - .as_basic_type_enum() - .into(), - ] - .as_slice(), - false, - ), - Some(inkwell::module::Linkage::External), - ); - Function::set_default_attributes(llvm, mstore8, optimizer); - Function::set_attributes( - llvm, - mstore8, - vec![ - Attribute::MustProgress, - Attribute::NoUnwind, - Attribute::WillReturn, - ], - false, - ); - let sha3 = Self::declare( module, Self::FUNCTION_SHA3, @@ -676,8 +583,6 @@ impl<'ctx> LLVMRuntime<'ctx> { exp, sign_extend, - mstore8, - sha3, system_request, @@ -710,6 +615,16 @@ impl<'ctx> LLVMRuntime<'ctx> { FunctionDeclaration::new(r#type, value) } + /// Create the function definition from an existing symbol. + pub fn define( + module: &inkwell::module::Module<'ctx>, + name: &str, + ) -> Option> { + let value = module.get_function(name)?; + value.set_linkage(inkwell::module::Linkage::External); + FunctionDeclaration::new(value.get_type(), value).into() + } + /// /// Modifies the external call function with `is_byref` and `is_system` modifiers. /// diff --git a/crates/llvm-context/src/eravm/context/mod.rs b/crates/llvm-context/src/eravm/context/mod.rs index c0ab762..67c2724 100644 --- a/crates/llvm-context/src/eravm/context/mod.rs +++ b/crates/llvm-context/src/eravm/context/mod.rs @@ -1582,13 +1582,6 @@ where inkwell::attributes::AttributeLoc::Param(index as u32), self.llvm.create_enum_attribute(Attribute::NoFree as u32, 0), ); - if function == self.llvm_runtime().mstore8 { - call_site_value.add_attribute( - inkwell::attributes::AttributeLoc::Param(index as u32), - self.llvm - .create_enum_attribute(Attribute::WriteOnly as u32, 0), - ); - } if function == self.llvm_runtime().sha3 { call_site_value.add_attribute( inkwell::attributes::AttributeLoc::Param(index as u32),