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.build_call(
intrinsics.throw_trap,
&[intrinsics.trap_call_indirect_oob],
&[intrinsics.trap_table_access_oob],
"throw",
);
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 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))| {
match func_type.params()[i] {
Type::F32 => builder.build_bitcast(

View File

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