Skip to content

Commit

Permalink
[WebAssembly] fix table.grow type checker (llvm#80572)
Browse files Browse the repository at this point in the history
table.grow is valid with type `[t i32] -> [i32]`.
Fixes: llvm#79966.
  • Loading branch information
HerrCai0907 authored Feb 4, 2024
1 parent 1b33b3f commit 9d2e8dc
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,8 @@ bool WebAssemblyAsmTypeCheck::typeCheck(SMLoc ErrorLoc, const MCInst &Inst,
return true;
if (popType(ErrorLoc, wasm::ValType::I32))
return true;
if (popType(ErrorLoc, Type))
return true;
Stack.push_back(wasm::ValType::I32);
} else if (Name == "table.fill") {
if (getTable(Operands[1]->getStartLoc(), Inst, Type))
Expand Down
15 changes: 11 additions & 4 deletions llvm/test/MC/WebAssembly/tables.s
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,17 @@ table_set:

# CHECK: table_grow:
# CHECK-NEXT: .functype table_grow (i32) -> (i32)
# CHECK-NEXT: i32.const 0
# CHECK-NEXT: table.get foo
# CHECK-NEXT: local.get 0
# CHECK: table.grow foo
# CHECK-NEXT: local.get 0
# CHECK-NEXT: i32.add
# CHECK-NEXT: end_function
table_grow:
.functype table_grow (i32) -> (i32)
i32.const 0
table.get foo
local.get 0

# ENC: table.grow foo # encoding: [0xfc,0x0f,0x80'A',0x80'A',0x80'A',0x80'A',A]
Expand Down Expand Up @@ -145,13 +149,16 @@ table_fill:
# BIN-NEXT: Offset: 0x2D
# BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB
# BIN-NEXT: Index: 0
# BIN-NEXT: Offset: 0x39
# BIN-NEXT: Offset: 0x38
# BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB
# BIN-NEXT: Index: 0
# BIN-NEXT: Offset: 0x41
# BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB
# BIN-NEXT: Index: 2
# BIN-NEXT: Offset: 0x49
# BIN-NEXT: Offset: 0x51
# BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB
# BIN-NEXT: Index: 2
# BIN-NEXT: Offset: 0x52
# BIN-NEXT: Offset: 0x5A
# BIN-NEXT: Functions:
# BIN-NEXT: - Index: 0
# BIN-NEXT: Locals: []
Expand All @@ -164,7 +171,7 @@ table_fill:
# BIN-NEXT: Body: 200020012680808080000B
# BIN-NEXT: - Index: 3
# BIN-NEXT: Locals: []
# BIN-NEXT: Body: 2000FC0F808080800020006A0B
# BIN-NEXT: Body: 41002580808080002000FC0F808080800020006A0B
# BIN-NEXT: - Index: 4
# BIN-NEXT: Locals: []
# BIN-NEXT: Body: 200041002582808080002001FC1182808080000B
Expand Down
24 changes: 17 additions & 7 deletions llvm/test/MC/WebAssembly/type-checker-errors.s
Original file line number Diff line number Diff line change
Expand Up @@ -216,21 +216,31 @@ table_fill_type_mismatch_3:
end_function

table_grow_non_exist_table:
.functype table_grow_non_exist_table () -> (i32)
i32.const 0
.functype table_grow_non_exist_table (externref, i32) -> (i32)
local.get 0
local.get 1
# CHECK: [[@LINE+1]]:14: error: symbol invalid_table missing .tabletype
table.grow invalid_table
end_function

table_grow_wrong_parameter:
.functype table_grow_non_exist_table () -> (i32)
# CHECK: [[@LINE+1]]:3: error: empty stack while popping i32
table_grow_type_mismatch_1:
.functype table_grow_type_mismatch_1 (externref, i32) -> (i32)
local.get 1
# CHECK: [[@LINE+1]]:3: error: empty stack while popping externref
table.grow valid_table
end_function

table_grow_type_mismatch_2:
.functype table_grow_type_mismatch_2 (externref, i32) -> (i32)
local.get 0
# CHECK: [[@LINE+1]]:3: error: popped externref, expected i32
table.grow valid_table
end_function

table_grow_wrong_result:
.functype table_grow_non_exist_table () -> (f32)
i32.const 0
.functype table_grow_wrong_result (externref, i32) -> (f32)
local.get 0
local.get 1
table.grow valid_table
# CHECK: [[@LINE+1]]:3: error: popped i32, expected f32
end_function
Expand Down

0 comments on commit 9d2e8dc

Please sign in to comment.