use crate::error::CompileError;
use crate::function::Compilation;
use crate::lib::std::boxed::Box;
use crate::module::CompileModuleInfo;
use crate::target::Target;
use crate::FunctionBodyData;
use crate::ModuleTranslationState;
use crate::SectionIndex;
use unc_vm_types::entity::PrimaryMap;
use unc_vm_types::{Features, FunctionIndex, LocalFunctionIndex, SignatureIndex};
use wasmparser::{Validator, WasmFeatures};
pub trait CompilerConfig {
fn enable_pic(&mut self) {
}
fn enable_verifier(&mut self) {
}
#[deprecated(note = "Please use the canonicalize_nans instead")]
fn enable_nan_canonicalization(&mut self) {
}
fn canonicalize_nans(&mut self, _enable: bool) {
}
fn compiler(self: Box<Self>) -> Box<dyn Compiler>;
fn default_features_for_target(&self, _target: &Target) -> Features {
Features::default()
}
}
impl<T> From<T> for Box<dyn CompilerConfig + 'static>
where
T: CompilerConfig + 'static,
{
fn from(other: T) -> Self {
Box::new(other)
}
}
pub trait Compiler: Send {
fn validate_module<'data>(
&self,
features: &Features,
data: &'data [u8],
) -> Result<(), CompileError> {
let wasm_features = WasmFeatures {
bulk_memory: features.bulk_memory,
threads: features.threads,
reference_types: features.reference_types,
multi_value: features.multi_value,
simd: features.simd,
tail_call: features.tail_call,
multi_memory: features.multi_memory,
memory64: features.memory64,
exceptions: features.exceptions,
floats: true,
component_model: false,
extended_const: false,
mutable_global: features.mutable_global,
relaxed_simd: false,
saturating_float_to_int: features.saturating_float_to_int,
sign_extension: features.sign_extension,
memory_control: false,
};
let mut validator = Validator::new_with_features(wasm_features);
validator.validate_all(data).map_err(|e| CompileError::Validate(format!("{}", e)))?;
Ok(())
}
fn compile_module<'data, 'module>(
&self,
target: &Target,
module: &'module CompileModuleInfo,
function_body_inputs: PrimaryMap<LocalFunctionIndex, FunctionBodyData<'data>>,
tunables: &dyn unc_vm_vm::Tunables,
instrumentation: &finite_wasm::AnalysisOutcome,
) -> Result<Compilation, CompileError>;
fn experimental_native_compile_module<'data, 'module>(
&self,
_target: &Target,
_module: &'module CompileModuleInfo,
_module_translation: &ModuleTranslationState,
_function_body_inputs: &PrimaryMap<LocalFunctionIndex, FunctionBodyData<'data>>,
_symbol_registry: &dyn SymbolRegistry,
_unc_vm_metadata: &[u8],
) -> Option<Result<Vec<u8>, CompileError>> {
None
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Symbol {
LocalFunction(LocalFunctionIndex),
Section(SectionIndex),
FunctionCallTrampoline(SignatureIndex),
DynamicFunctionTrampoline(FunctionIndex),
}
pub trait SymbolRegistry: Send + Sync {
fn symbol_to_name(&self, symbol: Symbol) -> String;
fn name_to_symbol(&self, name: &str) -> Option<Symbol>;
}