aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/MC/WebAssembly/annotations.s
blob: f761ef3f06b1fc1445059417aa06734525c9911a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# 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