131 lines
4.0 KiB
ArmAsm
131 lines
4.0 KiB
ArmAsm
# 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
|