summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2023-11-01 15:10:11 -0700
committerGitHub <noreply@github.com>2023-11-01 15:10:11 -0700
commitb14bf894b2888807f39f48b4c75a2bc68944efc8 (patch)
tree9ecd1db462bfc3698f2e9a46c853754369c046cb
parent1890834c69974bc956c26927b1953112e6a81bec (diff)
downloadbinaryen-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.cpp2
-rw-r--r--test/lit/passes/post-emscripten-64.wast31
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)
+ )
+ )
+)
+