diff --git a/src/passes/LegalizeJSInterface.cpp b/src/passes/LegalizeJSInterface.cpp index 5a3d8841e03..7621b7e23a9 100644 --- a/src/passes/LegalizeJSInterface.cpp +++ b/src/passes/LegalizeJSInterface.cpp @@ -432,7 +432,7 @@ struct LegalizeAndPruneJSInterface : public LegalizeJSInterface { bool isIllegal(Type type) { auto features = type.getFeatures(); return features.hasSIMD() || features.hasMultivalue() || - features.hasExceptionHandling(); + features.hasExceptionHandling() || features.hasStackSwitching(); } }; diff --git a/test/lit/passes/legalize-and-prune-js-interface.wast b/test/lit/passes/legalize-and-prune-js-interface.wast index dbd168edc55..3ab387393ce 100644 --- a/test/lit/passes/legalize-and-prune-js-interface.wast +++ b/test/lit/passes/legalize-and-prune-js-interface.wast @@ -150,25 +150,32 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (module - ;; CHECK: (type $0 (func (param i64) (result i64))) + ;; CHECK: (type $func (func)) + (type $func (func)) + ;; CHECK: (type $cont (cont $func)) + (type $cont (cont $func)) - ;; CHECK: (type $1 (func (param v128))) + ;; CHECK: (type $2 (func (param i64) (result i64))) - ;; CHECK: (type $2 (func (result v128))) + ;; CHECK: (type $3 (func (param v128))) + + ;; CHECK: (type $4 (func (result v128))) - ;; CHECK: (type $3 (func (result i32 i32))) + ;; CHECK: (type $5 (func (result i32 i32))) - ;; CHECK: (type $4 (func (result exnref))) + ;; CHECK: (type $6 (func (result exnref))) - ;; CHECK: (type $5 (func (param i32))) + ;; CHECK: (type $7 (func (param (ref null $cont)))) - ;; CHECK: (type $6 (func (param i32 i32) (result i32))) + ;; CHECK: (type $8 (func (param i32))) - ;; CHECK: (import "env" "setTempRet0" (func $setTempRet0 (type $5) (param i32))) + ;; CHECK: (type $9 (func (param i32 i32) (result i32))) + + ;; CHECK: (import "env" "setTempRet0" (func $setTempRet0 (type $8) (param i32))) ;; CHECK: (export "export-64" (func $legalstub$export-64)) - ;; CHECK: (func $export-64 (type $0) (param $x i64) (result i64) + ;; CHECK: (func $export-64 (type $2) (param $x i64) (result i64) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $export-64 (export "export-64") (param $x i64) (result i64) @@ -176,7 +183,7 @@ (unreachable) ) - ;; CHECK: (func $export-v128 (type $1) (param $x v128) + ;; CHECK: (func $export-v128 (type $3) (param $x v128) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $export-v128 (export "export-v128") (param $x v128) @@ -184,7 +191,7 @@ (unreachable) ) - ;; CHECK: (func $export-v128-result (type $2) (result v128) + ;; CHECK: (func $export-v128-result (type $4) (result v128) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $export-v128-result (export "export-v128-result") (result v128) @@ -192,7 +199,7 @@ (unreachable) ) - ;; CHECK: (func $export-mv (type $3) (result i32 i32) + ;; CHECK: (func $export-mv (type $5) (result i32 i32) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $export-mv (export "export-mv") (result i32 i32) @@ -200,16 +207,22 @@ (unreachable) ) - ;; CHECK: (func $export-exn (type $4) (result exnref) + ;; CHECK: (func $export-exn (type $6) (result exnref) ;; CHECK-NEXT: (ref.null noexn) ;; CHECK-NEXT: ) (func $export-exn (export "export-exn") (result exnref) ;; This will be pruned. (ref.null noexn) ) + + ;; CHECK: (func $export-cont (type $7) (param $cont (ref null $cont)) + ;; CHECK-NEXT: ) + (func $export-cont (export "export-cont") (param $cont (ref null $cont)) + ;; This will be pruned. + ) ) -;; CHECK: (func $legalstub$export-64 (type $6) (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $legalstub$export-64 (type $9) (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (call $export-64