xref: /llvm-project/llvm/test/CodeGen/X86/basic-block-sections-eh.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
1; Check if landing pads are kept in a separate eh section
2; RUN: llc -simplifycfg-require-and-preserve-domtree=1 < %s -mtriple=i386-unknown-linux-gnu  -function-sections -basic-block-sections=all -unique-basic-block-section-names | FileCheck %s -check-prefix=LINUX-SECTIONS
3
4@_ZTIb = external dso_local constant ptr
5define i32 @_Z3foob(i1 zeroext %0) #0 personality ptr @__gxx_personality_v0 {
6  %2 = alloca i32, align 4
7  %3 = alloca i8, align 1
8  %4 = alloca ptr
9  %5 = alloca i32
10  %6 = alloca i8, align 1
11  %7 = zext i1 %0 to i8
12  store i8 %7, ptr %3, align 1
13  %8 = load i8, ptr %3, align 1
14  %9 = trunc i8 %8 to i1
15  br i1 %9, label %10, label %11
16
1710:                                               ; preds = %1
18  store i32 1, ptr %2, align 4
19  br label %31
20
2111:                                               ; preds = %1
22  %12 = call ptr @__cxa_allocate_exception(i64 1) #2
23  %13 = load i8, ptr %3, align 1
24  %14 = trunc i8 %13 to i1
25  %15 = zext i1 %14 to i8
26  store i8 %15, ptr %12, align 16
27  invoke void @__cxa_throw(ptr %12, ptr @_ZTIb, ptr null) #3
28          to label %38 unwind label %16
29
3016:                                               ; preds = %11
31  %17 = landingpad { ptr, i32 }
32          catch ptr @_ZTIb
33  %18 = extractvalue { ptr, i32 } %17, 0
34  store ptr %18, ptr %4, align 8
35  %19 = extractvalue { ptr, i32 } %17, 1
36  store i32 %19, ptr %5, align 4
37  br label %20
38
3920:                                               ; preds = %16
40  %21 = load i32, ptr %5, align 4
41  %22 = call i32 @llvm.eh.typeid.for(ptr @_ZTIb) #2
42  %23 = icmp eq i32 %21, %22
43  br i1 %23, label %24, label %33
44
4524:                                               ; preds = %20
46  %25 = load ptr, ptr %4, align 8
47  %26 = call ptr @__cxa_begin_catch(ptr %25) #2
48  %27 = load i8, ptr %26, align 1
49  %28 = trunc i8 %27 to i1
50  %29 = zext i1 %28 to i8
51  store i8 %29, ptr %6, align 1
52  call void @__cxa_end_catch() #2
53  br label %30
54
5530:                                               ; preds = %24
56  store i32 0, ptr %2, align 4
57  br label %31
58
5931:                                               ; preds = %30, %10
60  %32 = load i32, ptr %2, align 4
61  ret i32 %32
62
6333:                                               ; preds = %20
64  %34 = load ptr, ptr %4, align 8
65  %35 = load i32, ptr %5, align 4
66  %36 = insertvalue { ptr, i32 } undef, ptr %34, 0
67  %37 = insertvalue { ptr, i32 } %36, i32 %35, 1
68  resume { ptr, i32 } %37
69
7038:                                               ; preds = %11
71  unreachable
72}
73declare ptr @__cxa_allocate_exception(i64)
74declare void @__cxa_throw(ptr, ptr, ptr)
75declare i32 @__gxx_personality_v0(...)
76; Function Attrs: nounwind readnone
77declare i32 @llvm.eh.typeid.for(ptr) #1
78declare ptr @__cxa_begin_catch(ptr)
79declare void @__cxa_end_catch()
80
81;LINUX-SECTIONS: .section	.text._Z3foob,"ax",@progbits
82;LINUX-SECTIONS: _Z3foob:
83;LINUX-SECTIONS: .section       .text._Z3foob._Z3foob.__part.{{[0-9]+}},"ax",@progbits
84;LINUX-SECTIONS-LABEL: _Z3foob.__part.{{[0-9]+}}:
85;LINUX-SECTIONS:        calll   __cxa_begin_catch
86