[WinEH] Emit EH tables for __CxxFrameHandler3 on 32-bit x86
[oota-llvm.git] / test / CodeGen / X86 / win32-eh.ll
1 ; RUN: llc -mtriple=i686-pc-windows-msvc < %s | FileCheck %s
2
3 declare void @may_throw_or_crash()
4 declare i32 @_except_handler3(...)
5 declare i32 @_except_handler4(...)
6 declare i32 @__CxxFrameHandler3(...)
7 declare void @llvm.eh.begincatch(i8*, i8*)
8 declare void @llvm.eh.endcatch()
9
10 define void @use_except_handler3() {
11   invoke void @may_throw_or_crash()
12       to label %cont unwind label %catchall
13 cont:
14   ret void
15 catchall:
16   landingpad { i8*, i32 } personality i32 (...)* @_except_handler3
17       catch i8* null
18   br label %cont
19 }
20
21 ; CHECK-LABEL: _use_except_handler3:
22 ; CHECK: subl ${{[0-9]+}}, %esp
23 ; CHECK: movl $-1, 12(%esp)
24 ; CHECK: movl $L__ehtable$use_except_handler3, 8(%esp)
25 ; CHECK: movl $__except_handler3, 4(%esp)
26 ; CHECK: movl %fs:0, %[[next:[^ ,]*]]
27 ; CHECK: movl %[[next]], (%esp)
28 ; CHECK: leal (%esp), %[[node:[^ ,]*]]
29 ; CHECK: movl %[[node]], %fs:0
30 ; CHECK: calll _may_throw_or_crash
31 ; CHECK: movl (%esp), %[[next:[^ ,]*]]
32 ; CHECK: movl %[[next]], %fs:0
33 ; CHECK: retl
34
35 define void @use_except_handler4() {
36   invoke void @may_throw_or_crash()
37       to label %cont unwind label %catchall
38 cont:
39   ret void
40 catchall:
41   landingpad { i8*, i32 } personality i32 (...)* @_except_handler4
42       catch i8* null
43   br label %cont
44 }
45
46 ; CHECK-LABEL: _use_except_handler4:
47 ; CHECK: subl ${{[0-9]+}}, %esp
48 ; CHECK: movl %esp, (%esp)
49 ; CHECK: movl $-1, 20(%esp)
50 ; CHECK: movl $L__ehtable$use_except_handler4, 4(%esp)
51 ; CHECK: leal 8(%esp), %[[node:[^ ,]*]]
52 ; CHECK: movl $__except_handler4, 12(%esp)
53 ; CHECK: movl %fs:0, %[[next:[^ ,]*]]
54 ; CHECK: movl %[[next]], 8(%esp)
55 ; CHECK: movl %[[node]], %fs:0
56 ; CHECK: calll _may_throw_or_crash
57 ; CHECK: movl 8(%esp), %[[next:[^ ,]*]]
58 ; CHECK: movl %[[next]], %fs:0
59 ; CHECK: retl
60
61 define void @use_CxxFrameHandler3() {
62   invoke void @may_throw_or_crash()
63       to label %cont unwind label %catchall
64 cont:
65   ret void
66 catchall:
67   %ehvals = landingpad { i8*, i32 } personality i32 (...)* @__CxxFrameHandler3
68       catch i8* null
69   %ehptr = extractvalue { i8*, i32 } %ehvals, 0
70   call void @llvm.eh.begincatch(i8* %ehptr, i8* null)
71   call void @llvm.eh.endcatch()
72   br label %cont
73 }
74
75 ; CHECK-LABEL: _use_CxxFrameHandler3:
76 ; CHECK: subl ${{[0-9]+}}, %esp
77 ; CHECK: movl %esp, (%esp)
78 ; CHECK: movl $-1, 12(%esp)
79 ; CHECK: leal 4(%esp), %[[node:[^ ,]*]]
80 ; CHECK: movl $___ehhandler$use_CxxFrameHandler3, 8(%esp)
81 ; CHECK: movl %fs:0, %[[next:[^ ,]*]]
82 ; CHECK: movl %[[next]], 4(%esp)
83 ; CHECK: movl %[[node]], %fs:0
84 ; CHECK: movl $0, 12(%esp)
85 ; CHECK: calll _may_throw_or_crash
86 ; CHECK: movl 4(%esp), %[[next:[^ ,]*]]
87 ; CHECK: movl %[[next]], %fs:0
88 ; CHECK: retl
89
90 ; CHECK: .section .xdata,"dr"
91 ; CHECK-LABEL: L__ehtable$use_CxxFrameHandler3:
92 ; CHECK-NEXT:  .long   429065506
93 ; CHECK-NEXT:  .long   2
94 ; CHECK-NEXT:  .long   ($stateUnwindMap$use_CxxFrameHandler3)
95 ; CHECK-NEXT:  .long   1
96 ; CHECK-NEXT:  .long   ($tryMap$use_CxxFrameHandler3)
97 ; CHECK-NEXT:  .long   0
98 ; CHECK-NEXT:  .long   0
99 ; CHECK-NEXT:  .long   0
100 ; CHECK-NEXT:  .long   1
101
102 ; CHECK-LABEL: ___ehhandler$use_CxxFrameHandler3:
103 ; CHECK: movl $L__ehtable$use_CxxFrameHandler3, %eax
104 ; CHECK: jmp  ___CxxFrameHandler3 # TAILCALL