[WinEH] Require token linkage in EH pad/ret signatures
[oota-llvm.git] / test / Feature / exception.ll
1 ; RUN: llvm-as < %s | llvm-dis > %t1.ll
2 ; RUN: llvm-as %t1.ll -o - | llvm-dis > %t2.ll
3 ; RUN: diff %t1.ll %t2.ll
4
5 @_ZTIc = external constant i8*
6 @_ZTId = external constant i8*
7 @_ZTIPKc = external constant i8*
8
9 define void @_Z3barv() uwtable optsize ssp personality i32 (...)* @__gxx_personality_v0 {
10 entry:
11   invoke void @_Z3quxv() optsize
12           to label %try.cont unwind label %lpad
13
14 try.cont:                                         ; preds = %entry, %invoke.cont4
15   ret void
16
17 lpad:                                             ; preds = %entry
18   %exn = landingpad {i8*, i32}
19             cleanup
20             catch i8** @_ZTIc
21             filter [2 x i8**] [i8** @_ZTIPKc, i8** @_ZTId]
22   resume { i8*, i32 } %exn
23 }
24
25 declare void @_Z3quxv() optsize
26
27 declare i32 @__gxx_personality_v0(...)
28
29 define void @cleanupret0() personality i32 (...)* @__gxx_personality_v0 {
30 entry:
31   invoke void @_Z3quxv() optsize
32           to label %exit unwind label %pad
33 pad:
34   %cp = cleanuppad [i7 4]
35   cleanupret %cp unwind to caller
36 exit:
37   ret void
38 }
39
40 ; forward ref by name
41 define void @cleanupret1() personality i32 (...)* @__gxx_personality_v0 {
42 entry:
43   invoke void @_Z3quxv() optsize
44           to label %exit unwind label %pad
45 cleanup:
46   cleanupret %cp unwind label %pad
47 pad:
48   %cp = cleanuppad []
49   br label %cleanup
50 exit:
51   ret void
52 }
53
54 ; forward ref by ID
55 define void @cleanupret2() personality i32 (...)* @__gxx_personality_v0 {
56 entry:
57   invoke void @_Z3quxv() optsize
58           to label %exit unwind label %pad
59 cleanup:
60   cleanupret %0 unwind label %pad
61 pad:
62   %0 = cleanuppad []
63   br label %cleanup
64 exit:
65   ret void
66 }
67
68 define void @catchret0() personality i32 (...)* @__gxx_personality_v0 {
69 entry:
70   invoke void @_Z3quxv() optsize
71           to label %exit unwind label %pad
72 pad:
73   %cp = catchpad [i7 4]
74           to label %catch unwind label %endpad
75 catch:
76   catchret %cp to label %exit
77 endpad:
78   catchendpad unwind to caller
79 exit:
80   ret void
81 }
82
83 ; forward ref by name
84 define void @catchret1() personality i32 (...)* @__gxx_personality_v0 {
85 entry:
86   invoke void @_Z3quxv() optsize
87           to label %exit unwind label %pad
88 catch:
89   catchret %cp to label %exit
90 pad:
91   %cp = catchpad []
92           to label %catch unwind label %endpad
93 endpad:
94   catchendpad unwind to caller
95 exit:
96   ret void
97 }
98
99 ; forward ref by ID
100 define void @catchret2() personality i32 (...)* @__gxx_personality_v0 {
101 entry:
102   invoke void @_Z3quxv() optsize
103           to label %exit unwind label %pad
104 catch:
105   catchret %0 to label %exit
106 pad:
107   %0 = catchpad []
108           to label %catch unwind label %endpad
109 endpad:
110   catchendpad unwind to caller
111 exit:
112   ret void
113 }
114
115 define i8 @catchpad() personality i32 (...)* @__gxx_personality_v0 {
116 entry:
117   invoke void @_Z3quxv() optsize
118           to label %exit unwind label %bb2
119 bb2:
120   catchpad [i7 4] to label %exit unwind label %bb3
121 bb3:
122   catchendpad unwind to caller
123 exit:
124   ret i8 0
125 }
126
127 define void @terminatepad0() personality i32 (...)* @__gxx_personality_v0 {
128 entry:
129   br label %try.cont
130
131 try.cont:
132   invoke void @_Z3quxv() optsize
133           to label %try.cont unwind label %bb
134 bb:
135   terminatepad [i7 4] unwind label %bb
136 }
137
138 define void @terminatepad1() personality i32 (...)* @__gxx_personality_v0 {
139 entry:
140   br label %try.cont
141
142 try.cont:
143   invoke void @_Z3quxv() optsize
144           to label %try.cont unwind label %bb
145 bb:
146   terminatepad [i7 4] unwind to caller
147 }
148
149 define void @cleanuppad() personality i32 (...)* @__gxx_personality_v0 {
150 entry:
151   br label %try.cont
152
153 try.cont:
154   invoke void @_Z3quxv() optsize
155           to label %try.cont unwind label %bb
156 bb:
157   cleanuppad [i7 4]
158   ret void
159 }
160
161 define void @catchendpad0() personality i32 (...)* @__gxx_personality_v0 {
162 entry:
163   br label %try.cont
164
165 try.cont:
166   invoke void @_Z3quxv() optsize
167           to label %try.cont unwind label %bb
168 bb:
169   catchendpad unwind label %bb
170 }
171
172 define void @catchendpad1() personality i32 (...)* @__gxx_personality_v0 {
173 entry:
174   br label %try.cont
175
176 try.cont:
177   invoke void @_Z3quxv() optsize
178           to label %try.cont unwind label %bb
179 bb:
180   catchendpad unwind to caller
181 }