aboutsummaryrefslogtreecommitdiff
path: root/test/Feature/exception.ll
blob: cbe2d0353cc322b0f23c85299758c2671c53f367 (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
131
132
133
134
135
136
; RUN: llvm-as < %s | llvm-dis > %t1.ll
; RUN: llvm-as %t1.ll -o - | llvm-dis > %t2.ll
; RUN: diff %t1.ll %t2.ll

@_ZTIc = external constant i8*
@_ZTId = external constant i8*
@_ZTIPKc = external constant i8*

define void @_Z3barv() uwtable optsize ssp personality i32 (...)* @__gxx_personality_v0 {
entry:
  invoke void @_Z3quxv() optsize
          to label %try.cont unwind label %lpad

try.cont:                                         ; preds = %entry, %invoke.cont4
  ret void

lpad:                                             ; preds = %entry
  %exn = landingpad {i8*, i32}
            cleanup
            catch i8** @_ZTIc
            filter [2 x i8**] [i8** @_ZTIPKc, i8** @_ZTId]
  resume { i8*, i32 } %exn
}

declare void @_Z3quxv() optsize

declare i32 @__gxx_personality_v0(...)

define void @cleanupret0() personality i32 (...)* @__gxx_personality_v0 {
entry:
  invoke void @_Z3quxv() optsize
          to label %exit unwind label %pad
pad:
  %cp = cleanuppad within none [i7 4]
  cleanupret from %cp unwind to caller
exit:
  ret void
}

; forward ref by name
define void @cleanupret1() personality i32 (...)* @__gxx_personality_v0 {
entry:
  invoke void @_Z3quxv() optsize
          to label %exit unwind label %pad
cleanup:
  cleanupret from %cp unwind to caller
pad:
  %cp = cleanuppad within none []
  br label %cleanup
exit:
  ret void
}

; forward ref by ID
define void @cleanupret2() personality i32 (...)* @__gxx_personality_v0 {
entry:
  invoke void @_Z3quxv() optsize
          to label %exit unwind label %pad
cleanup:
  cleanupret from %0 unwind to caller
pad:
  %0 = cleanuppad within none []
  br label %cleanup
exit:
  ret void
}

define void @catchret0() personality i32 (...)* @__gxx_personality_v0 {
entry:
  invoke void @_Z3quxv() optsize
          to label %exit unwind label %pad
pad:
  %cs1 = catchswitch within none [label %catch] unwind to caller
catch:
  %cp = catchpad within %cs1 [i7 4]
  catchret from %cp to label %exit
exit:
  ret void
}

; forward ref by name
define void @catchret1() personality i32 (...)* @__gxx_personality_v0 {
entry:
  invoke void @_Z3quxv() optsize
          to label %exit unwind label %pad
catchret:
  catchret from %cp to label %exit
pad:
  %cs1 = catchswitch within none [label %catch] unwind to caller
catch:
  %cp = catchpad within %cs1 [i7 4]
  br label %catchret
exit:
  ret void
}

; forward ref by ID
define void @catchret2() personality i32 (...)* @__gxx_personality_v0 {
entry:
  invoke void @_Z3quxv() optsize
          to label %exit unwind label %pad
catchret:
  catchret from %0 to label %exit
pad:
  %cs1 = catchswitch within none [label %catch] unwind to caller
catch:
  %0 = catchpad within %cs1 [i7 4]
  br label %catchret
exit:
  ret void
}

define i8 @catchpad() personality i32 (...)* @__gxx_personality_v0 {
entry:
  invoke void @_Z3quxv() optsize
          to label %exit unwind label %bb2
bb2:
  %cs1 = catchswitch within none [label %catch] unwind to caller
catch:
  catchpad within %cs1 [i7 4]
  br label %exit
exit:
  ret i8 0
}

define void @cleanuppad() personality i32 (...)* @__gxx_personality_v0 {
entry:
  br label %try.cont

try.cont:
  invoke void @_Z3quxv() optsize
          to label %try.cont unwind label %bb
bb:
  cleanuppad within none [i7 4]
  ret void
}