mirror of
https://github.com/fluencelabs/wasmer
synced 2024-12-13 06:15:33 +00:00
Initial additional modules
This commit is contained in:
parent
ff45aea0ea
commit
fafb904875
@ -6,6 +6,8 @@ pub mod memory;
|
||||
pub mod module;
|
||||
pub mod relocation;
|
||||
pub mod utils;
|
||||
pub mod vmcontext;
|
||||
pub mod vmoffsets;
|
||||
|
||||
use cranelift_codegen::{
|
||||
isa,
|
||||
|
153
src/webassembly/vmcontext.rs
Normal file
153
src/webassembly/vmcontext.rs
Normal file
@ -0,0 +1,153 @@
|
||||
|
||||
use cranelift_wasm::{
|
||||
TableIndex, FuncIndex, MemoryIndex, GlobalIndex,
|
||||
DefinedTableIndex, DefinedFuncIndex, DefinedMemoryIndex, DefinedGlobalIndex,
|
||||
SignatureIndex,
|
||||
};
|
||||
use crate::webassembly::vmoffsets::VMOffsets;
|
||||
|
||||
#[repr(C)]
|
||||
pub struct VMContext {
|
||||
/// A pointer to an array of imported functions, indexed by `FuncIndex`.
|
||||
imported_functions: *const *const VMFunctionBody,
|
||||
|
||||
/// A pointer to an array of imported tables, indexed by `TableIndex`.
|
||||
imported_tables: *mut VMTableImport,
|
||||
|
||||
/// A pointer to an array of imported memories, indexed by `MemoryIndex,
|
||||
imported_memories: *mut VMMemoryImport,
|
||||
|
||||
/// A pointer to an array of imported globals, indexed by `GlobalIndex`.
|
||||
imported_globals: *mut VMGlobalImport,
|
||||
|
||||
/// A pointer to an array of locally-defined tables, indexed by `DefinedTableIndex`.
|
||||
tables: *mut VMTableDefinition,
|
||||
|
||||
/// A pointer to an array of locally-defined memories, indexed by `DefinedMemoryIndex`.
|
||||
memories: *mut VMMemoryDefinition,
|
||||
|
||||
/// A pointer to an array of locally-defined globals, indexed by ``DefinedGlobalIndex`.
|
||||
globals: *mut VMGlobalDefinition,
|
||||
|
||||
/// Signature identifiers for signature-checked indirect calls.
|
||||
signature_ids: *mut VMSharedSigIndex,
|
||||
}
|
||||
|
||||
/// Used to provide type safety for passing around function pointers.
|
||||
/// The typesystem ensures this cannot be dereferenced.
|
||||
pub enum VMFunctionBody { }
|
||||
|
||||
/// Definition of a table used by the VM. (obviously)
|
||||
#[repr(C)]
|
||||
pub struct VMTableDefinition {
|
||||
/// pointer to the elements in the table.
|
||||
pub base: *mut u8,
|
||||
/// Number of elements in the table (NOT necessarily the size of the table in bytes!).
|
||||
pub current_elements: usize,
|
||||
}
|
||||
|
||||
impl VMTableDefinition {
|
||||
pub fn offset_base(offsets: &VMOffsets) -> u8 {
|
||||
0 * offsets.ptr_size
|
||||
}
|
||||
|
||||
pub fn offset_current_elements(offsets: &VMOffsets) -> u8 {
|
||||
1 * offsets.ptr_size
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct VMTableImport {
|
||||
/// A pointer to the table definition.
|
||||
pub table: *mut VMTableDefinition,
|
||||
/// A pointer to the vmcontext that owns this table definition.
|
||||
pub vmctx: *mut VMContext,
|
||||
}
|
||||
|
||||
impl VMTableImport {
|
||||
pub fn offset_table(offsets: &VMOffsets) -> u8 {
|
||||
0 * offsets.ptr_size
|
||||
}
|
||||
|
||||
pub fn offset_vmctx(offsets: &VMOffsets) -> u8 {
|
||||
1 * offsets.ptr_size
|
||||
}
|
||||
}
|
||||
|
||||
/// Definition of a memory used by the VM.
|
||||
#[repr(C)]
|
||||
pub struct VMMemoryDefinition {
|
||||
/// Pointer to the bottom of linear memory.
|
||||
pub base: *mut u8,
|
||||
/// Current logical size of this linear memory in bytes.
|
||||
pub size: usize,
|
||||
}
|
||||
|
||||
impl VMMemoryDefinition {
|
||||
pub fn offset_base(offsets: &VMOffsets) -> u8 {
|
||||
0 * offsets.ptr_size
|
||||
}
|
||||
|
||||
pub fn offset_size(offsets: &VMOffsets) -> u8 {
|
||||
1 * offsets.ptr_size
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct VMMemoryImport {
|
||||
/// A pointer to the memory definition.
|
||||
pub memory: *mut VMMemoryDefinition,
|
||||
/// A pointer to the vmcontext that owns this memory definition.
|
||||
pub vmctx: *mut VMContext,
|
||||
}
|
||||
|
||||
impl VMMemoryImport {
|
||||
pub fn offset_memory(offsets: &VMOffsets) -> u8 {
|
||||
0 * offsets.ptr_size
|
||||
}
|
||||
|
||||
pub fn offset_vmctx(offsets: &VMOffsets) -> u8 {
|
||||
1 * offsets.ptr_size
|
||||
}
|
||||
}
|
||||
|
||||
/// Definition of a global used by the VM.
|
||||
#[repr(C, align(8))]
|
||||
pub struct VMGlobalDefinition {
|
||||
pub data: [u8; 8],
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct VMGlobalImport {
|
||||
pub globals: *mut VMGlobalDefinition,
|
||||
}
|
||||
|
||||
impl VMGlobalImport {
|
||||
pub fn offset_globals(offsets: &VMOffsets) -> u8 {
|
||||
0 * offsets.ptr_size
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct VMSharedSigIndex(u32);
|
||||
|
||||
#[repr(C)]
|
||||
pub struct VMCallerCheckedAnyfunc {
|
||||
pub func: *const VMFunctionBody,
|
||||
pub type_index: VMSharedSigIndex,
|
||||
pub vmctx: *mut VMContext,
|
||||
}
|
||||
|
||||
impl VMCallerCheckedAnyfunc {
|
||||
pub fn offset_func(offsets: &VMOffsets) -> u8 {
|
||||
0 * offsets.ptr_size
|
||||
}
|
||||
|
||||
pub fn offset_type_index(offsets: &VMOffsets) -> u8 {
|
||||
1 * offsets.ptr_size
|
||||
}
|
||||
|
||||
pub fn offset_vmctx(offsets: &VMOffsets) -> u8 {
|
||||
2 * offsets.ptr_size
|
||||
}
|
||||
}
|
12
src/webassembly/vmoffsets.rs
Normal file
12
src/webassembly/vmoffsets.rs
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
pub struct VMOffsets {
|
||||
pub(in crate::webassembly) ptr_size: u8,
|
||||
}
|
||||
|
||||
impl VMOffsets {
|
||||
pub fn new(ptr_size: u8) -> Self {
|
||||
Self {
|
||||
ptr_size,
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user