| ;; Verify stacky EH binary can be parsed correctly. |
| ;; |
| ;; stacky-eh-old.test.wasm contains below: |
| ;; try |
| ;; nop |
| ;; catch 0 # tag type i32 |
| ;; i32.const 3 |
| ;; local.set 1 |
| ;; local.set 2 |
| ;; |
| ;; (This binary was generated by |
| ;; 'wasm-opt --optimize-level=3 --generate-stack-ir -optimize-stack-ir') |
| ;; |
| ;; This code is 'stacky' in Binaryen parlance. In the binary reader, Binaryen has |
| ;; a special routine of creating a block and a local.get/local.set to read stacky |
| ;; code into Binaryen AST. So if we don't do any post-fixup, the 'catch' block |
| ;; becomes: |
| ;; (catch $e-i32 |
| ;; (local.set 2 |
| ;; (block (result i32) |
| ;; (local.set $new |
| ;; (pop i32) |
| ;; ) |
| ;; (local.set 1 |
| ;; (i32.const 3) |
| ;; ) |
| ;; (local.get $new) |
| ;; ) |
| ;; ) |
| ;; ) |
| ;; Here the 'block' and `local $new' are newly created to read the stacky code. |
| ;; But now the 'pop' ends up nested within the 'block', which is invalid. This |
| ;; test tests if this invalid code is correctly fixed up in the binary reader. |
| ;; The fixup will hoist the 'pop' and create another local to store it right |
| ;; after 'catch'. |
| |
| RUN: wasm-opt -all %s.wasm --print | filecheck %s |
| |
| ;; CHECK: (func $0 |
| ;; CHECK-NEXT: (local $0 i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (try $label$3 |
| ;; CHECK-NEXT: (do |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (catch $tag$0 |
| ;; CHECK-NEXT: (local.set $4 |
| ;; CHECK-NEXT: (pop i32) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (block (result i32) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (local.get $4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |