[Wasm] REGRESSION(r256665): Wasm->JS call IC needs to save memory size register
authortzagallo@apple.com <tzagallo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Feb 2020 21:24:13 +0000 (21:24 +0000)
committertzagallo@apple.com <tzagallo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Feb 2020 21:24:13 +0000 (21:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=207849

Reviewed by Mark Lam.

JSTests:

* wasm/regress/regress-256665.js: Added.
(f):

Source/JavaScriptCore:

When generating the call IC, we should select the callee saves using BoundsChecking mode in order
to obey to the calling conventions described in r256665. Currently, we won't restore the memory size
register when calling the Wasm LLInt through the call IC.

* wasm/js/WebAssemblyFunction.cpp:
(JSC::WebAssemblyFunction::calleeSaves const):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@256766 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/wasm/regress/regress-256665.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wasm/js/WebAssemblyFunction.cpp

index 65212ff..ae074e1 100644 (file)
@@ -1,3 +1,13 @@
+2020-02-17  Tadeu Zagallo  <tzagallo@apple.com>
+
+        [Wasm] REGRESSION(r256665): Wasm->JS call IC needs to save memory size register
+        https://bugs.webkit.org/show_bug.cgi?id=207849
+
+        Reviewed by Mark Lam.
+
+        * wasm/regress/regress-256665.js: Added.
+        (f):
+
 2020-02-14  Tadeu Zagallo  <tzagallo@apple.com>
 
         Unreviewed: fix broken tests added in r256665
diff --git a/JSTests/wasm/regress/regress-256665.js b/JSTests/wasm/regress/regress-256665.js
new file mode 100644 (file)
index 0000000..3ab6c16
--- /dev/null
@@ -0,0 +1,12 @@
+//@ requireOptions("--useConcurrentJIT=false", "--jitPolicyScale=0")
+
+function f() {
+    var buffer = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 6, 1, 96, 1, 127, 1, 127, 3, 2, 1, 0, 5, 3, 1, 0, 0, 7, 8, 1, 4, 108, 111, 97, 100, 0, 0, 10, 9, 1, 7, 0, 32, 0, 40, 0, 100, 11]);
+    var module = new WebAssembly.Module(buffer);
+    var instance = new WebAssembly.Instance(module);
+    try { instance.exports.load(0x10000 - 100 - 4); } catch (e) {}
+    (555)[0];
+}
+
+f();
+f();
index 610b05f..5bdc85f 100644 (file)
@@ -1,3 +1,17 @@
+2020-02-17  Tadeu Zagallo  <tzagallo@apple.com>
+
+        [Wasm] REGRESSION(r256665): Wasm->JS call IC needs to save memory size register
+        https://bugs.webkit.org/show_bug.cgi?id=207849
+
+        Reviewed by Mark Lam.
+
+        When generating the call IC, we should select the callee saves using BoundsChecking mode in order
+        to obey to the calling conventions described in r256665. Currently, we won't restore the memory size
+        register when calling the Wasm LLInt through the call IC.
+
+        * wasm/js/WebAssemblyFunction.cpp:
+        (JSC::WebAssemblyFunction::calleeSaves const):
+
 2020-02-17  Per Arne Vollan  <pvollan@apple.com>
 
         Mach lookup to com.apple.webinspector should not be allowed in WebKit's WebContent process
index 44f99be..16ecdaa 100644 (file)
@@ -161,7 +161,8 @@ bool WebAssemblyFunction::useTagRegisters() const
 
 RegisterSet WebAssemblyFunction::calleeSaves() const
 {
-    return Wasm::PinnedRegisterInfo::get().toSave(instance()->memoryMode());
+    // Pessimistically save callee saves in BoundsChecking mode since the LLInt always bounds checks
+    return Wasm::PinnedRegisterInfo::get().toSave(Wasm::MemoryMode::BoundsChecking);
 }
 
 RegisterAtOffsetList WebAssemblyFunction::usedCalleeSaveRegisters() const