diff options
author | Alon Zakai <azakai@google.com> | 2020-10-19 10:20:34 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-19 10:20:34 -0700 |
commit | 3f1b6ca3f3dc852aaa0a427b4db340e75c5bb693 (patch) | |
tree | 5449b5bf1554d8c8643be20c2ab7fbd54a944640 /src/wasm/wasm-validator.cpp | |
parent | 770a042535cd901902cd23410d9a9488dfc020e2 (diff) | |
download | binaryen-3f1b6ca3f3dc852aaa0a427b4db340e75c5bb693.tar.gz binaryen-3f1b6ca3f3dc852aaa0a427b4db340e75c5bb693.tar.bz2 binaryen-3f1b6ca3f3dc852aaa0a427b4db340e75c5bb693.zip |
Fix validateGlobally usage in validator, and an i64-to-i32 bug hidden by it (#3253)
validateGlobally means that we can't do lookups on the module. A few places
were missing that, or had it wrong. I think the reason for the wrong usages is
that we used to have types on the module, and then removed that, so more is
now validatable actually.
This uncovered a real bug, where i64-to-32 would ignore an unreachable
parameter of a call_indirect. That's bad, since if the type is i64, we need
to replace it with two parameters. To fix that, just handle unreachability
there, using the existing logic (which skips the call_indirect entirely in
this case).
Diffstat (limited to 'src/wasm/wasm-validator.cpp')
-rw-r--r-- | src/wasm/wasm-validator.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 012cb0e36..ef6a29373 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -806,9 +806,6 @@ void FunctionValidator::visitCallIndirect(CallIndirect* curr) { shouldBeTrue(!curr->isReturn || getModule()->features.hasTailCall(), curr, "return_call_indirect requires tail calls to be enabled"); - if (!info.validateGlobally) { - return; - } shouldBeEqualOrFirstIsUnreachable(curr->target->type, Type(Type::i32), curr, @@ -1960,6 +1957,9 @@ void FunctionValidator::visitRefFunc(RefFunc* curr) { shouldBeTrue(getModule()->features.hasReferenceTypes(), curr, "ref.func requires reference-types to be enabled"); + if (!info.validateGlobally) { + return; + } auto* func = getModule()->getFunctionOrNull(curr->func); shouldBeTrue(!!func, curr, "function argument of ref.func must exist"); } @@ -2010,13 +2010,13 @@ void FunctionValidator::visitThrow(Throw* curr) { shouldBeTrue(getModule()->features.hasExceptionHandling(), curr, "throw requires exception-handling to be enabled"); - if (!info.validateGlobally) { - return; - } shouldBeEqual(curr->type, Type(Type::unreachable), curr, "throw's type must be unreachable"); + if (!info.validateGlobally) { + return; + } auto* event = getModule()->getEventOrNull(curr->event); if (!shouldBeTrue(!!event, curr, "throw's event must exist")) { return; |