mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-18 06:19:12 +00:00
Fix dynamic memory styles in llvm.
Dynamic memory has the same struct as static memory, in particular the length field is not a pointer to a length field. Also, send the correct trap code.
This commit is contained in:
@@ -1000,7 +1000,7 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
|
|||||||
{
|
{
|
||||||
MemoryCache::Dynamic {
|
MemoryCache::Dynamic {
|
||||||
ptr_to_base_ptr,
|
ptr_to_base_ptr,
|
||||||
current_length_ptr,
|
ptr_to_current_length,
|
||||||
} => {
|
} => {
|
||||||
// Bounds check it.
|
// Bounds check it.
|
||||||
let minimum = self.wasm_module.memories[memory_index].minimum;
|
let minimum = self.wasm_module.memories[memory_index].minimum;
|
||||||
@@ -1024,8 +1024,9 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
|
|||||||
.unwrap_or_else(|| {
|
.unwrap_or_else(|| {
|
||||||
let load_offset_end = builder.build_int_add(offset, value_size_v, "");
|
let load_offset_end = builder.build_int_add(offset, value_size_v, "");
|
||||||
|
|
||||||
let current_length =
|
let current_length = builder
|
||||||
builder.build_load(current_length_ptr, "").into_int_value();
|
.build_load(ptr_to_current_length, "")
|
||||||
|
.into_int_value();
|
||||||
tbaa_label(
|
tbaa_label(
|
||||||
self.module,
|
self.module,
|
||||||
self.intrinsics,
|
self.intrinsics,
|
||||||
@@ -1053,7 +1054,7 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
|
|||||||
intrinsics.expect_i1,
|
intrinsics.expect_i1,
|
||||||
&[
|
&[
|
||||||
ptr_in_bounds.as_basic_value_enum(),
|
ptr_in_bounds.as_basic_value_enum(),
|
||||||
intrinsics.i1_ty.const_int(1, false).as_basic_value_enum(),
|
intrinsics.i1_ty.const_int(1, true).as_basic_value_enum(),
|
||||||
],
|
],
|
||||||
"ptr_in_bounds_expect",
|
"ptr_in_bounds_expect",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -237,7 +237,6 @@ impl<'ctx> Intrinsics<'ctx> {
|
|||||||
let f32x4_ty_basic = f32x4_ty.as_basic_type_enum();
|
let f32x4_ty_basic = f32x4_ty.as_basic_type_enum();
|
||||||
let f64x2_ty_basic = f64x2_ty.as_basic_type_enum();
|
let f64x2_ty_basic = f64x2_ty.as_basic_type_enum();
|
||||||
let i8_ptr_ty_basic = i8_ptr_ty.as_basic_type_enum();
|
let i8_ptr_ty_basic = i8_ptr_ty.as_basic_type_enum();
|
||||||
let i64_ptr_ty_basic = i64_ptr_ty.as_basic_type_enum();
|
|
||||||
|
|
||||||
let ctx_ty = i8_ty;
|
let ctx_ty = i8_ty;
|
||||||
let ctx_ptr_ty = ctx_ty.ptr_type(AddressSpace::Generic);
|
let ctx_ptr_ty = ctx_ty.ptr_type(AddressSpace::Generic);
|
||||||
@@ -420,7 +419,7 @@ impl<'ctx> Intrinsics<'ctx> {
|
|||||||
.const_int(TrapCode::BadSignature as _, false)
|
.const_int(TrapCode::BadSignature as _, false)
|
||||||
.as_basic_value_enum(),
|
.as_basic_value_enum(),
|
||||||
trap_memory_oob: i32_ty
|
trap_memory_oob: i32_ty
|
||||||
.const_int(TrapCode::OutOfBounds as _, false)
|
.const_int(TrapCode::HeapAccessOutOfBounds as _, false)
|
||||||
.as_basic_value_enum(),
|
.as_basic_value_enum(),
|
||||||
trap_illegal_arithmetic: i32_ty
|
trap_illegal_arithmetic: i32_ty
|
||||||
.const_int(TrapCode::IntegerOverflow as _, false)
|
.const_int(TrapCode::IntegerOverflow as _, false)
|
||||||
@@ -464,7 +463,7 @@ impl<'ctx> Intrinsics<'ctx> {
|
|||||||
|
|
||||||
// TODO: this i64 is actually a rust usize
|
// TODO: this i64 is actually a rust usize
|
||||||
vmmemory_definition_ptr_ty: context
|
vmmemory_definition_ptr_ty: context
|
||||||
.struct_type(&[i8_ptr_ty_basic, i64_ptr_ty_basic], false)
|
.struct_type(&[i8_ptr_ty_basic, i64_ty_basic], false)
|
||||||
.ptr_type(AddressSpace::Generic),
|
.ptr_type(AddressSpace::Generic),
|
||||||
vmmemory_definition_base_element: 0,
|
vmmemory_definition_base_element: 0,
|
||||||
vmmemory_definition_current_length_element: 1,
|
vmmemory_definition_current_length_element: 1,
|
||||||
@@ -508,7 +507,7 @@ pub enum MemoryCache<'ctx> {
|
|||||||
/// The memory moves around.
|
/// The memory moves around.
|
||||||
Dynamic {
|
Dynamic {
|
||||||
ptr_to_base_ptr: PointerValue<'ctx>,
|
ptr_to_base_ptr: PointerValue<'ctx>,
|
||||||
current_length_ptr: PointerValue<'ctx>,
|
ptr_to_current_length: PointerValue<'ctx>,
|
||||||
},
|
},
|
||||||
/// The memory is always in the same place.
|
/// The memory is always in the same place.
|
||||||
Static { base_ptr: PointerValue<'ctx> },
|
Static { base_ptr: PointerValue<'ctx> },
|
||||||
@@ -637,19 +636,16 @@ impl<'ctx, 'a> CtxType<'ctx, 'a> {
|
|||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
if let MemoryStyle::Dynamic { .. } = memory_style {
|
if let MemoryStyle::Dynamic { .. } = memory_style {
|
||||||
let current_length_ptr_ptr = cache_builder
|
let current_length_ptr = cache_builder
|
||||||
.build_struct_gep(
|
.build_struct_gep(
|
||||||
memory_definition_ptr,
|
memory_definition_ptr,
|
||||||
intrinsics.vmmemory_definition_current_length_element,
|
intrinsics.vmmemory_definition_current_length_element,
|
||||||
"",
|
"",
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let current_length_ptr = cache_builder
|
|
||||||
.build_load(current_length_ptr_ptr, "")
|
|
||||||
.into_pointer_value();
|
|
||||||
MemoryCache::Dynamic {
|
MemoryCache::Dynamic {
|
||||||
ptr_to_base_ptr: base_ptr,
|
ptr_to_base_ptr: base_ptr,
|
||||||
current_length_ptr,
|
ptr_to_current_length: current_length_ptr,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let base_ptr = cache_builder.build_load(base_ptr, "").into_pointer_value();
|
let base_ptr = cache_builder.build_load(base_ptr, "").into_pointer_value();
|
||||||
|
|||||||
Reference in New Issue
Block a user