diff options
author | Thomas Lively <tlively123@gmail.com> | 2024-12-02 16:03:21 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-03 00:03:21 +0000 |
commit | f331120e4b942a795d4a6b6d0d5a3d781c1e6a4c (patch) | |
tree | bb0a9a5b0d2bb19394d4259aa142796b7dd32461 | |
parent | 74782d217ed15dd73b58b1636c563aa51334a576 (diff) | |
download | binaryen-f331120e4b942a795d4a6b6d0d5a3d781c1e6a4c.tar.gz binaryen-f331120e4b942a795d4a6b6d0d5a3d781c1e6a4c.tar.bz2 binaryen-f331120e4b942a795d4a6b6d0d5a3d781c1e6a4c.zip |
Fixup block-nested pops even when EH is not enabled (#7130)
While parsing a binary file, there may be pops that need to be fixed up
even if EH is not (yet) enabled because the target features section has
not been parsed yet. Previously `EHUtils::handleBlockNestedPops` did not
do anything if EH was not enabled, so the binary parser would fail to
fix up pops in that case. Add an optional parameter to override this
behavior so the parser can fix up pops unconditionally.
Fixes #7127.
-rw-r--r-- | src/ir/eh-utils.cpp | 5 | ||||
-rw-r--r-- | src/ir/eh-utils.h | 10 | ||||
-rw-r--r-- | src/wasm/wasm-ir-builder.cpp | 5 | ||||
-rw-r--r-- | test/lit/binary/stacky-eh-legacy.test | 4 | ||||
-rw-r--r-- | test/lit/binary/stacky-eh-legacy.test.wasm | bin | 47 -> 86 bytes |
5 files changed, 17 insertions, 7 deletions
diff --git a/src/ir/eh-utils.cpp b/src/ir/eh-utils.cpp index 70b5452a6..6d65de4ad 100644 --- a/src/ir/eh-utils.cpp +++ b/src/ir/eh-utils.cpp @@ -148,8 +148,9 @@ void handleBlockNestedPop(Try* try_, Function* func, Module& wasm) { } } -void handleBlockNestedPops(Function* func, Module& wasm) { - if (!wasm.features.hasExceptionHandling()) { +void handleBlockNestedPops(Function* func, Module& wasm, FeaturePolicy policy) { + if (policy == FeaturePolicy::SkipIfNoEH && + !wasm.features.hasExceptionHandling()) { return; } FindAll<Try> trys(func->body); diff --git a/src/ir/eh-utils.h b/src/ir/eh-utils.h index 79ccbc507..ee5ad661d 100644 --- a/src/ir/eh-utils.h +++ b/src/ir/eh-utils.h @@ -38,8 +38,14 @@ bool containsValidDanglingPop(Expression* catchBody); // '(local.get $new)' where the 'pop' used to be. void handleBlockNestedPop(Try* try_, Function* func, Module& wasm); -// Calls handleBlockNestedPop for each 'Try's in a given function. -void handleBlockNestedPops(Function* func, Module& wasm); +enum class FeaturePolicy { SkipIfNoEH, RunIfNoEH }; + +// Calls handleBlockNestedPop for each 'Try's in a given function. By default, +// does no work if EH is not enabled, but this can be overridden with the +// RunIfNoEH policy. +void handleBlockNestedPops(Function* func, + Module& wasm, + FeaturePolicy policy = FeaturePolicy::SkipIfNoEH); // Given a catch body, find the pop corresponding to the catch. There might be // pops nested inside a try inside this catch, and we must ignore them, like diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index fcb1fc48d..a51337cda 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -1018,7 +1018,10 @@ Result<> IRBuilder::visitEnd() { func->body = maybeWrapForLabel(*expr); labelDepths.clear(); if (scope.needsPopFixup()) { - EHUtils::handleBlockNestedPops(func, wasm); + // We may be in the binary parser, where pops need to be fixed up before + // we know that EH will be enabled. + EHUtils::handleBlockNestedPops( + func, wasm, EHUtils::FeaturePolicy::RunIfNoEH); } this->func = nullptr; blockHint = 0; diff --git a/test/lit/binary/stacky-eh-legacy.test b/test/lit/binary/stacky-eh-legacy.test index c77435f0b..792c436d5 100644 --- a/test/lit/binary/stacky-eh-legacy.test +++ b/test/lit/binary/stacky-eh-legacy.test @@ -35,7 +35,7 @@ ;; The fixup will hoist the 'pop' and create another local to store it right ;; after 'catch'. -;; RUN: wasm-opt -all %s.wasm -S -o - | filecheck %s +;; RUN: wasm-opt %s.wasm -S -o - | filecheck %s ;; CHECK: (type $0 (func (param i32))) @@ -43,7 +43,7 @@ ;; CHECK: (tag $tag$0 (param i32)) -;; CHECK: (func $0 (type $1) +;; CHECK: (func $0 ;; CHECK-NEXT: (local $0 i32) ;; CHECK-NEXT: (local $1 i32) ;; CHECK-NEXT: (local $2 i32) diff --git a/test/lit/binary/stacky-eh-legacy.test.wasm b/test/lit/binary/stacky-eh-legacy.test.wasm Binary files differindex 992273cae..8da1d0238 100644 --- a/test/lit/binary/stacky-eh-legacy.test.wasm +++ b/test/lit/binary/stacky-eh-legacy.test.wasm |