[llvm] 991adff - [WebAssembly] Allow try_table to target loops in AsmTypeCheck (#111432)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 7 15:51:02 PDT 2024
Author: Heejin Ahn
Date: 2024-10-07T15:50:59-07:00
New Revision: 991adff4628deeb3b4cb7d9df366e9f1e8b2860c
URL: https://github.com/llvm/llvm-project/commit/991adff4628deeb3b4cb7d9df366e9f1e8b2860c
DIFF: https://github.com/llvm/llvm-project/commit/991adff4628deeb3b4cb7d9df366e9f1e8b2860c.diff
LOG: [WebAssembly] Allow try_table to target loops in AsmTypeCheck (#111432)
Added:
Modified:
llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
llvm/test/MC/WebAssembly/annotations.s
llvm/test/MC/WebAssembly/eh-assembly.s
llvm/test/MC/WebAssembly/type-checker-errors.s
Removed:
################################################################################
diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
index bfe6996977e690..cc4338f6a59fa6 100644
--- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
+++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
@@ -371,11 +371,16 @@ bool WebAssemblyAsmTypeCheck::checkTryTable(SMLoc ErrorLoc,
if (Level < BlockInfoStack.size()) {
const auto &DestBlockInfo =
BlockInfoStack[BlockInfoStack.size() - Level - 1];
- if (compareTypes(SentTypes, DestBlockInfo.Sig.Returns)) {
+ ArrayRef<wasm::ValType> DestTypes;
+ if (DestBlockInfo.IsLoop)
+ DestTypes = DestBlockInfo.Sig.Params;
+ else
+ DestTypes = DestBlockInfo.Sig.Returns;
+ if (compareTypes(SentTypes, DestTypes)) {
std::string ErrorMsg =
ErrorMsgBase + "type mismatch, catch tag type is " +
getTypesString(SentTypes) + ", but destination's type is " +
- getTypesString(DestBlockInfo.Sig.Returns);
+ getTypesString(DestTypes);
Error |= typeError(ErrorLoc, ErrorMsg);
}
} else {
diff --git a/llvm/test/MC/WebAssembly/annotations.s b/llvm/test/MC/WebAssembly/annotations.s
index 2a5bea27941789..f761ef3f06b1fc 100644
--- a/llvm/test/MC/WebAssembly/annotations.s
+++ b/llvm/test/MC/WebAssembly/annotations.s
@@ -7,7 +7,7 @@
.section .text.test_annotation,"",@
.type test_annotation, at function
test_annotation:
- .functype test_annotation () -> ()
+ .functype test_annotation (exnref) -> ()
.tagtype __cpp_exception i32
.tagtype __c_longjmp i32
try
@@ -54,8 +54,18 @@ test_annotation:
return
end_block
drop
- end_function
+ i32.const 0
+ loop (i32) -> ()
+ local.get 0
+ loop (exnref) -> ()
+ try_table (catch __cpp_exception 1) (catch_all_ref 0)
+ end_try_table
+ drop
+ end_loop
+ drop
+ end_loop
+ end_function
# CHECK: test_annotation:
# CHECK: try
@@ -105,5 +115,16 @@ test_annotation:
# CHECK-NEXT: return
# CHECK-NEXT: end_block # label7:
# CHECK-NEXT: drop
-# CHECK-NEXT: end_function
+# CHECK: i32.const 0
+# CHECK-NEXT: loop (i32) -> () # label12:
+# CHECK-NEXT: local.get 0
+# CHECK-NEXT: loop (exnref) -> () # label13:
+# CHECK-NEXT: try_table (catch __cpp_exception 1) (catch_all_ref 0) # 1: up to label12
+# CHECK-NEXT: # 0: up to label13
+# CHECK-NEXT: end_try_table # label14:
+# CHECK-NEXT: drop
+# CHECK-NEXT: end_loop
+# CHECK-NEXT: drop
+# CHECK-NEXT: end_loop
+# CHECK-NEXT: end_function
diff --git a/llvm/test/MC/WebAssembly/eh-assembly.s b/llvm/test/MC/WebAssembly/eh-assembly.s
index 38cda10a387a3b..31dfce5a3cde31 100644
--- a/llvm/test/MC/WebAssembly/eh-assembly.s
+++ b/llvm/test/MC/WebAssembly/eh-assembly.s
@@ -7,7 +7,7 @@
.functype foo () -> ()
eh_test:
- .functype eh_test () -> ()
+ .functype eh_test (exnref) -> ()
# try_table with all four kinds of catch clauses
block exnref
@@ -82,6 +82,18 @@ eh_test:
end_try_table
drop
drop
+
+ # try_table targeting loops
+ i32.const 0
+ loop (i32) -> ()
+ local.get 0
+ loop (exnref) -> ()
+ try_table (catch __cpp_exception 1) (catch_all_ref 0)
+ end_try_table
+ drop
+ end_loop
+ drop
+ end_loop
end_function
eh_legacy_test:
@@ -203,6 +215,17 @@ eh_legacy_test:
# CHECK-NEXT: drop
# CHECK-NEXT: drop
+# CHECK: i32.const 0
+# CHECK-NEXT: loop (i32) -> ()
+# CHECK-NEXT: local.get 0
+# CHECK-NEXT: loop (exnref) -> ()
+# CHECK-NEXT: try_table (catch __cpp_exception 1) (catch_all_ref 0)
+# CHECK: end_try_table
+# CHECK-NEXT: drop
+# CHECK-NEXT: end_loop
+# CHECK-NEXT: drop
+# CHECK-NEXT: end_loop
+
# CHECK: eh_legacy_test:
# CHECK: try
# CHECK-NEXT: i32.const 3
diff --git a/llvm/test/MC/WebAssembly/type-checker-errors.s b/llvm/test/MC/WebAssembly/type-checker-errors.s
index c1c8209e1dce0c..9aa652348c538e 100644
--- a/llvm/test/MC/WebAssembly/type-checker-errors.s
+++ b/llvm/test/MC/WebAssembly/type-checker-errors.s
@@ -966,4 +966,21 @@ eh_test:
end_block
end_block
drop
+
+ loop
+ i32.const 0
+ loop (i32) -> ()
+ loop (i32) -> ()
+ loop
+# CHECK: :[[@LINE+4]]:11: error: try_table: catch index 0: type mismatch, catch tag type is [i32], but destination's type is []
+# CHECK: :[[@LINE+3]]:11: error: try_table: catch index 1: type mismatch, catch tag type is [i32, exnref], but destination's type is [i32]
+# CHECK: :[[@LINE+2]]:11: error: try_table: catch index 2: type mismatch, catch tag type is [], but destination's type is [i32]
+# CHECK: :[[@LINE+1]]:11: error: try_table: catch index 3: type mismatch, catch tag type is [exnref], but destination's type is []
+ try_table (catch __cpp_exception 0) (catch_ref __cpp_exception 1) (catch_all 2) (catch_all_ref 3)
+ end_try_table
+ end_loop
+ drop
+ end_loop
+ end_loop
+ end_loop
end_function
More information about the llvm-commits
mailing list