1 ; RUN: llc -verify-machineinstrs -mtriple=i686-pc-windows-msvc < %s | FileCheck --check-prefix=X86 %s
2 ; RUN: llc -verify-machineinstrs -mtriple=x86_64-pc-windows-msvc < %s | FileCheck --check-prefix=X64 %s
4 %rtti.TypeDescriptor2 = type { ptr, ptr, [3 x i8] }
5 %eh.CatchableType = type { i32, ptr, i32, i32, i32, i32, ptr }
6 %eh.CatchableTypeArray.1 = type { i32, [1 x ptr] }
7 %eh.ThrowInfo = type { i32, ptr, ptr, ptr }
9 $"\01??_R0H@8" = comdat any
11 @"\01??_7type_info@@6B@" = external constant ptr
12 @"\01??_R0H@8" = linkonce_odr global %rtti.TypeDescriptor2 { ptr @"\01??_7type_info@@6B@", ptr null, [3 x i8] c".H\00" }, comdat
15 declare void @useints(...)
16 declare void @f(i32 %p)
17 declare i32 @__CxxFrameHandler3(...)
19 define i32 @try_catch_catch() personality ptr @__CxxFrameHandler3 {
21 %a = call i32 @getint()
22 %b = call i32 @getint()
23 %c = call i32 @getint()
24 %d = call i32 @getint()
25 call void (...) @useints(i32 %a, i32 %b, i32 %c, i32 %d)
27 to label %try.cont unwind label %catch.dispatch
33 %cs = catchswitch within none [label %handler1] unwind to caller
36 %h1 = catchpad within %cs [ptr @"\01??_R0H@8", i32 0, ptr null]
37 call void @f(i32 2) [ "funclet"(token %h1) ]
38 catchret from %h1 to label %try.cont
41 ; X86-LABEL: _try_catch_catch:
43 ; X86: movl %esp, %ebp
47 ; X86: subl ${{[0-9]+}}, %esp
53 ; X86: movl $0, -{{[0-9]+}}(%ebp)
56 ; X86: [[contbb:LBB0_[0-9]+]]: # %try.cont
63 ; X86: [[restorebb:LBB0_[0-9]+]]:
67 ; X86: "?catch$[[catch1bb:[0-9]+]]@?0?try_catch_catch@4HA":
68 ; X86: LBB0_[[catch1bb]]: # %handler1{{$}}
73 ; X86: movl $1, -{{[0-9]+}}(%ebp)
76 ; X86: movl $[[restorebb]], %eax
77 ; X86-NEXT: addl $16, %esp
81 ; X86: L__ehtable$try_catch_catch:
82 ; X86: $handlerMap$0$try_catch_catch:
84 ; X86: .long "??_R0H@8"
86 ; X86: .long "?catch$[[catch1bb]]@?0?try_catch_catch@4HA"
88 ; X64-LABEL: try_catch_catch:
90 ; X64: .seh_pushreg %rbp
92 ; X64: .seh_pushreg %rsi
94 ; X64: .seh_pushreg %rdi
96 ; X64: .seh_pushreg %rbx
98 ; X64: .seh_stackalloc 40
99 ; X64: leaq 32(%rsp), %rbp
100 ; X64: .seh_setframe %rbp, 32
101 ; X64: .seh_endprologue
102 ; X64: movq $-2, (%rbp)
110 ; X64: [[contbb:\.LBB0_[0-9]+]]: # Block address taken
111 ; X64-NEXT: # %try.cont
112 ; X64: addq $40, %rsp
116 ; X64: "?catch$[[catch1bb:[0-9]+]]@?0?try_catch_catch@4HA":
117 ; X64: LBB0_[[catch1bb]]: # %handler1{{$}}
118 ; X64: movq %rdx, 16(%rsp)
120 ; X64: .seh_pushreg %rbp
122 ; X64: .seh_pushreg %rsi
124 ; X64: .seh_pushreg %rdi
126 ; X64: .seh_pushreg %rbx
127 ; X64: subq $40, %rsp
128 ; X64: .seh_stackalloc 40
129 ; X64: leaq 32(%rdx), %rbp
130 ; X64: .seh_endprologue
133 ; X64: leaq [[contbb]](%rip), %rax
134 ; X64: addq $40, %rsp
141 ; X64: $handlerMap$0$try_catch_catch:
143 ; X64: .long "??_R0H@8"@IMGREL
145 ; X64: .long "?catch$[[catch1bb]]@?0?try_catch_catch@4HA"@IMGREL
148 define i32 @try_one_csr() personality ptr @__CxxFrameHandler3 {
150 %a = call i32 @getint()
151 %b = call i32 @getint()
152 call void (...) @useints(i32 %a)
153 invoke void @f(i32 1)
154 to label %try.cont unwind label %catch.dispatch
157 %cs = catchswitch within none [label %handler1] unwind to caller
160 %0 = catchpad within %cs [ptr @"\01??_R0H@8", i32 0, ptr null]
161 catchret from %0 to label %try.cont
167 ; X64-LABEL: try_one_csr:
169 ; X64: .seh_pushreg %rbp
171 ; X64: .seh_pushreg %rsi
173 ; X64: subq $40, %rsp
174 ; X64: .seh_stackalloc 40
175 ; X64: leaq 32(%rsp), %rbp
176 ; X64: .seh_setframe %rbp, 32
177 ; X64: .seh_endprologue
183 ; X64: [[contbb:\.LBB1_[0-9]+]]: # Block address taken
184 ; X64-NEXT: # %try.cont
185 ; X64: addq $40, %rsp
191 ; X64: "?catch$[[catch1bb:[0-9]+]]@?0?try_one_csr@4HA":
192 ; X64: LBB1_[[catch1bb]]: # %handler1{{$}}
193 ; X64: movq %rdx, 16(%rsp)
195 ; X64: .seh_pushreg %rbp
197 ; X64: .seh_pushreg %rsi
198 ; X64: subq $40, %rsp
199 ; X64: .seh_stackalloc 40
200 ; X64: leaq 32(%rdx), %rbp
201 ; X64: .seh_endprologue
202 ; X64: leaq [[contbb]](%rip), %rax
203 ; X64: addq $40, %rsp
208 ; X64: $handlerMap$0$try_one_csr:
210 ; X64: .long "??_R0H@8"@IMGREL
212 ; X64: .long "?catch$[[catch1bb]]@?0?try_one_csr@4HA"@IMGREL
215 define i32 @try_no_csr() personality ptr @__CxxFrameHandler3 {
217 invoke void @f(i32 1)
218 to label %try.cont unwind label %catch.dispatch
221 %cs = catchswitch within none [label %handler1] unwind to caller
224 %cp1 = catchpad within %cs [ptr @"\01??_R0H@8", i32 0, ptr null]
225 catchret from %cp1 to label %try.cont
231 ; X64-LABEL: try_no_csr:
233 ; X64: .seh_pushreg %rbp
235 ; X64: subq $48, %rsp
236 ; X64: .seh_stackalloc 48
237 ; X64: leaq 48(%rsp), %rbp
238 ; X64: .seh_setframe %rbp, 48
239 ; X64: .seh_endprologue
242 ; X64: [[contbb:\.LBB2_[0-9]+]]: # Block address taken
243 ; X64-NEXT: # %try.cont
244 ; X64: addq $48, %rsp
249 ; X64: "?catch$[[catch1bb:[0-9]+]]@?0?try_no_csr@4HA":
250 ; X64: LBB2_[[catch1bb]]: # %handler1{{$}}
251 ; X64: movq %rdx, 16(%rsp)
253 ; X64: .seh_pushreg %rbp
254 ; X64: subq $32, %rsp
255 ; X64: .seh_stackalloc 32
256 ; X64: leaq 48(%rdx), %rbp
257 ; X64: .seh_endprologue
258 ; X64: leaq [[contbb]](%rip), %rax
259 ; X64: addq $32, %rsp
263 ; X64: $handlerMap$0$try_no_csr:
265 ; X64: .long "??_R0H@8"@IMGREL
267 ; X64: .long "?catch$[[catch1bb]]@?0?try_no_csr@4HA"@IMGREL