Fix type of OOB reported on call indirect index outside table.

This commit is contained in:
Nick Lewycky
2020-05-13 13:02:24 -07:00
parent fe42749002
commit 30a86db05b
2 changed files with 7 additions and 6 deletions

View File

@@ -2501,7 +2501,7 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
builder.position_at_end(not_in_bounds_block); builder.position_at_end(not_in_bounds_block);
builder.build_call( builder.build_call(
intrinsics.throw_trap, intrinsics.throw_trap,
&[intrinsics.trap_call_indirect_oob], &[intrinsics.trap_table_access_oob],
"throw", "throw",
); );
builder.build_unreachable(); builder.build_unreachable();
@@ -2553,7 +2553,8 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
let pushed_args = self.state.popn_save_extra(func_type.params().len())?; let pushed_args = self.state.popn_save_extra(func_type.params().len())?;
let args: Vec<_> = std::iter::repeat(ctx_ptr).take(2) let args: Vec<_> = std::iter::repeat(ctx_ptr)
.take(2)
.chain(pushed_args.into_iter().enumerate().map(|(i, (v, info))| { .chain(pushed_args.into_iter().enumerate().map(|(i, (v, info))| {
match func_type.params()[i] { match func_type.params()[i] {
Type::F32 => builder.build_bitcast( Type::F32 => builder.build_bitcast(

View File

@@ -144,10 +144,10 @@ pub struct Intrinsics<'ctx> {
pub trap_unreachable: BasicValueEnum<'ctx>, pub trap_unreachable: BasicValueEnum<'ctx>,
pub trap_call_indirect_sig: BasicValueEnum<'ctx>, pub trap_call_indirect_sig: BasicValueEnum<'ctx>,
pub trap_call_indirect_oob: BasicValueEnum<'ctx>,
pub trap_memory_oob: BasicValueEnum<'ctx>, pub trap_memory_oob: BasicValueEnum<'ctx>,
pub trap_illegal_arithmetic: BasicValueEnum<'ctx>, pub trap_illegal_arithmetic: BasicValueEnum<'ctx>,
pub trap_misaligned_atomic: BasicValueEnum<'ctx>, pub trap_misaligned_atomic: BasicValueEnum<'ctx>,
pub trap_table_access_oob: BasicValueEnum<'ctx>,
// VM intrinsics. // VM intrinsics.
pub memory_grow_dynamic_local: FunctionValue<'ctx>, pub memory_grow_dynamic_local: FunctionValue<'ctx>,
@@ -482,9 +482,6 @@ impl<'ctx> Intrinsics<'ctx> {
trap_call_indirect_sig: i32_ty trap_call_indirect_sig: i32_ty
.const_int(TrapCode::BadSignature as _, false) .const_int(TrapCode::BadSignature as _, false)
.as_basic_value_enum(), .as_basic_value_enum(),
trap_call_indirect_oob: i32_ty
.const_int(TrapCode::OutOfBounds as _, false)
.as_basic_value_enum(),
trap_memory_oob: i32_ty trap_memory_oob: i32_ty
.const_int(TrapCode::OutOfBounds as _, false) .const_int(TrapCode::OutOfBounds as _, false)
.as_basic_value_enum(), .as_basic_value_enum(),
@@ -496,6 +493,9 @@ impl<'ctx> Intrinsics<'ctx> {
trap_misaligned_atomic: i32_ty trap_misaligned_atomic: i32_ty
.const_int(TrapCode::Interrupt as _, false) .const_int(TrapCode::Interrupt as _, false)
.as_basic_value_enum(), .as_basic_value_enum(),
trap_table_access_oob: i32_ty
.const_int(TrapCode::TableAccessOutOfBounds as _, false)
.as_basic_value_enum(),
// VM intrinsics. // VM intrinsics.
memory_grow_dynamic_local: module.add_function( memory_grow_dynamic_local: module.add_function(