xref: /llvm-project/llvm/test/CodeGen/X86/gcc_except_table_bb_sections.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
1; RUN: llc -basic-block-sections=all -mtriple x86_64-pc-linux-gnu -code-model=small < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SMALL,CHECK-NON-PIC,CHECK-NON-PIC-SMALL,CHECK-NON-PIC-X64
2; RUN: llc -basic-block-sections=all -mtriple x86_64-pc-linux-gnux32 -code-model=small < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SMALL,CHECK-NON-PIC,CHECK-NON-PIC-SMALL,CHECK-NON-PIC-X32
3; RUN: llc -basic-block-sections=all -mtriple x86_64-pc-linux-gnu -code-model=medium < %s | FileCheck %s --check-prefixes=CHECK,CHECK-MEDIUM,CHECK-NON-PIC,CHECK-NON-PIC-MEDIUM,CHECK-NON-PIC-X64
4; RUN: llc -basic-block-sections=all -mtriple x86_64-pc-linux-gnu -code-model=large < %s | FileCheck %s --check-prefixes=CHECK,CHECK-NON-PIC,CHECK-NON-PIC-LARGE,CHECK-NON-PIC-X64
5; RUN: llc -basic-block-sections=all -mtriple x86_64-pc-linux-gnu -relocation-model=pic -code-model=small < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SMALL,CHECK-PIC,CHECK-PIC-SMALL,CHECK-PIC-X64
6; RUN: llc -basic-block-sections=all -mtriple x86_64-pc-linux-gnux32 -relocation-model=pic -code-model=small < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SMALL,CHECK-PIC,CHECK-PIC-SMALL,CHECK-PIC-X32
7; RUN: llc -basic-block-sections=all -mtriple x86_64-pc-linux-gnu -relocation-model=pic -code-model=medium < %s | FileCheck %s --check-prefixes=CHECK,CHECK-MEDIUM,CHECK-PIC,CHECK-PIC-MEDIUM,CHECK-PIC-X64
8; RUN: llc -basic-block-sections=all -mtriple x86_64-pc-linux-gnu -relocation-model=pic -code-model=large < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PIC,CHECK-PIC-LARGE,CHECK-PIC-X64
9@_ZTIi = external constant ptr
10
11define i32 @main() uwtable optsize ssp personality ptr @__gxx_personality_v0 {
12; Verify that each basic block section gets its own LSDA exception symbol.
13;
14; CHECK-LABEL:        main:
15; CHECK-NEXT:         .Lfunc_begin0:
16; CHECK-NEXT:           .cfi_startproc
17
18;; Verify personality function and LSDA encoding for NON-PIC mode.
19; PersonalityEncoding = dwarf::DW_EH_PE_udata4 (small/medium)
20; PersonalityEncoding = dwarf::DW_EH_PE_absptr (large)
21; CHECK-NON-PIC-SMALL-NEXT:  .cfi_personality 3, __gxx_personality_v0
22; CHECK-NON-PIC-MEDIUM-NEXT: .cfi_personality 3, __gxx_personality_v0
23; CHECK-NON-PIC-LARGE-NEXT:  .cfi_personality 0, __gxx_personality_v0
24; LSDAEncoding = dwarf::DW_EH_PE_udata4 (small)
25; LSDAEncoding = dwarf::DW_EH_PE_absptr (medium/large)
26; CHECK-NON-PIC-SMALL-NEXT:  .cfi_lsda 3, .Lexception0
27; CHECK-NON-PIC-MEDIUM-NEXT: .cfi_lsda 0, .Lexception0
28; CHECK-NON-PIC-LARGE-NEXT:  .cfi_lsda 0, .Lexception0
29
30;; Verify personality function and LSDA encoding for PIC mode.
31; PersonalityEncoding = DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4 (small/medium)
32; PersonalityEncoding = DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata8 (large)
33; CHECK-PIC-SMALL-NEXT:  .cfi_personality 155, DW.ref.__gxx_personality_v0
34; CHECK-PIC-MEDIUM-NEXT: .cfi_personality 155, DW.ref.__gxx_personality_v0
35; CHECK-PIC-LARGE-NEXT:  .cfi_personality 156, DW.ref.__gxx_personality_v0
36; LSDAEncoding = DW_EH_PE_pcrel | DW_EH_PE_sdata4 (small)
37; LSDAEncoding = DW_EH_PE_pcrel | DW_EH_PE_sdata8 (medium/large)
38; CHECK-PIC-SMALL-NEXT:  .cfi_lsda 27, .Lexception0
39; CHECK-PIC-MEDIUM-NEXT: .cfi_lsda 28, .Lexception0
40; CHECK-PIC-LARGE-NEXT:  .cfi_lsda 28, .Lexception0
41
42; CHECK-LABEL:        .Ltmp0:
43; CHECK-SMALL-NEXT:     callq   _Z1fv
44; CHECK-MEDIUM-NEXT:    callq   _Z1fv
45; CHECK-NON-PIC-LARGE-NEXT: movabsq $_Z1fv, %rax
46; CHECK-NON-PIC-LARGE-NEXT: callq   *%rax
47; CHECK-PIC-LARGE-NEXT:     movabsq $_Z1fv@GOT, %rax
48; CHECK-PIC-LARGE-NEXT:     callq *(%rbx,%rax)
49; CHECK-LABEL:        .Ltmp1:
50
51; CHECK-NOT:            .cfi_lsda
52
53; CHECK-LABEL:        main.__part.1:
54; CHECK-NEXT:           .cfi_startproc
55
56; CHECK-NON-PIC-SMALL-NEXT:  .cfi_personality 3, __gxx_personality_v0
57; CHECK-NON-PIC-MEDIUM-NEXT: .cfi_personality 3, __gxx_personality_v0
58; CHECK-NON-PIC-LARGE-NEXT:  .cfi_personality 0, __gxx_personality_v0
59; CHECK-NON-PIC-SMALL-NEXT:  .cfi_lsda 3, .Lexception1
60; CHECK-NON-PIC-MEDIUM-NEXT: .cfi_lsda 0, .Lexception1
61; CHECK-NON-PIC-LARGE-NEXT:  .cfi_lsda 0, .Lexception1
62
63; CHECK-PIC-SMALL-NEXT:  .cfi_personality 155, DW.ref.__gxx_personality_v0
64; CHECK-PIC-MEDIUM-NEXT: .cfi_personality 155, DW.ref.__gxx_personality_v0
65; CHECK-PIC-LARGE-NEXT:  .cfi_personality 156, DW.ref.__gxx_personality_v0
66; CHECK-PIC-SMALL-NEXT:  .cfi_lsda 27, .Lexception1
67; CHECK-PIC-MEDIUM-NEXT: .cfi_lsda 28, .Lexception1
68; CHECK-PIC-LARGE-NEXT:  .cfi_lsda 28, .Lexception1
69
70; CHECK-NOT:            .cfi_lsda
71
72; CHECK-LABEL:        main.__part.2:
73; CHECK-NEXT:           .cfi_startproc
74
75; CHECK-NON-PIC-SMALL-NEXT:  .cfi_personality 3, __gxx_personality_v0
76; CHECK-NON-PIC-MEDIUM-NEXT: .cfi_personality 3, __gxx_personality_v0
77; CHECK-NON-PIC-LARGE-NEXT:  .cfi_personality 0, __gxx_personality_v0
78; CHECK-NON-PIC-SMALL-NEXT:  .cfi_lsda 3, .Lexception2
79; CHECK-NON-PIC-MEDIUM-NEXT: .cfi_lsda 0, .Lexception2
80; CHECK-NON-PIC-LARGE-NEXT:  .cfi_lsda 0, .Lexception2
81
82; CHECK-PIC-SMALL-NEXT:  .cfi_personality 155, DW.ref.__gxx_personality_v0
83; CHECK-PIC-MEDIUM-NEXT: .cfi_personality 155, DW.ref.__gxx_personality_v0
84; CHECK-PIC-LARGE-NEXT:  .cfi_personality 156, DW.ref.__gxx_personality_v0
85; CHECK-PIC-SMALL-NEXT:  .cfi_lsda 27, .Lexception2
86; CHECK-PIC-MEDIUM-NEXT: .cfi_lsda 28, .Lexception2
87; CHECK-PIC-LARGE-NEXT:  .cfi_lsda 28, .Lexception2
88
89; CHECK:                nop
90; CHECK-LABEL:        .Ltmp2:
91; CHECK-LABEL:        .LBB_END0_2:
92
93; CHECK-NOT:            .cfi_lsda
94
95entry:
96  invoke void @_Z1fv() optsize
97          to label %try.cont unwind label %lpad
98
99lpad:
100  %0 = landingpad { ptr, i32 }
101          cleanup
102          catch ptr @_ZTIi
103  br label %eh.resume
104
105try.cont:
106  ret i32 0
107
108eh.resume:
109  resume { ptr, i32 } %0
110}
111
112declare void @_Z1fv() optsize
113
114declare i32 @__gxx_personality_v0(...)
115;; Verify that the exception table gets split across the three basic block sections.
116;
117; CHECK:                .section .gcc_except_table
118; CHECK-NEXT:           .p2align 2
119; CHECK-NEXT:         GCC_except_table0:
120; CHECK-NEXT:         .Lexception0:
121
122;; Verify @LPStart encoding for NON-PIC mode.
123; CHECK-NON-PIC-NEXT:   .byte	0                       # @LPStart Encoding = absptr
124; CHECK-NON-PIC-X64-NEXT: .quad	main.__part.2
125; CHECK-NON-PIC-X32-NEXT: .long	main.__part.2
126
127;; Verify @LPStart encoding for PIC mode.
128; CHECK-PIC-NEXT:       .byte	16                      # @LPStart Encoding = pcrel
129; CHECK-PIC-NEXT:     [[DOT:\.Ltmp[0-9]+]]:
130; CHECK-PIC-X64-NEXT:   .quad	main.__part.2-[[DOT]]
131; CHECK-PIC-X32-NEXT:   .long	main.__part.2-[[DOT]]
132
133;; Verify @TType encoding for NON-PIC mode.
134; CHECK-NON-PIC-SMALL-NEXT:  .byte	3               # @TType Encoding = udata4
135; CHECK-NON-PIC-MEDIUM-NEXT: .byte	0               # @TType Encoding = absptr
136; CHECK-NON-PIC-LARGE-NEXT:  .byte	0               # @TType Encoding = absptr
137
138;; Verify @TType encoding for PIC mode.
139; CHECK-PIC-SMALL-NEXT: .byte 155                       # @TType Encoding = indirect pcrel sdata4
140; CHECK-PIC-MEDIUM-NEXT:.byte 155                       # @TType Encoding = indirect pcrel sdata4
141; CHECK-PIC-LARGE-NEXT: .byte 156                       # @TType Encoding = indirect pcrel sdata8
142
143; CHECK-NEXT:           .uleb128 .Lttbase0-.Lttbaseref0
144; CHECK-NEXT:         .Lttbaseref0:
145; CHECK-NEXT:           .byte	1                       # Call site Encoding = uleb128
146; CHECK-NEXT:           .uleb128 .Laction_table_base0-.Lcst_begin0
147; CHECK-NEXT:         .Lcst_begin0:
148; CHECK-NEXT:           .uleb128 .Ltmp0-.Lfunc_begin0   # >> Call Site 1 <<
149; CHECK-NEXT:           .uleb128 .Ltmp1-.Ltmp0          #   Call between .Ltmp0 and .Ltmp1
150; CHECK-NEXT:           .uleb128 .Ltmp2-main.__part.2   #     jumps to .Ltmp2
151; CHECK-NEXT:           .byte	3                       #   On action: 2
152; CHECK-NEXT:           .p2align	2
153; CHECK-NEXT:         .Lexception1:
154
155; CHECK-NON-PIC-NEXT:   .byte	0                       # @LPStart Encoding = absptr
156; CHECK-NON-PIC-X64-NEXT: .quad	main.__part.2
157; CHECK-NON-PIC-X32-NEXT: .long	main.__part.2
158
159; CHECK-PIC-NEXT:       .byte	16                      # @LPStart Encoding = pcrel
160; CHECK-PIC-NEXT:     [[DOT:\.Ltmp[0-9]+]]:
161; CHECK-PIC-X64-NEXT:   .quad	main.__part.2-[[DOT]]
162; CHECK-PIC-X32-NEXT:   .long	main.__part.2-[[DOT]]
163
164; CHECK-NON-PIC-SMALL-NEXT:  .byte	3               # @TType Encoding = udata4
165; CHECK-NON-PIC-MEDIUM-NEXT: .byte	0               # @TType Encoding = absptr
166; CHECK-NON-PIC-LARGE-NEXT:  .byte	0               # @TType Encoding = absptr
167
168; CHECK-PIC-SMALL-NEXT: .byte 155                       # @TType Encoding = indirect pcrel sdata4
169; CHECK-PIC-MEDIUM-NEXT:.byte 155                       # @TType Encoding = indirect pcrel sdata4
170; CHECK-PIC-LARGE-NEXT: .byte 156                       # @TType Encoding = indirect pcrel sdata8
171
172; CHECK-NEXT:           .uleb128 .Lttbase0-.Lttbaseref1
173; CHECK-NEXT:         .Lttbaseref1:
174; CHECK-NEXT:           .byte	1                       # Call site Encoding = uleb128
175; CHECK-NEXT:           .uleb128 .Laction_table_base0-.Lcst_begin1
176; CHECK-NEXT:         .Lcst_begin1:
177; CHECK-NEXT:           .p2align 2
178; CHECK-NEXT:         .Lexception2:
179
180; CHECK-NON-PIC-NEXT:   .byte	0                       # @LPStart Encoding = absptr
181; CHECK-NON-PIC-X64-NEXT: .quad	main.__part.2
182; CHECK-NON-PIC-X32-NEXT: .long	main.__part.2
183
184; CHECK-PIC-NEXT:       .byte	16                      # @LPStart Encoding = pcrel
185; CHECK-PIC-NEXT:     [[DOT:\.Ltmp[0-9]+]]:
186; CHECK-PIC-X64-NEXT:   .quad	main.__part.2-[[DOT]]
187; CHECK-PIC-X32-NEXT:   .long	main.__part.2-[[DOT]]
188
189; CHECK-NON-PIC-SMALL-NEXT:  .byte	3               # @TType Encoding = udata4
190; CHECK-NON-PIC-MEDIUM-NEXT: .byte	0               # @TType Encoding = absptr
191; CHECK-NON-PIC-LARGE-NEXT:  .byte	0               # @TType Encoding = absptr
192
193; CHECK-PIC-SMALL-NEXT:  .byte 155                      # @TType Encoding = indirect pcrel sdata4
194; CHECK-PIC-MEDIUM-NEXT: .byte 155                      # @TType Encoding = indirect pcrel sdata4
195; CHECK-PIC-LARGE-NEXT:  .byte 156                      # @TType Encoding = indirect pcrel sdata8
196
197; CHECK-NEXT:           .uleb128 .Lttbase0-.Lttbaseref2
198; CHECK-NEXT:         .Lttbaseref2:
199; CHECK-NEXT:           .byte	1                       # Call site Encoding = uleb128
200; CHECK-NEXT:           .uleb128 .Laction_table_base0-.Lcst_begin2
201; CHECK-NEXT:         .Lcst_begin2:
202; CHECK-NEXT:           .uleb128 main.__part.2-main.__part.2          # >> Call Site 2 <<
203; CHECK-NEXT:           .uleb128 .LBB_END0_2-main.__part.2     #   Call between main.__part.2 and .LBB_END0_2
204; CHECK-NEXT:           .byte	0                       #     has no landing pad
205; CHECK-NEXT:           .byte	0                       #   On action: cleanup
206; CHECK-NEXT:         .Laction_table_base0:
207; CHECK-NEXT:           .byte	0                       # >> Action Record 1 <<
208; CHECK-NEXT:                                           #   Cleanup
209; CHECK-NEXT:           .byte	0                       #   No further actions
210; CHECK-NEXT:           .byte	1                       # >> Action Record 2 <<
211; CHECK-NEXT:                                           #   Catch TypeInfo 1
212; CHECK-NEXT:           .byte	125                     #   Continue to action 1
213; CHECK-NEXT:           .p2align 2
214; CHECK-NEXT:                                           # >> Catch TypeInfos <<
215
216; CHECK-NON-PIC-SMALL-NEXT:  .long _ZTIi                # TypeInfo 1
217; CHECK-NON-PIC-MEDIUM-NEXT: .quad _ZTIi                # TypeInfo 1
218; CHECK-NON-PIC-LARGE-NEXT:  .quad _ZTIi                # TypeInfo 1
219
220; CHECK-PIC-NEXT:     [[DOT:\.Ltmp[0-9]+]]:
221; CHECK-PIC-SMALL-NEXT:  .long .L_ZTIi.DW.stub-[[DOT]]
222; CHECK-PIC-MEDIUM-NEXT: .long .L_ZTIi.DW.stub-[[DOT]]
223; CHECK-PIC-LARGE-NEXT:  .quad .L_ZTIi.DW.stub-[[DOT]]
224
225; CHECK-NEXT:         .Lttbase0:
226; CHECK-NEXT:           .p2align 2
227; CHECK-NEXT:                                           # -- End function
228