xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/win-cleanuppad.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -mtriple=i686-pc-windows-msvc < %s | FileCheck --check-prefix=X86 %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -mtriple=x86_64-pc-windows-msvc < %s | FileCheck --check-prefix=X64 %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker%struct.Dtor = type { i8 }
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine void @simple_cleanup() #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker  %o = alloca %struct.Dtor, align 1
9*9880d681SAndroid Build Coastguard Worker  invoke void @f(i32 1)
10*9880d681SAndroid Build Coastguard Worker          to label %invoke.cont unwind label %ehcleanup
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerinvoke.cont:                                      ; preds = %entry
13*9880d681SAndroid Build Coastguard Worker  call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o) #2
14*9880d681SAndroid Build Coastguard Worker  ret void
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerehcleanup:                                        ; preds = %entry
17*9880d681SAndroid Build Coastguard Worker  %0 = cleanuppad within none []
18*9880d681SAndroid Build Coastguard Worker  call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o) #2 [ "funclet"(token %0) ]
19*9880d681SAndroid Build Coastguard Worker  cleanupret from %0 unwind to caller
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; CHECK: simple_cleanup:                         # @simple_cleanup
23*9880d681SAndroid Build Coastguard Worker; CHECK:         pushq   %rbp
24*9880d681SAndroid Build Coastguard Worker; CHECK:         subq    $48, %rsp
25*9880d681SAndroid Build Coastguard Worker; CHECK:         leaq    48(%rsp), %rbp
26*9880d681SAndroid Build Coastguard Worker; CHECK:         movq    $-2, -8(%rbp)
27*9880d681SAndroid Build Coastguard Worker; CHECK:         movl    $1, %ecx
28*9880d681SAndroid Build Coastguard Worker; CHECK:         callq   f
29*9880d681SAndroid Build Coastguard Worker; CHECK:         callq   "??1Dtor@@QAE@XZ"
30*9880d681SAndroid Build Coastguard Worker; CHECK:         nop
31*9880d681SAndroid Build Coastguard Worker; CHECK:         addq    $48, %rsp
32*9880d681SAndroid Build Coastguard Worker; CHECK:         popq    %rbp
33*9880d681SAndroid Build Coastguard Worker; CHECK:         retq
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; CHECK: "?dtor$2@?0?simple_cleanup@4HA":
36*9880d681SAndroid Build Coastguard Worker; CHECK:         callq   "??1Dtor@@QAE@XZ"
37*9880d681SAndroid Build Coastguard Worker; CHECK:         retq
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK: $cppxdata$simple_cleanup:
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   429065506
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   1
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   ($stateUnwindMap$simple_cleanup)@IMGREL
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   0
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   0
45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   3
46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   ($ip2state$simple_cleanup)@IMGREL
47*9880d681SAndroid Build Coastguard Worker; UnwindHelp offset should match the -2 store above
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   40
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   0
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:         .long   1
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerdeclare void @f(i32) #0
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...)
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind
57*9880d681SAndroid Build Coastguard Workerdeclare x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor*) #1
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine void @nested_cleanup() #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker  %o1 = alloca %struct.Dtor, align 1
62*9880d681SAndroid Build Coastguard Worker  %o2 = alloca %struct.Dtor, align 1
63*9880d681SAndroid Build Coastguard Worker  invoke void @f(i32 1)
64*9880d681SAndroid Build Coastguard Worker          to label %invoke.cont unwind label %cleanup.outer
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerinvoke.cont:                                      ; preds = %entry
67*9880d681SAndroid Build Coastguard Worker  invoke void @f(i32 2)
68*9880d681SAndroid Build Coastguard Worker          to label %invoke.cont.1 unwind label %cleanup.inner
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerinvoke.cont.1:                                    ; preds = %invoke.cont
71*9880d681SAndroid Build Coastguard Worker  call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o2) #2
72*9880d681SAndroid Build Coastguard Worker  invoke void @f(i32 3)
73*9880d681SAndroid Build Coastguard Worker          to label %invoke.cont.2 unwind label %cleanup.outer
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerinvoke.cont.2:                                    ; preds = %invoke.cont.1
76*9880d681SAndroid Build Coastguard Worker  call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o1) #2
77*9880d681SAndroid Build Coastguard Worker  ret void
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workercleanup.inner:                                        ; preds = %invoke.cont
80*9880d681SAndroid Build Coastguard Worker  %0 = cleanuppad within none []
81*9880d681SAndroid Build Coastguard Worker  call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o2) #2 [ "funclet"(token %0) ]
82*9880d681SAndroid Build Coastguard Worker  cleanupret from %0 unwind label %cleanup.outer
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workercleanup.outer:                                      ; preds = %invoke.cont.1, %cleanup.inner, %entry
85*9880d681SAndroid Build Coastguard Worker  %1 = cleanuppad within none []
86*9880d681SAndroid Build Coastguard Worker  call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o1) #2 [ "funclet"(token %1) ]
87*9880d681SAndroid Build Coastguard Worker  cleanupret from %1 unwind to caller
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; X86-LABEL: _nested_cleanup:
91*9880d681SAndroid Build Coastguard Worker; X86: pushl   $1
92*9880d681SAndroid Build Coastguard Worker; X86: calll   _f
93*9880d681SAndroid Build Coastguard Worker; X86: pushl   $2
94*9880d681SAndroid Build Coastguard Worker; X86: calll   _f
95*9880d681SAndroid Build Coastguard Worker; X86: pushl   $3
96*9880d681SAndroid Build Coastguard Worker; X86: calll   _f
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker; X86: "?dtor$[[cleanup_inner:[0-9]+]]@?0?nested_cleanup@4HA":
99*9880d681SAndroid Build Coastguard Worker; X86: LBB1_[[cleanup_inner]]: # %cleanup.inner{{$}}
100*9880d681SAndroid Build Coastguard Worker; X86: pushl %ebp
101*9880d681SAndroid Build Coastguard Worker; X86: leal    {{.*}}(%ebp), %ecx
102*9880d681SAndroid Build Coastguard Worker; X86: calll   "??1Dtor@@QAE@XZ"
103*9880d681SAndroid Build Coastguard Worker; X86: popl %ebp
104*9880d681SAndroid Build Coastguard Worker; X86: retl
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker; X86: "?dtor$[[cleanup_outer:[0-9]+]]@?0?nested_cleanup@4HA":
107*9880d681SAndroid Build Coastguard Worker; X86: LBB1_[[cleanup_outer]]: # %cleanup.outer{{$}}
108*9880d681SAndroid Build Coastguard Worker; X86: pushl %ebp
109*9880d681SAndroid Build Coastguard Worker; X86: leal    {{.*}}(%ebp), %ecx
110*9880d681SAndroid Build Coastguard Worker; X86: calll   "??1Dtor@@QAE@XZ"
111*9880d681SAndroid Build Coastguard Worker; X86: popl %ebp
112*9880d681SAndroid Build Coastguard Worker; X86: retl
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; X86: L__ehtable$nested_cleanup:
115*9880d681SAndroid Build Coastguard Worker; X86:         .long   429065506
116*9880d681SAndroid Build Coastguard Worker; X86:         .long   2
117*9880d681SAndroid Build Coastguard Worker; X86:         .long   ($stateUnwindMap$nested_cleanup)
118*9880d681SAndroid Build Coastguard Worker; X86:         .long   0
119*9880d681SAndroid Build Coastguard Worker; X86:         .long   0
120*9880d681SAndroid Build Coastguard Worker; X86:         .long   0
121*9880d681SAndroid Build Coastguard Worker; X86:         .long   0
122*9880d681SAndroid Build Coastguard Worker; X86:         .long   0
123*9880d681SAndroid Build Coastguard Worker; X86:         .long   1
124*9880d681SAndroid Build Coastguard Worker; X86: $stateUnwindMap$nested_cleanup:
125*9880d681SAndroid Build Coastguard Worker; X86:         .long   -1
126*9880d681SAndroid Build Coastguard Worker; X86:         .long   "?dtor$[[cleanup_outer]]@?0?nested_cleanup@4HA"
127*9880d681SAndroid Build Coastguard Worker; X86:         .long   0
128*9880d681SAndroid Build Coastguard Worker; X86:         .long   "?dtor$[[cleanup_inner]]@?0?nested_cleanup@4HA"
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; X64-LABEL: nested_cleanup:
131*9880d681SAndroid Build Coastguard Worker; X64: .Lfunc_begin1:
132*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp13:
133*9880d681SAndroid Build Coastguard Worker; X64: movl    $1, %ecx
134*9880d681SAndroid Build Coastguard Worker; X64: callq   f
135*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp15:
136*9880d681SAndroid Build Coastguard Worker; X64: movl    $2, %ecx
137*9880d681SAndroid Build Coastguard Worker; X64: callq   f
138*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp16:
139*9880d681SAndroid Build Coastguard Worker; X64: callq   "??1Dtor@@QAE@XZ"
140*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp17:
141*9880d681SAndroid Build Coastguard Worker; X64: movl    $3, %ecx
142*9880d681SAndroid Build Coastguard Worker; X64: callq   f
143*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp18:
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; X64: "?dtor$[[cleanup_inner:[0-9]+]]@?0?nested_cleanup@4HA":
146*9880d681SAndroid Build Coastguard Worker; X64: LBB1_[[cleanup_inner]]: # %cleanup.inner{{$}}
147*9880d681SAndroid Build Coastguard Worker; X64: pushq %rbp
148*9880d681SAndroid Build Coastguard Worker; X64: leaq    {{.*}}(%rbp), %rcx
149*9880d681SAndroid Build Coastguard Worker; X64: callq   "??1Dtor@@QAE@XZ"
150*9880d681SAndroid Build Coastguard Worker; X64: popq %rbp
151*9880d681SAndroid Build Coastguard Worker; X64: retq
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; X64:        .seh_handlerdata
154*9880d681SAndroid Build Coastguard Worker; X64:        .text
155*9880d681SAndroid Build Coastguard Worker; X64:        .seh_endproc
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; X64: "?dtor$[[cleanup_outer:[0-9]+]]@?0?nested_cleanup@4HA":
158*9880d681SAndroid Build Coastguard Worker; X64: LBB1_[[cleanup_outer]]: # %cleanup.outer{{$}}
159*9880d681SAndroid Build Coastguard Worker; X64: pushq %rbp
160*9880d681SAndroid Build Coastguard Worker; X64: leaq    {{.*}}(%rbp), %rcx
161*9880d681SAndroid Build Coastguard Worker; X64: callq   "??1Dtor@@QAE@XZ"
162*9880d681SAndroid Build Coastguard Worker; X64: popq %rbp
163*9880d681SAndroid Build Coastguard Worker; X64: retq
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker; X64:        .section .xdata,"dr"
166*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .p2align  2
167*9880d681SAndroid Build Coastguard Worker; X64: $cppxdata$nested_cleanup:
168*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   429065506
169*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   2
170*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   ($stateUnwindMap$nested_cleanup)@IMGREL
171*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   0
172*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   0
173*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   5
174*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   ($ip2state$nested_cleanup)@IMGREL
175*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   56
176*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   0
177*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   1
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker; X64: $stateUnwindMap$nested_cleanup:
180*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   -1
181*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   "?dtor$[[cleanup_outer]]@?0?nested_cleanup@4HA"@IMGREL
182*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   0
183*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   "?dtor$[[cleanup_inner]]@?0?nested_cleanup@4HA"@IMGREL
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker; X64: $ip2state$nested_cleanup:
186*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   .Lfunc_begin1@IMGREL
187*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   -1
188*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   .Ltmp13@IMGREL
189*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   0
190*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   .Ltmp15@IMGREL
191*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   1
192*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   .Ltmp17@IMGREL
193*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   0
194*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   .Ltmp18@IMGREL+1
195*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long   -1
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerattributes #0 = { "disable-tail-calls"="false" "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" }
198*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind "disable-tail-calls"="false" "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" }
199*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind }
200