xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/funclet-layout.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-pc-windows-msvc"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker%eh.ThrowInfo = type { i32, i32, i32, i32 }
7*9880d681SAndroid Build Coastguard Worker%rtti.TypeDescriptor2 = type { i8**, i8*, [3 x i8] }
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker@"\01??_7type_info@@6B@" = external constant i8*
10*9880d681SAndroid Build Coastguard Worker@"\01??_R0H@8" = internal global %rtti.TypeDescriptor2 { i8** @"\01??_7type_info@@6B@", i8* null, [3 x i8] c".H\00" }
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine void @test1(i1 %B) personality i32 (...)* @__CxxFrameHandler3 {
13*9880d681SAndroid Build Coastguard Workerentry:
14*9880d681SAndroid Build Coastguard Worker  invoke void @g()
15*9880d681SAndroid Build Coastguard Worker          to label %unreachable unwind label %catch.dispatch
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workercatch.dispatch:
18*9880d681SAndroid Build Coastguard Worker  %cs1 = catchswitch within none [label %catch] unwind to caller
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workercatch:
21*9880d681SAndroid Build Coastguard Worker  %cp = catchpad within %cs1 [i8* null, i32 64, i8* null]
22*9880d681SAndroid Build Coastguard Worker  br label %catch.loop
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workercatch.loop:
25*9880d681SAndroid Build Coastguard Worker  br i1 %B, label %catchret, label %catch.loop
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workercatchret:
28*9880d681SAndroid Build Coastguard Worker  catchret from %cp to label %try.cont
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workertry.cont:
31*9880d681SAndroid Build Coastguard Worker  ret void
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerunreachable:
34*9880d681SAndroid Build Coastguard Worker  unreachable
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1:
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; The entry funclet contains %entry and %try.cont
40*9880d681SAndroid Build Coastguard Worker; CHECK: # %entry
41*9880d681SAndroid Build Coastguard Worker; CHECK: # %try.cont
42*9880d681SAndroid Build Coastguard Worker; CHECK: retq
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; The catch funclet contains %catch and %catchret
45*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch{{$}}
46*9880d681SAndroid Build Coastguard Worker; CHECK: # %catchret
47*9880d681SAndroid Build Coastguard Worker; CHECK: retq
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdeclare void @g()
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i1 %B) personality i32 (...)* @__CxxFrameHandler3 {
53*9880d681SAndroid Build Coastguard Workerentry:
54*9880d681SAndroid Build Coastguard Worker  invoke void @_CxxThrowException(i8* null, %eh.ThrowInfo* null) #1
55*9880d681SAndroid Build Coastguard Worker          to label %unreachable unwind label %catch.dispatch
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workercatch.dispatch:                                   ; preds = %entry
58*9880d681SAndroid Build Coastguard Worker  %cs1 = catchswitch within none [label %catch] unwind to caller
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workercatch:                                            ; preds = %catch.dispatch
61*9880d681SAndroid Build Coastguard Worker  %0 = catchpad within %cs1 [i8* null, i32 64, i8* null]
62*9880d681SAndroid Build Coastguard Worker  invoke void @_CxxThrowException(i8* null, %eh.ThrowInfo* null) #1 ["funclet"(token %0)]
63*9880d681SAndroid Build Coastguard Worker          to label %unreachable unwind label %catch.dispatch.1
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workercatch.dispatch.1:                                 ; preds = %catch
66*9880d681SAndroid Build Coastguard Worker  %cs2 = catchswitch within %0 [label %catch.3] unwind to caller
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workercatch.3:                                          ; preds = %catch.dispatch.1
69*9880d681SAndroid Build Coastguard Worker  %1 = catchpad within %cs2 [i8* null, i32 64, i8* null]
70*9880d681SAndroid Build Coastguard Worker  catchret from %1 to label %try.cont
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workertry.cont:                                         ; preds = %catch.3
73*9880d681SAndroid Build Coastguard Worker  catchret from %0 to label %try.cont.5
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workertry.cont.5:                                       ; preds = %try.cont
76*9880d681SAndroid Build Coastguard Worker  ret i32 0
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerunreachable:                                      ; preds = %catch, %entry
79*9880d681SAndroid Build Coastguard Worker  unreachable
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2:
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; The parent function contains %entry and %try.cont.5
85*9880d681SAndroid Build Coastguard Worker; CHECK: .seh_proc
86*9880d681SAndroid Build Coastguard Worker; CHECK: # %entry
87*9880d681SAndroid Build Coastguard Worker; CHECK: # %try.cont.5
88*9880d681SAndroid Build Coastguard Worker; CHECK: retq
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; The inner catch funclet contains %catch.3
91*9880d681SAndroid Build Coastguard Worker; CHECK: .seh_proc
92*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch.3{{$}}
93*9880d681SAndroid Build Coastguard Worker; CHECK: retq
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; The outer catch funclet contains %catch
96*9880d681SAndroid Build Coastguard Worker; CHECK: .seh_proc
97*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch{{$}}
98*9880d681SAndroid Build Coastguard Worker; CHECK: callq _CxxThrowException
99*9880d681SAndroid Build Coastguard Worker; CHECK: # %unreachable
100*9880d681SAndroid Build Coastguard Worker; CHECK: ud2
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine void @test3(i1 %V) #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  invoke void @g()
106*9880d681SAndroid Build Coastguard Worker          to label %try.cont unwind label %catch.dispatch
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workercatch.dispatch:                                   ; preds = %entry
109*9880d681SAndroid Build Coastguard Worker  %cs1 = catchswitch within none [label %catch.2] unwind label %catch.dispatch.1
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workercatch.2:                                          ; preds = %catch.dispatch
112*9880d681SAndroid Build Coastguard Worker  %0 = catchpad within %cs1 [%rtti.TypeDescriptor2* @"\01??_R0H@8", i32 0, i8* null]
113*9880d681SAndroid Build Coastguard Worker  tail call void @exit(i32 0) #2 [ "funclet"(token %0) ]
114*9880d681SAndroid Build Coastguard Worker  unreachable
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workercatch.dispatch.1:                                 ; preds = %catch.dispatch
117*9880d681SAndroid Build Coastguard Worker  %cs2 = catchswitch within none [label %catch] unwind to caller
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workercatch:                                            ; preds = %catch.dispatch.1
120*9880d681SAndroid Build Coastguard Worker  %1 = catchpad within %cs2 [i8* null, i32 64, i8* null]
121*9880d681SAndroid Build Coastguard Worker  tail call void @exit(i32 0) #2 [ "funclet"(token %1) ]
122*9880d681SAndroid Build Coastguard Worker  unreachable
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workertry.cont:                                         ; preds = %entry
125*9880d681SAndroid Build Coastguard Worker  br i1 %V, label %exit_one, label %exit_two
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerexit_one:
128*9880d681SAndroid Build Coastguard Worker  tail call void @exit(i32 0)
129*9880d681SAndroid Build Coastguard Worker  unreachable
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerexit_two:
132*9880d681SAndroid Build Coastguard Worker  tail call void @exit(i32 0)
133*9880d681SAndroid Build Coastguard Worker  unreachable
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3:
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; The entry funclet contains %entry and %try.cont
139*9880d681SAndroid Build Coastguard Worker; CHECK: # %entry
140*9880d681SAndroid Build Coastguard Worker; CHECK: # %try.cont
141*9880d681SAndroid Build Coastguard Worker; CHECK: callq exit
142*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: # exit_one
143*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: # exit_two
144*9880d681SAndroid Build Coastguard Worker; CHECK: ud2
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; The catch(...) funclet contains %catch.2
147*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch.2{{$}}
148*9880d681SAndroid Build Coastguard Worker; CHECK: callq exit
149*9880d681SAndroid Build Coastguard Worker; CHECK: ud2
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker; The catch(int) funclet contains %catch
152*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch{{$}}
153*9880d681SAndroid Build Coastguard Worker; CHECK: callq exit
154*9880d681SAndroid Build Coastguard Worker; CHECK: ud2
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdeclare void @exit(i32) noreturn nounwind
157*9880d681SAndroid Build Coastguard Workerdeclare void @_CxxThrowException(i8*, %eh.ThrowInfo*)
158*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...)
159