diff options
Diffstat (limited to 'test/lit/binary/stacky-eh.test')
-rw-r--r-- | test/lit/binary/stacky-eh.test | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/test/lit/binary/stacky-eh.test b/test/lit/binary/stacky-eh.test new file mode 100644 index 000000000..09406bfea --- /dev/null +++ b/test/lit/binary/stacky-eh.test @@ -0,0 +1,66 @@ +# Verify stacky EH binary can be parsed correctly. +# +# stacky-eh.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: ) |