diff options
author | Alon Zakai <azakai@google.com> | 2023-11-01 15:10:11 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-01 15:10:11 -0700 |
commit | b14bf894b2888807f39f48b4c75a2bc68944efc8 (patch) | |
tree | 9ecd1db462bfc3698f2e9a46c853754369c046cb | |
parent | 1890834c69974bc956c26927b1953112e6a81bec (diff) | |
download | binaryen-b14bf894b2888807f39f48b4c75a2bc68944efc8.tar.gz binaryen-b14bf894b2888807f39f48b4c75a2bc68944efc8.tar.bz2 binaryen-b14bf894b2888807f39f48b4c75a2bc68944efc8.zip |
[Wasm64] Fix PostEmscripten::optimizeExceptions on invokes with an i64 argument (#6074)
In wasm64, function pointers are 64-bit like all pointers.
fixes #6073
-rw-r--r-- | src/passes/PostEmscripten.cpp | 2 | ||||
-rw-r--r-- | test/lit/passes/post-emscripten-64.wast | 31 |
2 files changed, 32 insertions, 1 deletions
diff --git a/src/passes/PostEmscripten.cpp b/src/passes/PostEmscripten.cpp index 39bc3e889..6dc32eaa8 100644 --- a/src/passes/PostEmscripten.cpp +++ b/src/passes/PostEmscripten.cpp @@ -317,7 +317,7 @@ struct PostEmscripten : public Pass { // The first operand is the function pointer index, which must be // constant if we are to optimize it statically. if (auto* index = curr->operands[0]->dynCast<Const>()) { - size_t indexValue = index->value.geti32(); + size_t indexValue = index->value.getInteger(); if (indexValue >= flatTable.names.size()) { // UB can lead to indirect calls to invalid pointers. return; diff --git a/test/lit/passes/post-emscripten-64.wast b/test/lit/passes/post-emscripten-64.wast new file mode 100644 index 000000000..5b1693381 --- /dev/null +++ b/test/lit/passes/post-emscripten-64.wast @@ -0,0 +1,31 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; RUN: wasm-opt %s --post-emscripten -all -S -o - | filecheck %s + +;; Test we do not error on invoke calls that take an i64 index (which is the +;; case in wasm64). Nothing should change here. + +(module + ;; CHECK: (type $0 (func (param i64))) + + ;; CHECK: (type $1 (func)) + + ;; CHECK: (import "env" "invoke_v" (func $invoke (type $0) (param i64))) + (import "env" "invoke_v" (func $invoke (param i64))) + + ;; CHECK: (table $0 269 269 funcref) + (table $0 269 269 funcref) + ;; CHECK: (elem $0 (i32.const 1)) + (elem $0 (i32.const 1)) + + ;; CHECK: (func $0 (type $1) + ;; CHECK-NEXT: (call $invoke + ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $0 + (call $invoke + (i64.const 42) + ) + ) +) + |