New EH representation for MSVC compatibility
[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   cleanupret i8 0 unwind label %bb
32 bb:
33   ret void
34 }
35
36 define void @cleanupret1() personality i32 (...)* @__gxx_personality_v0 {
37 entry:
38   cleanupret void unwind label %bb
39 bb:
40   ret void
41 }
42
43 define void @cleanupret2() personality i32 (...)* @__gxx_personality_v0 {
44 entry:
45   cleanupret i8 0 unwind to caller
46 }
47
48 define void @cleanupret3() personality i32 (...)* @__gxx_personality_v0 {
49   cleanupret void unwind to caller
50 }
51
52 define void @catchret() personality i32 (...)* @__gxx_personality_v0 {
53 entry:
54   br label %bb
55 bb:
56   catchret label %bb
57 }
58
59 define i8 @catchblock() personality i32 (...)* @__gxx_personality_v0 {
60 entry:
61   %cbv = catchblock i8 [i7 4] to label %bb unwind label %bb2
62 bb:
63   ret i8 %cbv
64 bb2:
65   ret i8 42
66 }
67
68 define void @terminateblock0() personality i32 (...)* @__gxx_personality_v0 {
69 entry:
70   terminateblock [i7 4] unwind label %bb
71 bb:
72   ret void
73 }
74
75 define void @terminateblock1() personality i32 (...)* @__gxx_personality_v0 {
76 entry:
77   terminateblock [i7 4] unwind to caller
78 }
79
80 define void @cleanupblock() personality i32 (...)* @__gxx_personality_v0 {
81 entry:
82   cleanupblock void [i7 4]
83   ret void
84 }
85
86 define void @catchendblock0() personality i32 (...)* @__gxx_personality_v0 {
87 entry:
88   catchendblock unwind label %bb
89 bb:
90   ret void
91 }
92
93 define void @catchendblock1() personality i32 (...)* @__gxx_personality_v0 {
94 entry:
95   catchendblock unwind to caller
96 }