blob: a5d86dceea93d4896395cd6bbd1b9d078683062f [file] [log] [blame]
Reid Kleckner5f4dd922015-07-13 17:55:14 +00001; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s --check-prefix=CHECK --check-prefix=X64
2; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s --check-prefix=CHECK --check-prefix=X86
David Majnemera225a192015-03-31 22:35:44 +00003
4; This test case is equivalent to:
5; void f() {
6; try {
7; try {
8; may_throw();
9; } catch (int &) {
10; may_throw();
11; }
12; may_throw();
13; } catch (double) {
14; }
15; }
16
17
18%rtti.TypeDescriptor2 = type { i8**, i8*, [3 x i8] }
19%eh.CatchHandlerType = type { i32, i8* }
20
21$"\01??_R0N@8" = comdat any
22
23$"\01??_R0H@8" = comdat any
24
25@"\01??_7type_info@@6B@" = external constant i8*
26@"\01??_R0N@8" = linkonce_odr global %rtti.TypeDescriptor2 { i8** @"\01??_7type_info@@6B@", i8* null, [3 x i8] c".N\00" }, comdat
27@llvm.eh.handlertype.N.0 = private unnamed_addr constant %eh.CatchHandlerType { i32 0, i8* bitcast (%rtti.TypeDescriptor2* @"\01??_R0N@8" to i8*) }, section "llvm.metadata"
28@"\01??_R0H@8" = linkonce_odr global %rtti.TypeDescriptor2 { i8** @"\01??_7type_info@@6B@", i8* null, [3 x i8] c".H\00" }, comdat
29@llvm.eh.handlertype.H.8 = private unnamed_addr constant %eh.CatchHandlerType { i32 8, i8* bitcast (%rtti.TypeDescriptor2* @"\01??_R0H@8" to i8*) }, section "llvm.metadata"
30
David Majnemer7fddecc2015-06-17 20:52:32 +000031define internal i8* @"\01?f@@YAXXZ.catch"(i8*, i8*) #4 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
David Majnemera225a192015-03-31 22:35:44 +000032entry:
Reid Kleckner60381792015-07-07 22:25:32 +000033 %.i8 = call i8* @llvm.localrecover(i8* bitcast (void ()* @"\01?f@@YAXXZ" to i8*), i8* %1, i32 0)
David Majnemer33370642015-04-03 22:32:26 +000034 %bc2 = bitcast i8* %.i8 to i32**
35 %bc3 = bitcast i32** %bc2 to i8*
David Majnemera225a192015-03-31 22:35:44 +000036 invoke void @"\01?may_throw@@YAXXZ"()
37 to label %invoke.cont2 unwind label %lpad1
38
39invoke.cont2: ; preds = %entry
40 ret i8* blockaddress(@"\01?f@@YAXXZ", %try.cont)
41
42lpad1: ; preds = %entry
David Majnemer7fddecc2015-06-17 20:52:32 +000043 %lp4 = landingpad { i8*, i32 }
David Majnemera225a192015-03-31 22:35:44 +000044 cleanup
45 catch %eh.CatchHandlerType* @llvm.eh.handlertype.N.0
David Blaikie23af6482015-04-16 23:24:18 +000046 %recover = call i8* (...) @llvm.eh.actions(i32 1, i8* bitcast (%eh.CatchHandlerType* @llvm.eh.handlertype.N.0 to i8*), i32 1, i8* (i8*, i8*)* @"\01?f@@YAXXZ.catch1")
David Majnemera225a192015-03-31 22:35:44 +000047 indirectbr i8* %recover, [label %invoke.cont2]
48}
49
50; CHECK-LABEL: "?f@@YAXXZ.catch":
Reid Kleckner3e9fadf2015-04-15 18:48:15 +000051; No code should be generated for the indirectbr.
Reid Kleckner5f4dd922015-07-13 17:55:14 +000052; CHECK-NOT: jmp{{[ql]}} *
53; X64: .seh_handlerdata
54; X64-NEXT: .long ("$cppxdata$?f@@YAXXZ")@IMGREL
David Majnemera225a192015-03-31 22:35:44 +000055
56
David Majnemer7fddecc2015-06-17 20:52:32 +000057define internal i8* @"\01?f@@YAXXZ.catch1"(i8*, i8*) #4 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
David Majnemera225a192015-03-31 22:35:44 +000058entry:
Reid Kleckner60381792015-07-07 22:25:32 +000059 %.i8 = call i8* @llvm.localrecover(i8* bitcast (void ()* @"\01?f@@YAXXZ" to i8*), i8* %1, i32 1)
David Majnemera225a192015-03-31 22:35:44 +000060 %2 = bitcast i8* %.i8 to double*
61 %3 = bitcast double* %2 to i8*
Philip Reamesa3c6f002015-06-26 21:39:44 +000062 invoke void () @llvm.donothing()
David Majnemera225a192015-03-31 22:35:44 +000063 to label %done unwind label %lpad
64
65done:
66 ret i8* blockaddress(@"\01?f@@YAXXZ", %try.cont8)
67
68lpad: ; preds = %entry
David Majnemer7fddecc2015-06-17 20:52:32 +000069 %4 = landingpad { i8*, i32 }
David Majnemera225a192015-03-31 22:35:44 +000070 cleanup
Andrew Kaylor43e1d762015-04-23 00:20:44 +000071 %recover = call i8* (...) @llvm.eh.actions()
David Majnemera225a192015-03-31 22:35:44 +000072 unreachable
73}
74
75; CHECK-LABEL: "?f@@YAXXZ.catch1":
Reid Kleckner3e9fadf2015-04-15 18:48:15 +000076; No code should be generated for the indirectbr.
Reid Kleckner5f4dd922015-07-13 17:55:14 +000077; CHECK-NOT: jmp{{[ql]}} *
78; X64: ".L?f@@YAXXZ.catch1$parent_frame_offset" = 16
79; X64: movq %rdx, 16(%rsp)
80; X64: .seh_handlerdata
81; X64: .long ("$cppxdata$?f@@YAXXZ")@IMGREL
David Majnemera225a192015-03-31 22:35:44 +000082
David Majnemer7fddecc2015-06-17 20:52:32 +000083define void @"\01?f@@YAXXZ"() #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
David Majnemera225a192015-03-31 22:35:44 +000084entry:
David Majnemera225a192015-03-31 22:35:44 +000085 %exn.slot = alloca i8*
86 %ehselector.slot = alloca i32
87 %0 = alloca i32*, align 8
88 %1 = alloca double, align 8
Reid Kleckner60381792015-07-07 22:25:32 +000089 call void (...) @llvm.localescape(i32** %0, double* %1)
David Majnemera225a192015-03-31 22:35:44 +000090 invoke void @"\01?may_throw@@YAXXZ"()
91 to label %invoke.cont unwind label %lpad2
92
93invoke.cont: ; preds = %entry
94 br label %try.cont
95
96lpad2: ; preds = %entry
David Majnemer7fddecc2015-06-17 20:52:32 +000097 %2 = landingpad { i8*, i32 }
David Majnemera225a192015-03-31 22:35:44 +000098 catch %eh.CatchHandlerType* @llvm.eh.handlertype.H.8
99 catch %eh.CatchHandlerType* @llvm.eh.handlertype.N.0
David Blaikie23af6482015-04-16 23:24:18 +0000100 %recover = call i8* (...) @llvm.eh.actions(i32 1, i8* bitcast (%eh.CatchHandlerType* @llvm.eh.handlertype.H.8 to i8*), i32 0, i8* (i8*, i8*)* @"\01?f@@YAXXZ.catch", i32 1, i8* bitcast (%eh.CatchHandlerType* @llvm.eh.handlertype.N.0 to i8*), i32 1, i8* (i8*, i8*)* @"\01?f@@YAXXZ.catch1")
David Majnemera225a192015-03-31 22:35:44 +0000101 indirectbr i8* %recover, [label %try.cont, label %try.cont8]
102
103try.cont: ; preds = %lpad2, %invoke.cont
104 invoke void @"\01?may_throw@@YAXXZ"()
105 to label %try.cont8 unwind label %lpad1
106
107lpad1:
David Majnemer7fddecc2015-06-17 20:52:32 +0000108 %3 = landingpad { i8*, i32 }
David Majnemera225a192015-03-31 22:35:44 +0000109 catch %eh.CatchHandlerType* @llvm.eh.handlertype.N.0
David Blaikie23af6482015-04-16 23:24:18 +0000110 %recover2 = call i8* (...) @llvm.eh.actions(i32 1, i8* bitcast (%eh.CatchHandlerType* @llvm.eh.handlertype.N.0 to i8*), i32 1, i8* (i8*, i8*)* @"\01?f@@YAXXZ.catch1")
David Majnemera225a192015-03-31 22:35:44 +0000111 indirectbr i8* %recover2, [label %try.cont8]
112
113try.cont8: ; preds = %lpad2, %try.cont
114 ret void
115}
116
117; CHECK-LABEL: "?f@@YAXXZ":
Reid Kleckner3e9fadf2015-04-15 18:48:15 +0000118; No code should be generated for the indirectbr.
Reid Kleckner5f4dd922015-07-13 17:55:14 +0000119; CHECK-NOT: jmp{{[ql]}} *
120
121; X64: .seh_handlerdata
122; X64-NEXT: .long ("$cppxdata$?f@@YAXXZ")@IMGREL
123; X86: .section .xdata,"dr"
124
125; CHECK: .align 4
126
127; X64: "$cppxdata$?f@@YAXXZ":
128; X64-NEXT: .long 429065506
129; X64-NEXT: .long 4
130; X64-NEXT: .long ("$stateUnwindMap$?f@@YAXXZ")@IMGREL
131; X64-NEXT: .long 2
132; X64-NEXT: .long ("$tryMap$?f@@YAXXZ")@IMGREL
133; X64-NEXT: .long 6
134; X64-NEXT: .long ("$ip2state$?f@@YAXXZ")@IMGREL
135; X64-NEXT: .long 32
136; X64-NEXT: .long 0
137; X64-NEXT: .long 1
138
139; X86: "L__ehtable$?f@@YAXXZ":
140; X86-NEXT: .long 429065506
141; X86-NEXT: .long 4
142; X86-NEXT: .long ("$stateUnwindMap$?f@@YAXXZ")
143; X86-NEXT: .long 2
144; X86-NEXT: .long ("$tryMap$?f@@YAXXZ")
145; X86-NEXT: .long 0
146; X86-NEXT: .long 0
147; X86-NEXT: .long 0
148; X86-NEXT: .long 1
149
150
David Majnemera225a192015-03-31 22:35:44 +0000151; CHECK-NEXT:"$stateUnwindMap$?f@@YAXXZ":
152; CHECK-NEXT: .long -1
153; CHECK-NEXT: .long 0
154; CHECK-NEXT: .long 0
155; CHECK-NEXT: .long 0
156; CHECK-NEXT: .long 0
157; CHECK-NEXT: .long 0
158; CHECK-NEXT: .long -1
159; CHECK-NEXT: .long 0
160; CHECK-NEXT:"$tryMap$?f@@YAXXZ":
161; CHECK-NEXT: .long 1
162; CHECK-NEXT: .long 1
David Majnemer7f5e7142015-04-03 23:37:34 +0000163; CHECK-NEXT: .long 2
David Majnemera225a192015-03-31 22:35:44 +0000164; CHECK-NEXT: .long 1
Reid Kleckner5f4dd922015-07-13 17:55:14 +0000165; CHECK-NEXT: .long ("$handlerMap$0$?f@@YAXXZ")
David Majnemera225a192015-03-31 22:35:44 +0000166; CHECK-NEXT: .long 0
167; CHECK-NEXT: .long 2
David Majnemer7f5e7142015-04-03 23:37:34 +0000168; CHECK-NEXT: .long 3
David Majnemera225a192015-03-31 22:35:44 +0000169; CHECK-NEXT: .long 1
Reid Kleckner5f4dd922015-07-13 17:55:14 +0000170; CHECK-NEXT: .long ("$handlerMap$1$?f@@YAXXZ")
David Majnemera225a192015-03-31 22:35:44 +0000171; CHECK-NEXT:"$handlerMap$0$?f@@YAXXZ":
172; CHECK-NEXT: .long 8
Reid Kleckner5f4dd922015-07-13 17:55:14 +0000173; CHECK-NEXT: .long "??_R0H@8"
174; CHECK-NEXT: .long "{{.?}}L?f@@YAXXZ$frame_escape_0"
175; CHECK-NEXT: .long "?f@@YAXXZ.catch"
176; X64-NEXT: .long ".L?f@@YAXXZ.catch$parent_frame_offset"
David Majnemera225a192015-03-31 22:35:44 +0000177; CHECK-NEXT:"$handlerMap$1$?f@@YAXXZ":
178; CHECK-NEXT: .long 0
Reid Kleckner5f4dd922015-07-13 17:55:14 +0000179; CHECK-NEXT: .long "??_R0N@8"
180; CHECK-NEXT: .long "{{.?}}L?f@@YAXXZ$frame_escape_1"
181; CHECK-NEXT: .long "?f@@YAXXZ.catch1"
182; X64-NEXT: .long ".L?f@@YAXXZ.catch1$parent_frame_offset"
183
184; X64-NEXT:"$ip2state$?f@@YAXXZ":
185; X64-NEXT: .long .Lfunc_begin0
186; X64-NEXT: .long 2
187; X64-NEXT: .long .Ltmp0
188; X64-NEXT: .long 0
189; X64-NEXT: .long .Lfunc_begin1
190; X64-NEXT: .long 3
191; X64-NEXT: .long .Lfunc_begin2
192; X64-NEXT: .long -1
193; X64-NEXT: .long .Ltmp13
194; X64-NEXT: .long 1
195; X64-NEXT: .long .Ltmp16
196; X64-NEXT: .long 0
197
198
199; X86: "___ehhandler$?f@@YAXXZ": # @"__ehhandler$?f@@YAXXZ"
200; X86: movl $"L__ehtable$?f@@YAXXZ", %eax
201; X86: jmp ___CxxFrameHandler3 # TAILCALL
David Majnemera225a192015-03-31 22:35:44 +0000202
203
204declare void @"\01?may_throw@@YAXXZ"() #1
205
206declare i32 @__CxxFrameHandler3(...)
207
208; Function Attrs: nounwind readnone
209declare i32 @llvm.eh.typeid.for(i8*) #2
210
211; Function Attrs: nounwind
212declare void @llvm.eh.begincatch(i8* nocapture, i8* nocapture) #3
213
214; Function Attrs: nounwind
215declare void @llvm.eh.endcatch() #3
216
217; Function Attrs: nounwind
218declare i8* @llvm.eh.actions(...) #3
219
220; Function Attrs: nounwind
Reid Kleckner60381792015-07-07 22:25:32 +0000221declare void @llvm.localescape(...) #3
David Majnemera225a192015-03-31 22:35:44 +0000222
223; Function Attrs: nounwind readnone
Reid Kleckner60381792015-07-07 22:25:32 +0000224declare i8* @llvm.localrecover(i8*, i8*, i32) #2
David Majnemera225a192015-03-31 22:35:44 +0000225
Philip Reamesa3c6f002015-06-26 21:39:44 +0000226declare void @llvm.donothing()
David Majnemera225a192015-03-31 22:35:44 +0000227
228attributes #0 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" "wineh-parent"="?f@@YAXXZ" }
229attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
230attributes #2 = { nounwind readnone }
231attributes #3 = { nounwind }
232attributes #4 = { "wineh-parent"="?f@@YAXXZ" }