Merge pull request #1834 from cfallin/module-translation-state-multivalue
Allow ModuleTranslationState to be constructed with signatures.
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
use crate::environ::{WasmError, WasmResult};
|
||||
use crate::translation_utils::SignatureIndex;
|
||||
use cranelift_codegen::ir::{types, Type};
|
||||
use cranelift_entity::PrimaryMap;
|
||||
use std::boxed::Box;
|
||||
use std::vec::Vec;
|
||||
|
||||
/// Map of signatures to a function's parameter and return types.
|
||||
pub(crate) type WasmTypes =
|
||||
@@ -21,6 +24,21 @@ pub struct ModuleTranslationState {
|
||||
pub(crate) wasm_types: WasmTypes,
|
||||
}
|
||||
|
||||
fn cranelift_to_wasmparser_type(ty: Type) -> WasmResult<wasmparser::Type> {
|
||||
Ok(match ty {
|
||||
types::I32 => wasmparser::Type::I32,
|
||||
types::I64 => wasmparser::Type::I64,
|
||||
types::F32 => wasmparser::Type::F32,
|
||||
types::F64 => wasmparser::Type::F64,
|
||||
_ => {
|
||||
return Err(WasmError::Unsupported(format!(
|
||||
"Cannot convert Cranelift type to Wasm signature: {:?}",
|
||||
ty
|
||||
)));
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
impl ModuleTranslationState {
|
||||
/// Creates a new empty ModuleTranslationState.
|
||||
pub fn new() -> Self {
|
||||
@@ -28,4 +46,24 @@ impl ModuleTranslationState {
|
||||
wasm_types: PrimaryMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a new ModuleTranslationState with the given function signatures,
|
||||
/// provided in terms of Cranelift types. The provided slice of signatures
|
||||
/// is indexed by signature number, and contains pairs of (args, results)
|
||||
/// slices.
|
||||
pub fn from_func_sigs(sigs: &[(&[Type], &[Type])]) -> WasmResult<Self> {
|
||||
let mut wasm_types = PrimaryMap::with_capacity(sigs.len());
|
||||
for &(ref args, ref results) in sigs {
|
||||
let args: Vec<wasmparser::Type> = args
|
||||
.iter()
|
||||
.map(|&ty| cranelift_to_wasmparser_type(ty))
|
||||
.collect::<Result<_, _>>()?;
|
||||
let results: Vec<wasmparser::Type> = results
|
||||
.iter()
|
||||
.map(|&ty| cranelift_to_wasmparser_type(ty))
|
||||
.collect::<Result<_, _>>()?;
|
||||
wasm_types.push((args.into_boxed_slice(), results.into_boxed_slice()));
|
||||
}
|
||||
Ok(Self { wasm_types })
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user