summaryrefslogtreecommitdiffstats
path: root/js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js')
-rw-r--r--js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js122
1 files changed, 122 insertions, 0 deletions
diff --git a/js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js b/js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js
new file mode 100644
index 0000000000..64f29b9510
--- /dev/null
+++ b/js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js
@@ -0,0 +1,122 @@
+Services.prefs.setBoolPref("javascript.options.wasm_tail_calls", true);
+registerCleanupFunction(() => {
+ Services.prefs.clearUserPref("javascript.options.wasm_tail_calls");
+});
+
+// The tests runs code in tight loop with the profiler enabled. It is testing
+// behavoir of MacroAssembler::wasmCollapseFrameXXXX methods.
+// It is not guarantee 100% hit since the profiler probes stacks every 1ms,
+// but it will happen often enough.
+add_task(async () => {
+ await Services.profiler.StartProfiler(10, 1, ["js"], ["GeckoMain"]);
+ Assert.ok(Services.profiler.IsActive());
+
+/* Wasm module that is tested:
+(module
+ (func $f (param i64 i64 i64 i64 i64 i64 i64 i64 i64)
+ local.get 0
+ i64.eqz
+ br_if 0
+ local.get 0
+ return_call $g
+ )
+ (func $g (param i64)
+ local.get 0
+ i64.const 1
+ i64.sub
+ i64.const 2
+ i64.const 6
+ i64.const 3
+ i64.const 4
+ i64.const 1
+ i64.const 2
+ i64.const 6
+ i64.const 3
+ return_call $f
+ )
+ (func (export "run")
+ i64.const 0x100000
+ call $g
+ )
+)
+*/
+
+ const b = new Uint8Array([
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x14, 0x03, 0x60,
+ 0x09, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, 0x60,
+ 0x01, 0x7e, 0x00, 0x60, 0x00, 0x00, 0x03, 0x04, 0x03, 0x00, 0x01, 0x02,
+ 0x07, 0x07, 0x01, 0x03, 0x72, 0x75, 0x6e, 0x00, 0x02, 0x0a, 0x31, 0x03,
+ 0x0b, 0x00, 0x20, 0x00, 0x50, 0x0d, 0x00, 0x20, 0x00, 0x12, 0x01, 0x0b,
+ 0x19, 0x00, 0x20, 0x00, 0x42, 0x01, 0x7d, 0x42, 0x02, 0x42, 0x06, 0x42,
+ 0x03, 0x42, 0x04, 0x42, 0x01, 0x42, 0x02, 0x42, 0x06, 0x42, 0x03, 0x12,
+ 0x00, 0x0b, 0x09, 0x00, 0x42, 0x80, 0x80, 0xc0, 0x00, 0x10, 0x01, 0x0b
+ ]);
+ const ins = new WebAssembly.Instance(new WebAssembly.Module(b));
+ for (var i = 0; i < 100; i++) {
+ ins.exports.run();
+ }
+
+ Assert.ok(true, "Done");
+ await Services.profiler.StopProfiler();
+});
+
+add_task(async () => {
+ await Services.profiler.StartProfiler(10, 1, ["js"], ["GeckoMain"]);
+ Assert.ok(Services.profiler.IsActive());
+
+/* Wasm modules that are tested:
+(module (func (export "t")))
+
+(module
+ (import "" "t" (func $g))
+ (table $t 1 1 funcref)
+
+ (func $f (return_call_indirect $t (i32.const 0)))
+ (func (export "run") (param i64)
+ loop
+ local.get 0
+ i64.eqz
+ br_if 1
+ call $f
+ local.get 0
+ i64.const 1
+ i64.sub
+ local.set 0
+ br 0
+ end
+ )
+ (elem (i32.const 0) $g)
+)
+*/
+ const b0 = new Uint8Array([
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
+ 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x07, 0x05, 0x01, 0x01, 0x74, 0x00,
+ 0x00, 0x0a, 0x04, 0x01, 0x02, 0x00, 0x0b
+ ]);
+ const ins0 = new WebAssembly.Instance(new WebAssembly.Module(b0));
+ const b = new Uint8Array([
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x60,
+ 0x00, 0x00, 0x60, 0x01, 0x7e, 0x00, 0x02, 0x06, 0x01, 0x00, 0x01, 0x74,
+ 0x00, 0x00, 0x03, 0x03, 0x02, 0x00, 0x01, 0x04, 0x05, 0x01, 0x70, 0x01,
+ 0x01, 0x01, 0x07, 0x07, 0x01, 0x03, 0x72, 0x75, 0x6e, 0x00, 0x02, 0x09,
+ 0x07, 0x01, 0x00, 0x41, 0x00, 0x0b, 0x01, 0x00, 0x0a, 0x1f, 0x02, 0x07,
+ 0x00, 0x41, 0x00, 0x13, 0x00, 0x00, 0x0b, 0x15, 0x00, 0x03, 0x40, 0x20,
+ 0x00, 0x50, 0x0d, 0x01, 0x10, 0x01, 0x20, 0x00, 0x42, 0x01, 0x7d, 0x21,
+ 0x00, 0x0c, 0x00, 0x0b, 0x0b
+ ]);
+ const ins = new WebAssembly.Instance(new WebAssembly.Module(b), {"": {t: ins0.exports.t,},});
+ for (var i = 0; i < 100; i++) {
+ ins.exports.run(0x100000n);
+ }
+
+ Assert.ok(true, "Done");
+ await Services.profiler.StopProfiler();
+});
+
+/**
+ * All the tests are implemented with add_task, this starts them automatically.
+ */
+function run_test() {
+ do_get_profile();
+ run_next_test();
+}