# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+exception-handling < %s | FileCheck %s # Tests if block/loop/try/catch/end/branch/rethrow instructions are correctly # printed with their annotations. .text .section .text.test_annotation,"",@ .type test_annotation,@function test_annotation: .functype test_annotation (exnref) -> () .tagtype __cpp_exception i32 .tagtype __c_longjmp i32 try br 0 catch __cpp_exception drop block i32.const 0 br_if 0 loop i32.const 0 br_if 1 end_loop end_block try rethrow 0 catch __cpp_exception drop catch_all block try br 0 try delegate 1 catch_all end_try end_block rethrow 0 end_try end_try block exnref block block () -> (i32, exnref) block i32 try_table (catch __cpp_exception 0) (catch_ref __c_longjmp 1) (catch_all 2) (catch_all_ref 3) end_try_table return end_block return end_block return end_block return end_block drop i32.const 0 loop (i32) -> () local.get 0 loop (exnref) -> () try_table (catch __cpp_exception 1) (catch_all_ref 0) end_try_table drop end_loop drop end_loop end_function # CHECK: test_annotation: # CHECK: try # CHECK-NEXT: br 0 # 0: down to label0 # CHECK-NEXT: catch __cpp_exception # catch0: # CHECK-NEXT: drop # CHECK-NEXT: block # CHECK-NEXT: i32.const 0 # CHECK-NEXT: br_if 0 # 0: down to label1 # CHECK-NEXT: loop # label2: # CHECK-NEXT: i32.const 0 # CHECK-NEXT: br_if 1 # 1: down to label1 # CHECK-NEXT: end_loop # CHECK-NEXT: end_block # label1: # CHECK-NEXT: try # CHECK-NEXT: rethrow 0 # down to catch3 # CHECK-NEXT: catch __cpp_exception # catch3: # CHECK-NEXT: drop # CHECK-NEXT: catch_all{{$}} # CHECK-NEXT: block # CHECK-NEXT: try # CHECK-NEXT: br 0 # 0: down to label5 # CHECK-NEXT: try # CHECK-NEXT: delegate 1 # label/catch6: down to catch4 # CHECK-NEXT: catch_all # catch5: # CHECK-NEXT: end_try # label5: # CHECK-NEXT: end_block # label4: # CHECK-NEXT: rethrow 0 # to caller # CHECK-NEXT: end_try # label3: # CHECK-NEXT: end_try # label0: # CHECK: block exnref # CHECK-NEXT: block # CHECK-NEXT: block () -> (i32, exnref) # CHECK-NEXT: block i32 # CHECK-NEXT: try_table (catch __cpp_exception 0) (catch_ref __c_longjmp 1) (catch_all 2) (catch_all_ref 3) # 0: down to label10 # CHECK-NEXT: # 1: down to label9 # CHECK-NEXT: # 2: down to label8 # CHECK-NEXT: # 3: down to label7 # CHECK-NEXT: end_try_table # label11: # CHECK-NEXT: return # CHECK-NEXT: end_block # label10: # CHECK-NEXT: return # CHECK-NEXT: end_block # label9: # CHECK-NEXT: return # CHECK-NEXT: end_block # label8: # CHECK-NEXT: return # CHECK-NEXT: end_block # label7: # CHECK-NEXT: drop # CHECK: i32.const 0 # CHECK-NEXT: loop (i32) -> () # label12: # CHECK-NEXT: local.get 0 # CHECK-NEXT: loop (exnref) -> () # label13: # CHECK-NEXT: try_table (catch __cpp_exception 1) (catch_all_ref 0) # 1: up to label12 # CHECK-NEXT: # 0: up to label13 # CHECK-NEXT: end_try_table # label14: # CHECK-NEXT: drop # CHECK-NEXT: end_loop # CHECK-NEXT: drop # CHECK-NEXT: end_loop # CHECK-NEXT: end_function