| // REQUIRES: node |
| |
| // Reduce multiple embedded Wasm modules in a JS file in reverse order (last to |
| // first) and verify that both modules are minimized without offset drift. |
| // RUN: wasm-reduce %s --js -t %t.test.js -w %t.working.js '--command=node %t.test.js' 2>&1 | filecheck %s --check-prefix=LOG |
| // RUN: filecheck %s < %t.working.js |
| // RUN: node %t.working.js | filecheck %s --check-prefix=OUT |
| |
| // LOG: |reducing embedded module 1 of 2 |
| // LOG: |input size: 52 |
| // LOG: |finished, final size: 34 |
| // LOG: |reducing embedded module 0 of 2 |
| // LOG: |input size: 52 |
| // LOG: |finished, final size: 34 |
| |
| // Reduced module 0: (module (func (export "a") (result i32) (i32.const 10))) |
| // Reduced module 1: (module (func (export "b") (result i32) (i32.const 32))) |
| // CHECK: const bytes0 = new Uint8Array([ |
| // CHECK-NEXT: 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7f, 0x03, |
| // CHECK-NEXT: 0x02, 0x01, 0x00, 0x07, 0x05, 0x01, 0x01, 0x61, 0x00, 0x00, 0x0a, 0x06, 0x01, 0x04, 0x00, 0x41, |
| // CHECK-NEXT: 0x0a, 0x0b |
| // CHECK-NEXT: ]); |
| // CHECK: const bytes1 = new Uint8Array([ |
| // CHECK-NEXT: 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7f, 0x03, |
| // CHECK-NEXT: 0x02, 0x01, 0x00, 0x07, 0x05, 0x01, 0x01, 0x62, 0x00, 0x00, 0x0a, 0x06, 0x01, 0x04, 0x00, 0x41, |
| // CHECK-NEXT: 0x20, 0x0b |
| // CHECK-NEXT: ]); |
| // CHECK-NEXT: const inst0 = new WebAssembly.Instance(new WebAssembly.Module(bytes0)); |
| // CHECK-NEXT: const inst1 = new WebAssembly.Instance(new WebAssembly.Module(bytes1)); |
| // CHECK-NEXT: console.log(inst0.exports.a() + inst1.exports.b()); |
| |
| // OUT: 42 |
| |
| // Original module 0 (52 bytes): |
| // (module |
| // (func $unused0 (param i32) (result i32) |
| // (i32.sub (local.get 0) (i32.const 77)) |
| // ) |
| // (func (export "a") (result i32) |
| // (i32.add (i32.const 7) (i32.const 3)) |
| // ) |
| // ) |
| const bytes0 = new Uint8Array([ |
| // Magic ("\0asm") and version (1) |
| 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, |
| // Type section: 2 types |
| 0x01, 0x0a, 0x02, |
| 0x60, 0x01, 0x7f, 0x01, 0x7f, // type 0: (func (param i32) (result i32)) [removed with $unused0] |
| 0x60, 0x00, 0x01, 0x7f, // type 1: (func (result i32)) [kept] |
| // Function section: 2 functions (type 0 [removed], type 1 [kept]) |
| 0x03, 0x03, 0x02, 0x00, 0x01, |
| // Export section: export "a" -> func 1 |
| 0x07, 0x05, 0x01, 0x01, 0x61, 0x00, 0x01, |
| // Code section: 2 function bodies |
| 0x0a, 0x12, 0x02, |
| 0x08, 0x00, 0x20, 0x00, 0x41, 0xcd, 0x00, 0x6b, 0x0b, // func 0 ($unused0): (i32.sub (local.get 0) (i32.const 77)) [removed] |
| 0x07, 0x00, 0x41, 0x07, 0x41, 0x03, 0x6a, 0x0b // func 1 ("a"): (i32.add (i32.const 7) (i32.const 3)) [simplified to (i32.const 10)] |
| ]); |
| |
| // Original module 1 (52 bytes): |
| // (module |
| // (func $unused1 (param i32) (result i32) |
| // (i32.xor (local.get 0) (i32.const 88)) |
| // ) |
| // (func (export "b") (result i32) |
| // (i32.add (i32.const 30) (i32.const 2)) |
| // ) |
| // ) |
| const bytes1 = new Uint8Array([ |
| // Magic ("\0asm") and version (1) |
| 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, |
| // Type section: 2 types |
| 0x01, 0x0a, 0x02, |
| 0x60, 0x01, 0x7f, 0x01, 0x7f, // type 0: (func (param i32) (result i32)) [removed with $unused1] |
| 0x60, 0x00, 0x01, 0x7f, // type 1: (func (result i32)) [kept] |
| // Function section: 2 functions (type 0 [removed], type 1 [kept]) |
| 0x03, 0x03, 0x02, 0x00, 0x01, |
| // Export section: export "b" -> func 1 |
| 0x07, 0x05, 0x01, 0x01, 0x62, 0x00, 0x01, |
| // Code section: 2 function bodies |
| 0x0a, 0x12, 0x02, |
| 0x08, 0x00, 0x20, 0x00, 0x41, 0xd8, 0x00, 0x73, 0x0b, // func 0 ($unused1): (i32.xor (local.get 0) (i32.const 88)) [removed] |
| 0x07, 0x00, 0x41, 0x1e, 0x41, 0x02, 0x6a, 0x0b // func 1 ("b"): (i32.add (i32.const 30) (i32.const 2)) [simplified to (i32.const 32)] |
| ]); |
| const inst0 = new WebAssembly.Instance(new WebAssembly.Module(bytes0)); |
| const inst1 = new WebAssembly.Instance(new WebAssembly.Module(bytes1)); |
| console.log(inst0.exports.a() + inst1.exports.b()); |