Add a type parameter to VMOffsets for pointer size (#3020)
* Add a type parameter to `VMOffsets` for pointer size This commit adds a type parameter to `VMOffsets` representing the pointer size to improve computations in `wasmtime-runtime` which always use a constant value of the host's pointer size. The type parameter is `u8` for `wasmtime-cranelift`'s use case where cross-compilation may be involved. * fix lightbeam
This commit is contained in:
@@ -120,7 +120,7 @@ pub struct FuncEnvironment<'module_environment> {
|
|||||||
builtin_function_signatures: BuiltinFunctionSignatures,
|
builtin_function_signatures: BuiltinFunctionSignatures,
|
||||||
|
|
||||||
/// Offsets to struct fields accessed by JIT code.
|
/// Offsets to struct fields accessed by JIT code.
|
||||||
pub(crate) offsets: VMOffsets,
|
pub(crate) offsets: VMOffsets<u8>,
|
||||||
|
|
||||||
tunables: &'module_environment Tunables,
|
tunables: &'module_environment Tunables,
|
||||||
|
|
||||||
@@ -288,7 +288,7 @@ impl<'module_environment> FuncEnvironment<'module_environment> {
|
|||||||
|
|
||||||
// If this changes that's ok, the `atomic_rmw` below just needs to be
|
// If this changes that's ok, the `atomic_rmw` below just needs to be
|
||||||
// preceded with an add instruction of `externref` and the offset.
|
// preceded with an add instruction of `externref` and the offset.
|
||||||
assert_eq!(VMOffsets::vm_extern_data_ref_count(), 0);
|
assert_eq!(self.offsets.vm_extern_data_ref_count(), 0);
|
||||||
let delta = builder.ins().iconst(pointer_type, delta);
|
let delta = builder.ins().iconst(pointer_type, delta);
|
||||||
builder.ins().atomic_rmw(
|
builder.ins().atomic_rmw(
|
||||||
pointer_type,
|
pointer_type,
|
||||||
|
|||||||
@@ -52,9 +52,9 @@ fn align(offset: u32, width: u32) -> u32 {
|
|||||||
/// This class computes offsets to fields within `VMContext` and other
|
/// This class computes offsets to fields within `VMContext` and other
|
||||||
/// related structs that JIT code accesses directly.
|
/// related structs that JIT code accesses directly.
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct VMOffsets {
|
pub struct VMOffsets<P> {
|
||||||
/// The size in bytes of a pointer on the target.
|
/// The size in bytes of a pointer on the target.
|
||||||
pub pointer_size: u8,
|
pub ptr: P,
|
||||||
/// The number of signature declarations in the module.
|
/// The number of signature declarations in the module.
|
||||||
pub num_signature_ids: u32,
|
pub num_signature_ids: u32,
|
||||||
/// The number of imported functions in the module.
|
/// The number of imported functions in the module.
|
||||||
@@ -91,11 +91,34 @@ pub struct VMOffsets {
|
|||||||
size: u32,
|
size: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Trait used for the `ptr` representation of the field of `VMOffsets`
|
||||||
|
pub trait PtrSize {
|
||||||
|
/// Returns the pointer size, in bytes, for the target.
|
||||||
|
fn size(&self) -> u8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Type representing the size of a pointer for the current compilation host
|
||||||
|
pub struct HostPtr;
|
||||||
|
|
||||||
|
impl PtrSize for HostPtr {
|
||||||
|
#[inline]
|
||||||
|
fn size(&self) -> u8 {
|
||||||
|
std::mem::size_of::<usize>() as u8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PtrSize for u8 {
|
||||||
|
#[inline]
|
||||||
|
fn size(&self) -> u8 {
|
||||||
|
*self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Used to construct a `VMOffsets`
|
/// Used to construct a `VMOffsets`
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct VMOffsetsFields {
|
pub struct VMOffsetsFields<P> {
|
||||||
/// The size in bytes of a pointer on the target.
|
/// The size in bytes of a pointer on the target.
|
||||||
pub pointer_size: u8,
|
pub ptr: P,
|
||||||
/// The number of signature declarations in the module.
|
/// The number of signature declarations in the module.
|
||||||
pub num_signature_ids: u32,
|
pub num_signature_ids: u32,
|
||||||
/// The number of imported functions in the module.
|
/// The number of imported functions in the module.
|
||||||
@@ -116,11 +139,11 @@ pub struct VMOffsetsFields {
|
|||||||
pub num_defined_globals: u32,
|
pub num_defined_globals: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// Return a new `VMOffsets` instance, for a given pointer size.
|
/// Return a new `VMOffsets` instance, for a given pointer size.
|
||||||
pub fn new(pointer_size: u8, module: &Module) -> Self {
|
pub fn new(ptr: P, module: &Module) -> Self {
|
||||||
VMOffsets::from(VMOffsetsFields {
|
VMOffsets::from(VMOffsetsFields {
|
||||||
pointer_size,
|
ptr,
|
||||||
num_signature_ids: cast_to_u32(module.types.len()),
|
num_signature_ids: cast_to_u32(module.types.len()),
|
||||||
num_imported_functions: cast_to_u32(module.num_imported_funcs),
|
num_imported_functions: cast_to_u32(module.num_imported_funcs),
|
||||||
num_imported_tables: cast_to_u32(module.num_imported_tables),
|
num_imported_tables: cast_to_u32(module.num_imported_tables),
|
||||||
@@ -132,12 +155,18 @@ impl VMOffsets {
|
|||||||
num_defined_globals: cast_to_u32(module.globals.len()),
|
num_defined_globals: cast_to_u32(module.globals.len()),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the size, in bytes, of the target
|
||||||
|
#[inline]
|
||||||
|
pub fn pointer_size(&self) -> u8 {
|
||||||
|
self.ptr.size()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<VMOffsetsFields> for VMOffsets {
|
impl<P: PtrSize> From<VMOffsetsFields<P>> for VMOffsets<P> {
|
||||||
fn from(fields: VMOffsetsFields) -> VMOffsets {
|
fn from(fields: VMOffsetsFields<P>) -> VMOffsets<P> {
|
||||||
let mut ret = Self {
|
let mut ret = Self {
|
||||||
pointer_size: fields.pointer_size,
|
ptr: fields.ptr,
|
||||||
num_signature_ids: fields.num_signature_ids,
|
num_signature_ids: fields.num_signature_ids,
|
||||||
num_imported_functions: fields.num_imported_functions,
|
num_imported_functions: fields.num_imported_functions,
|
||||||
num_imported_tables: fields.num_imported_tables,
|
num_imported_tables: fields.num_imported_tables,
|
||||||
@@ -166,15 +195,15 @@ impl From<VMOffsetsFields> for VMOffsets {
|
|||||||
ret.interrupts = 0;
|
ret.interrupts = 0;
|
||||||
ret.externref_activations_table = ret
|
ret.externref_activations_table = ret
|
||||||
.interrupts
|
.interrupts
|
||||||
.checked_add(u32::from(fields.pointer_size))
|
.checked_add(u32::from(ret.ptr.size()))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
ret.store = ret
|
ret.store = ret
|
||||||
.externref_activations_table
|
.externref_activations_table
|
||||||
.checked_add(u32::from(fields.pointer_size))
|
.checked_add(u32::from(ret.ptr.size()))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
ret.signature_ids = ret
|
ret.signature_ids = ret
|
||||||
.store
|
.store
|
||||||
.checked_add(u32::from(fields.pointer_size * 2))
|
.checked_add(u32::from(ret.ptr.size() * 2))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
ret.imported_functions = ret
|
ret.imported_functions = ret
|
||||||
.signature_ids
|
.signature_ids
|
||||||
@@ -257,7 +286,7 @@ impl From<VMOffsetsFields> for VMOffsets {
|
|||||||
.builtin_functions
|
.builtin_functions
|
||||||
.checked_add(
|
.checked_add(
|
||||||
BuiltinFunctionIndex::builtin_functions_total_number()
|
BuiltinFunctionIndex::builtin_functions_total_number()
|
||||||
.checked_mul(u32::from(ret.pointer_size))
|
.checked_mul(u32::from(ret.pointer_size()))
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@@ -266,74 +295,73 @@ impl From<VMOffsetsFields> for VMOffsets {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMFunctionImport`.
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
impl VMOffsets {
|
|
||||||
/// The offset of the `body` field.
|
/// The offset of the `body` field.
|
||||||
#[allow(clippy::erasing_op)]
|
#[allow(clippy::erasing_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmfunction_import_body(&self) -> u8 {
|
pub fn vmfunction_import_body(&self) -> u8 {
|
||||||
0 * self.pointer_size
|
0 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The offset of the `vmctx` field.
|
/// The offset of the `vmctx` field.
|
||||||
#[allow(clippy::identity_op)]
|
#[allow(clippy::identity_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmfunction_import_vmctx(&self) -> u8 {
|
pub fn vmfunction_import_vmctx(&self) -> u8 {
|
||||||
1 * self.pointer_size
|
1 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the size of `VMFunctionImport`.
|
/// Return the size of `VMFunctionImport`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn size_of_vmfunction_import(&self) -> u8 {
|
pub fn size_of_vmfunction_import(&self) -> u8 {
|
||||||
2 * self.pointer_size
|
2 * self.pointer_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `*const VMFunctionBody`.
|
/// Offsets for `*const VMFunctionBody`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// The size of the `current_elements` field.
|
/// The size of the `current_elements` field.
|
||||||
#[allow(clippy::identity_op)]
|
#[allow(clippy::identity_op)]
|
||||||
pub fn size_of_vmfunction_body_ptr(&self) -> u8 {
|
pub fn size_of_vmfunction_body_ptr(&self) -> u8 {
|
||||||
1 * self.pointer_size
|
1 * self.pointer_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMTableImport`.
|
/// Offsets for `VMTableImport`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// The offset of the `from` field.
|
/// The offset of the `from` field.
|
||||||
#[allow(clippy::erasing_op)]
|
#[allow(clippy::erasing_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmtable_import_from(&self) -> u8 {
|
pub fn vmtable_import_from(&self) -> u8 {
|
||||||
0 * self.pointer_size
|
0 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The offset of the `vmctx` field.
|
/// The offset of the `vmctx` field.
|
||||||
#[allow(clippy::identity_op)]
|
#[allow(clippy::identity_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmtable_import_vmctx(&self) -> u8 {
|
pub fn vmtable_import_vmctx(&self) -> u8 {
|
||||||
1 * self.pointer_size
|
1 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the size of `VMTableImport`.
|
/// Return the size of `VMTableImport`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn size_of_vmtable_import(&self) -> u8 {
|
pub fn size_of_vmtable_import(&self) -> u8 {
|
||||||
2 * self.pointer_size
|
2 * self.pointer_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMTableDefinition`.
|
/// Offsets for `VMTableDefinition`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// The offset of the `base` field.
|
/// The offset of the `base` field.
|
||||||
#[allow(clippy::erasing_op)]
|
#[allow(clippy::erasing_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmtable_definition_base(&self) -> u8 {
|
pub fn vmtable_definition_base(&self) -> u8 {
|
||||||
0 * self.pointer_size
|
0 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The offset of the `current_elements` field.
|
/// The offset of the `current_elements` field.
|
||||||
#[allow(clippy::identity_op)]
|
#[allow(clippy::identity_op)]
|
||||||
pub fn vmtable_definition_current_elements(&self) -> u8 {
|
pub fn vmtable_definition_current_elements(&self) -> u8 {
|
||||||
1 * self.pointer_size
|
1 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The size of the `current_elements` field.
|
/// The size of the `current_elements` field.
|
||||||
@@ -345,7 +373,7 @@ impl VMOffsets {
|
|||||||
/// Return the size of `VMTableDefinition`.
|
/// Return the size of `VMTableDefinition`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn size_of_vmtable_definition(&self) -> u8 {
|
pub fn size_of_vmtable_definition(&self) -> u8 {
|
||||||
2 * self.pointer_size
|
2 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The type of the `current_elements` field.
|
/// The type of the `current_elements` field.
|
||||||
@@ -356,42 +384,42 @@ impl VMOffsets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMMemoryImport`.
|
/// Offsets for `VMMemoryImport`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// The offset of the `from` field.
|
/// The offset of the `from` field.
|
||||||
#[allow(clippy::erasing_op)]
|
#[allow(clippy::erasing_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmmemory_import_from(&self) -> u8 {
|
pub fn vmmemory_import_from(&self) -> u8 {
|
||||||
0 * self.pointer_size
|
0 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The offset of the `vmctx` field.
|
/// The offset of the `vmctx` field.
|
||||||
#[allow(clippy::identity_op)]
|
#[allow(clippy::identity_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmmemory_import_vmctx(&self) -> u8 {
|
pub fn vmmemory_import_vmctx(&self) -> u8 {
|
||||||
1 * self.pointer_size
|
1 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the size of `VMMemoryImport`.
|
/// Return the size of `VMMemoryImport`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn size_of_vmmemory_import(&self) -> u8 {
|
pub fn size_of_vmmemory_import(&self) -> u8 {
|
||||||
2 * self.pointer_size
|
2 * self.pointer_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMMemoryDefinition`.
|
/// Offsets for `VMMemoryDefinition`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// The offset of the `base` field.
|
/// The offset of the `base` field.
|
||||||
#[allow(clippy::erasing_op)]
|
#[allow(clippy::erasing_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmmemory_definition_base(&self) -> u8 {
|
pub fn vmmemory_definition_base(&self) -> u8 {
|
||||||
0 * self.pointer_size
|
0 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The offset of the `current_length` field.
|
/// The offset of the `current_length` field.
|
||||||
#[allow(clippy::identity_op)]
|
#[allow(clippy::identity_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmmemory_definition_current_length(&self) -> u8 {
|
pub fn vmmemory_definition_current_length(&self) -> u8 {
|
||||||
1 * self.pointer_size
|
1 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The size of the `current_length` field.
|
/// The size of the `current_length` field.
|
||||||
@@ -403,7 +431,7 @@ impl VMOffsets {
|
|||||||
/// Return the size of `VMMemoryDefinition`.
|
/// Return the size of `VMMemoryDefinition`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn size_of_vmmemory_definition(&self) -> u8 {
|
pub fn size_of_vmmemory_definition(&self) -> u8 {
|
||||||
2 * self.pointer_size
|
2 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The type of the `current_length` field.
|
/// The type of the `current_length` field.
|
||||||
@@ -414,24 +442,24 @@ impl VMOffsets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMGlobalImport`.
|
/// Offsets for `VMGlobalImport`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// The offset of the `from` field.
|
/// The offset of the `from` field.
|
||||||
#[allow(clippy::erasing_op)]
|
#[allow(clippy::erasing_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmglobal_import_from(&self) -> u8 {
|
pub fn vmglobal_import_from(&self) -> u8 {
|
||||||
0 * self.pointer_size
|
0 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the size of `VMGlobalImport`.
|
/// Return the size of `VMGlobalImport`.
|
||||||
#[allow(clippy::identity_op)]
|
#[allow(clippy::identity_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn size_of_vmglobal_import(&self) -> u8 {
|
pub fn size_of_vmglobal_import(&self) -> u8 {
|
||||||
1 * self.pointer_size
|
1 * self.pointer_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMGlobalDefinition`.
|
/// Offsets for `VMGlobalDefinition`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// Return the size of `VMGlobalDefinition`; this is the size of the largest value type (i.e. a
|
/// Return the size of `VMGlobalDefinition`; this is the size of the largest value type (i.e. a
|
||||||
/// V128).
|
/// V128).
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -441,7 +469,7 @@ impl VMOffsets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMSharedSignatureIndex`.
|
/// Offsets for `VMSharedSignatureIndex`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// Return the size of `VMSharedSignatureIndex`.
|
/// Return the size of `VMSharedSignatureIndex`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn size_of_vmshared_signature_index(&self) -> u8 {
|
pub fn size_of_vmshared_signature_index(&self) -> u8 {
|
||||||
@@ -450,7 +478,7 @@ impl VMOffsets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMInterrupts`.
|
/// Offsets for `VMInterrupts`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// Return the offset of the `stack_limit` field of `VMInterrupts`
|
/// Return the offset of the `stack_limit` field of `VMInterrupts`
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vminterrupts_stack_limit(&self) -> u8 {
|
pub fn vminterrupts_stack_limit(&self) -> u8 {
|
||||||
@@ -460,41 +488,41 @@ impl VMOffsets {
|
|||||||
/// Return the offset of the `fuel_consumed` field of `VMInterrupts`
|
/// Return the offset of the `fuel_consumed` field of `VMInterrupts`
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vminterrupts_fuel_consumed(&self) -> u8 {
|
pub fn vminterrupts_fuel_consumed(&self) -> u8 {
|
||||||
self.pointer_size
|
self.pointer_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMCallerCheckedAnyfunc`.
|
/// Offsets for `VMCallerCheckedAnyfunc`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// The offset of the `func_ptr` field.
|
/// The offset of the `func_ptr` field.
|
||||||
#[allow(clippy::erasing_op)]
|
#[allow(clippy::erasing_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmcaller_checked_anyfunc_func_ptr(&self) -> u8 {
|
pub fn vmcaller_checked_anyfunc_func_ptr(&self) -> u8 {
|
||||||
0 * self.pointer_size
|
0 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The offset of the `type_index` field.
|
/// The offset of the `type_index` field.
|
||||||
#[allow(clippy::identity_op)]
|
#[allow(clippy::identity_op)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmcaller_checked_anyfunc_type_index(&self) -> u8 {
|
pub fn vmcaller_checked_anyfunc_type_index(&self) -> u8 {
|
||||||
1 * self.pointer_size
|
1 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The offset of the `vmctx` field.
|
/// The offset of the `vmctx` field.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmcaller_checked_anyfunc_vmctx(&self) -> u8 {
|
pub fn vmcaller_checked_anyfunc_vmctx(&self) -> u8 {
|
||||||
2 * self.pointer_size
|
2 * self.pointer_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the size of `VMCallerCheckedAnyfunc`.
|
/// Return the size of `VMCallerCheckedAnyfunc`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn size_of_vmcaller_checked_anyfunc(&self) -> u8 {
|
pub fn size_of_vmcaller_checked_anyfunc(&self) -> u8 {
|
||||||
3 * self.pointer_size
|
3 * self.pointer_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMContext`.
|
/// Offsets for `VMContext`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// Return the offset to the `VMInterrupts` structure
|
/// Return the offset to the `VMInterrupts` structure
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmctx_interrupts(&self) -> u32 {
|
pub fn vmctx_interrupts(&self) -> u32 {
|
||||||
@@ -717,21 +745,21 @@ impl VMOffsets {
|
|||||||
/// Return the offset to builtin function in `VMBuiltinFunctionsArray` index `index`.
|
/// Return the offset to builtin function in `VMBuiltinFunctionsArray` index `index`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vmctx_builtin_function(&self, index: BuiltinFunctionIndex) -> u32 {
|
pub fn vmctx_builtin_function(&self, index: BuiltinFunctionIndex) -> u32 {
|
||||||
self.vmctx_builtin_functions_begin() + index.index() * u32::from(self.pointer_size)
|
self.vmctx_builtin_functions_begin() + index.index() * u32::from(self.pointer_size())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMExternData`.
|
/// Offsets for `VMExternData`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// Return the offset for `VMExternData::ref_count`.
|
/// Return the offset for `VMExternData::ref_count`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vm_extern_data_ref_count() -> u32 {
|
pub fn vm_extern_data_ref_count(&self) -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Offsets for `VMExternRefActivationsTable`.
|
/// Offsets for `VMExternRefActivationsTable`.
|
||||||
impl VMOffsets {
|
impl<P: PtrSize> VMOffsets<P> {
|
||||||
/// Return the offset for `VMExternRefActivationsTable::next`.
|
/// Return the offset for `VMExternRefActivationsTable::next`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vm_extern_ref_activation_table_next(&self) -> u32 {
|
pub fn vm_extern_ref_activation_table_next(&self) -> u32 {
|
||||||
@@ -741,7 +769,7 @@ impl VMOffsets {
|
|||||||
/// Return the offset for `VMExternRefActivationsTable::end`.
|
/// Return the offset for `VMExternRefActivationsTable::end`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn vm_extern_ref_activation_table_end(&self) -> u32 {
|
pub fn vm_extern_ref_activation_table_end(&self) -> u32 {
|
||||||
self.pointer_size.into()
|
self.pointer_size().into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ struct FuncEnvironment<'module_environment> {
|
|||||||
module: &'module_environment Module,
|
module: &'module_environment Module,
|
||||||
|
|
||||||
/// Offsets to struct fields accessed by JIT code.
|
/// Offsets to struct fields accessed by JIT code.
|
||||||
offsets: VMOffsets,
|
offsets: VMOffsets<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'module_environment> FuncEnvironment<'module_environment> {
|
impl<'module_environment> FuncEnvironment<'module_environment> {
|
||||||
|
|||||||
@@ -965,8 +965,20 @@ mod tests {
|
|||||||
|
|
||||||
let actual_offset = (ref_count_ptr as usize) - (extern_data_ptr as usize);
|
let actual_offset = (ref_count_ptr as usize) - (extern_data_ptr as usize);
|
||||||
|
|
||||||
|
let offsets = wasmtime_environ::VMOffsets::from(wasmtime_environ::VMOffsetsFields {
|
||||||
|
ptr: 8,
|
||||||
|
num_signature_ids: 0,
|
||||||
|
num_imported_functions: 0,
|
||||||
|
num_imported_tables: 0,
|
||||||
|
num_imported_memories: 0,
|
||||||
|
num_imported_globals: 0,
|
||||||
|
num_defined_functions: 0,
|
||||||
|
num_defined_tables: 0,
|
||||||
|
num_defined_memories: 0,
|
||||||
|
num_defined_globals: 0,
|
||||||
|
});
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
wasmtime_environ::VMOffsets::vm_extern_data_ref_count(),
|
offsets.vm_extern_data_ref_count(),
|
||||||
actual_offset.try_into().unwrap(),
|
actual_offset.try_into().unwrap(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -981,7 +993,7 @@ mod tests {
|
|||||||
let actual_offset = (next_ptr as usize) - (table_ptr as usize);
|
let actual_offset = (next_ptr as usize) - (table_ptr as usize);
|
||||||
|
|
||||||
let offsets = wasmtime_environ::VMOffsets::from(wasmtime_environ::VMOffsetsFields {
|
let offsets = wasmtime_environ::VMOffsets::from(wasmtime_environ::VMOffsetsFields {
|
||||||
pointer_size: 8,
|
ptr: 8,
|
||||||
num_signature_ids: 0,
|
num_signature_ids: 0,
|
||||||
num_imported_functions: 0,
|
num_imported_functions: 0,
|
||||||
num_imported_tables: 0,
|
num_imported_tables: 0,
|
||||||
@@ -1008,7 +1020,7 @@ mod tests {
|
|||||||
let actual_offset = (end_ptr as usize) - (table_ptr as usize);
|
let actual_offset = (end_ptr as usize) - (table_ptr as usize);
|
||||||
|
|
||||||
let offsets = wasmtime_environ::VMOffsets::from(wasmtime_environ::VMOffsetsFields {
|
let offsets = wasmtime_environ::VMOffsets::from(wasmtime_environ::VMOffsetsFields {
|
||||||
pointer_size: 8,
|
ptr: 8,
|
||||||
num_signature_ids: 0,
|
num_signature_ids: 0,
|
||||||
num_imported_functions: 0,
|
num_imported_functions: 0,
|
||||||
num_imported_tables: 0,
|
num_imported_tables: 0,
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ use wasmtime_environ::wasm::{
|
|||||||
DataIndex, DefinedGlobalIndex, DefinedMemoryIndex, DefinedTableIndex, ElemIndex, EntityIndex,
|
DataIndex, DefinedGlobalIndex, DefinedMemoryIndex, DefinedTableIndex, ElemIndex, EntityIndex,
|
||||||
FuncIndex, GlobalIndex, MemoryIndex, TableElementType, TableIndex, WasmType,
|
FuncIndex, GlobalIndex, MemoryIndex, TableElementType, TableIndex, WasmType,
|
||||||
};
|
};
|
||||||
use wasmtime_environ::{ir, Module, VMOffsets};
|
use wasmtime_environ::{ir, HostPtr, Module, VMOffsets};
|
||||||
|
|
||||||
mod allocator;
|
mod allocator;
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ pub(crate) struct Instance {
|
|||||||
module: Arc<Module>,
|
module: Arc<Module>,
|
||||||
|
|
||||||
/// Offsets in the `vmctx` region, precomputed from the `module` above.
|
/// Offsets in the `vmctx` region, precomputed from the `module` above.
|
||||||
offsets: VMOffsets,
|
offsets: VMOffsets<HostPtr>,
|
||||||
|
|
||||||
/// WebAssembly linear memory data.
|
/// WebAssembly linear memory data.
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ use wasmtime_environ::wasm::{
|
|||||||
DefinedFuncIndex, DefinedMemoryIndex, DefinedTableIndex, GlobalInit, SignatureIndex, WasmType,
|
DefinedFuncIndex, DefinedMemoryIndex, DefinedTableIndex, GlobalInit, SignatureIndex, WasmType,
|
||||||
};
|
};
|
||||||
use wasmtime_environ::{
|
use wasmtime_environ::{
|
||||||
ir, MemoryInitialization, MemoryInitializer, Module, ModuleType, TableInitializer, VMOffsets,
|
ir, HostPtr, MemoryInitialization, MemoryInitializer, Module, ModuleType, TableInitializer,
|
||||||
WASM_PAGE_SIZE,
|
VMOffsets, WASM_PAGE_SIZE,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod pooling;
|
mod pooling;
|
||||||
@@ -643,7 +643,7 @@ unsafe impl InstanceAllocator for OnDemandInstanceAllocator {
|
|||||||
let mut handle = {
|
let mut handle = {
|
||||||
let instance = Instance {
|
let instance = Instance {
|
||||||
module: req.module.clone(),
|
module: req.module.clone(),
|
||||||
offsets: VMOffsets::new(std::mem::size_of::<*const u8>() as u8, &req.module),
|
offsets: VMOffsets::new(HostPtr, &req.module),
|
||||||
memories,
|
memories,
|
||||||
tables,
|
tables,
|
||||||
dropped_elements: EntitySet::with_capacity(req.module.passive_elements.len()),
|
dropped_elements: EntitySet::with_capacity(req.module.passive_elements.len()),
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ use std::mem;
|
|||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use wasmtime_environ::{
|
use wasmtime_environ::{
|
||||||
entity::{EntitySet, PrimaryMap},
|
entity::{EntitySet, PrimaryMap},
|
||||||
MemoryStyle, Module, Tunables, VMOffsets, VMOffsetsFields, WASM_PAGE_SIZE,
|
HostPtr, MemoryStyle, Module, Tunables, VMOffsets, VMOffsetsFields, WASM_PAGE_SIZE,
|
||||||
};
|
};
|
||||||
|
|
||||||
cfg_if::cfg_if! {
|
cfg_if::cfg_if! {
|
||||||
@@ -298,7 +298,7 @@ impl InstancePool {
|
|||||||
|
|
||||||
// Calculate the maximum size of an Instance structure given the limits
|
// Calculate the maximum size of an Instance structure given the limits
|
||||||
let offsets = VMOffsets::from(VMOffsetsFields {
|
let offsets = VMOffsets::from(VMOffsetsFields {
|
||||||
pointer_size: std::mem::size_of::<*const u8>() as u8,
|
ptr: HostPtr,
|
||||||
num_signature_ids: module_limits.types,
|
num_signature_ids: module_limits.types,
|
||||||
num_imported_functions: module_limits.imported_functions,
|
num_imported_functions: module_limits.imported_functions,
|
||||||
num_imported_tables: module_limits.imported_tables,
|
num_imported_tables: module_limits.imported_tables,
|
||||||
@@ -358,10 +358,7 @@ impl InstancePool {
|
|||||||
instance as _,
|
instance as _,
|
||||||
Instance {
|
Instance {
|
||||||
module: self.empty_module.clone(),
|
module: self.empty_module.clone(),
|
||||||
offsets: VMOffsets::new(
|
offsets: VMOffsets::new(HostPtr, &self.empty_module),
|
||||||
std::mem::size_of::<*const u8>() as u8,
|
|
||||||
&self.empty_module,
|
|
||||||
),
|
|
||||||
memories: PrimaryMap::with_capacity(limits.memories as usize),
|
memories: PrimaryMap::with_capacity(limits.memories as usize),
|
||||||
tables: PrimaryMap::with_capacity(limits.tables as usize),
|
tables: PrimaryMap::with_capacity(limits.tables as usize),
|
||||||
dropped_elements: EntitySet::new(),
|
dropped_elements: EntitySet::new(),
|
||||||
@@ -383,10 +380,7 @@ impl InstancePool {
|
|||||||
let instance = self.instance(index);
|
let instance = self.instance(index);
|
||||||
|
|
||||||
instance.module = req.module.clone();
|
instance.module = req.module.clone();
|
||||||
instance.offsets = VMOffsets::new(
|
instance.offsets = VMOffsets::new(HostPtr, instance.module.as_ref());
|
||||||
std::mem::size_of::<*const u8>() as u8,
|
|
||||||
instance.module.as_ref(),
|
|
||||||
);
|
|
||||||
instance.host_state = std::mem::replace(&mut req.host_state, Box::new(()));
|
instance.host_state = std::mem::replace(&mut req.host_state, Box::new(()));
|
||||||
|
|
||||||
let mut limiter = req.store.and_then(|s| (*s).limiter());
|
let mut limiter = req.store.and_then(|s| (*s).limiter());
|
||||||
@@ -497,8 +491,7 @@ impl InstancePool {
|
|||||||
// should put everything back in a relatively pristine state for each
|
// should put everything back in a relatively pristine state for each
|
||||||
// fresh allocation later on.
|
// fresh allocation later on.
|
||||||
instance.module = self.empty_module.clone();
|
instance.module = self.empty_module.clone();
|
||||||
instance.offsets =
|
instance.offsets = VMOffsets::new(HostPtr, &self.empty_module);
|
||||||
VMOffsets::new(std::mem::size_of::<*const u8>() as u8, &self.empty_module);
|
|
||||||
|
|
||||||
self.free_list.lock().unwrap().push(index);
|
self.free_list.lock().unwrap().push(index);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user