brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.9 KiB · 149193d Raw
262 lines · plain
1## This test reproduces the case where C++ exception handling is used and split2## function optimization is enabled. In particular, function foo is split3## to two fragments:4##    foo: contains 2 try blocks, which invokes bar to throw exception5##    foo.cold.1: contains 2 corresponding catch blocks (landing pad)6##7## Similar to split jump table, split landing pad target to different fragment.8## This test is written to ensure BOLT safely handle these targets, e.g., by9## marking them as non-simple.10##11## Steps to write this test:12## - Create a copy of Inputs/src/unreachable.cpp13## - Simplify bar(), focus on throw an exception14## - Create the second switch case in foo() to have multiple landing pads15## - Compile with clang++ to .s16## - Move landing pad code from foo to foo.cold.117## - Ensure that all landing pads can be reached normally18##19## Additional details:20## .gcc_except_table specify the landing pads for try blocks21##    LPStart = 255 (omit), which means LPStart = foo start22## Landing pads .Ltmp2 and .Ltmp5 in call site record are offset to foo start.23 24 25# REQUIRES: system-linux26# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o27# RUN: %clang++ %cxxflags %t.o -o %t.exe -Wl,-q28# RUN: llvm-bolt -v=3 %t.exe -o %t.out 2>&1 | FileCheck %s29 30# CHECK: BOLT-WARNING: Ignoring foo31# CHECK: BOLT-WARNING: Ignoring foo.cold.132# CHECK: BOLT-WARNING: skipped 2 functions due to cold fragments33 34	.text35	.globl	bar                             # -- Begin function bar36	.p2align	4, 0x9037	.type	bar,@function38bar:                                    # @bar39	.cfi_startproc40# %bb.0:                                # %entry41	pushq	%rbp42	.cfi_def_cfa_offset 1643	.cfi_offset %rbp, -1644	movq	%rsp, %rbp45	.cfi_def_cfa_register %rbp46	subq	$16, %rsp47	movq	%rdi, -8(%rbp)48	cmpq	$34, -8(%rbp)49	jne	.LBB0_250# %bb.1:                                # %if.then51	movl	$4, %edi52	callq	__cxa_allocate_exception@PLT53	movq	%rax, %rdi54	movl	$0, (%rdi)55	movq	_ZTIi@GOTPCREL(%rip), %rsi56	xorl	%eax, %eax57	movl	%eax, %edx58	callq	__cxa_throw@PLT59.LBB0_2:                                # %if.else60	movl	$8, %edi61	callq	__cxa_allocate_exception@PLT62	movq	%rax, %rdi63	movq	$0, (%rdi)64	movq	_ZTIDn@GOTPCREL(%rip), %rsi65	xorl	%eax, %eax66	movl	%eax, %edx67	callq	__cxa_throw@PLT68.Lfunc_end0:69	.size	bar, .Lfunc_end0-bar70	.cfi_endproc71                                        # -- End function72	.globl	foo                             # -- Begin function foo73	.p2align	4, 0x9074	.type	foo,@function75foo:                                    # @foo76.Lfunc_begin0:77	.cfi_startproc78	.cfi_personality 155, DW.ref.__gxx_personality_v079	.cfi_lsda 27, .Lexception080# %bb.0:                                # %entry81	pushq	%rbp82	.cfi_def_cfa_offset 1683	.cfi_offset %rbp, -1684	movq	%rsp, %rbp85	.cfi_def_cfa_register %rbp86	subq	$48, %rsp87	movq	%rdi, -16(%rbp)88	movq	-16(%rbp), %rdi89.Ltmp0:90	callq	bar91.Ltmp1:92	jmp	.LBB1_193.LBB1_1:                                # %invoke.cont94	jmp	.LBB1_595.LBB1_5:                                # %try.cont96	movq	-16(%rbp), %rdi97	addq	$34, %rdi98.Ltmp3:99	callq	bar100.Ltmp4:101	jmp	.LBB1_6102.LBB1_6:                                # %invoke.cont2103	jmp	.LBB1_10104.LBB1_10:                               # %try.cont8105	movq	$0, -8(%rbp)106.LBB1_11:                               # %return107	movq	-8(%rbp), %rax108	addq	$48, %rsp109	popq	%rbp110	.cfi_def_cfa %rsp, 8111	retq112.LBB1_12:                               # %eh.resume113	.cfi_def_cfa %rbp, 16114	movq	-24(%rbp), %rdi115	callq	_Unwind_Resume@PLT116.Lfunc_end1:117	.size	foo, .Lfunc_end1-foo118	.cfi_endproc119	.section	.gcc_except_table,"a",@progbits120	.p2align	2121GCC_except_table1:122.Lexception0:123	.byte	255                             # @LPStart Encoding = omit124	.byte	155                             # @TType Encoding = indirect pcrel sdata4125	.uleb128 .Lttbase0-.Lttbaseref0126.Lttbaseref0:127	.byte	1                               # Call site Encoding = uleb128128	.uleb128 .Lcst_end0-.Lcst_begin0129.Lcst_begin0:130	.uleb128 .Ltmp0-.Lfunc_begin0           # >> Call Site 1 <<131	.uleb128 .Ltmp1-.Ltmp0                  #   Call between .Ltmp0 and .Ltmp1132	.uleb128 .Ltmp2-.Lfunc_begin0           #     jumps to .Ltmp2133	.byte	1                               #   On action: 1134	.uleb128 .Ltmp1-.Lfunc_begin0           # >> Call Site 2 <<135	.uleb128 .Ltmp3-.Ltmp1                  #   Call between .Ltmp1 and .Ltmp3136	.byte	0                               #     has no landing pad137	.byte	0                               #   On action: cleanup138	.uleb128 .Ltmp3-.Lfunc_begin0           # >> Call Site 3 <<139	.uleb128 .Ltmp4-.Ltmp3                  #   Call between .Ltmp3 and .Ltmp4140	.uleb128 .Ltmp5-.Lfunc_begin0           #     jumps to .Ltmp5141	.byte	1                               #   On action: 1142	.uleb128 .Ltmp4-.Lfunc_begin0           # >> Call Site 4 <<143	.uleb128 .Lfunc_end1-.Ltmp4             #   Call between .Ltmp4 and .Lfunc_end1144	.byte	0                               #     has no landing pad145	.byte	0                               #   On action: cleanup146.Lcst_end0:147	.byte	1                               # >> Action Record 1 <<148                                        #   Catch TypeInfo 1149	.byte	0                               #   No further actions150	.p2align	2151                                        # >> Catch TypeInfos <<152.Ltmp6:                                 # TypeInfo 1153	.long	.L_ZTIi.DW.stub-.Ltmp6154.Lttbase0:155	.p2align	2156                                        # -- End function157 158 159        .text160	.globl	foo.cold.1              # -- Begin function foo.cold.1161	.p2align	4, 0x90162	.type	foo.cold.1,@function163foo.cold.1:                                    # @foo.cold.1164.Lfunc_begin3:165	.cfi_startproc166.Ltmp2:167	movq	%rax, %rcx168	movl	%edx, %eax169	movq	%rcx, -24(%rbp)170	movl	%eax, -28(%rbp)171# %bb.3:                                # %catch.dispatch172	movl	-28(%rbp), %eax173	movl	$1, %ecx174	cmpl	%ecx, %eax175	jne	.LBB1_12176# %bb.4:                                # %catch177	movq	-24(%rbp), %rdi178	callq	__cxa_begin_catch@PLT179	movl	(%rax), %eax180	movl	%eax, -32(%rbp)181	movq	$0, -8(%rbp)182	callq	__cxa_end_catch@PLT183	jmp	.LBB1_11184.Ltmp5:185	movq	%rax, %rcx186	movl	%edx, %eax187	movq	%rcx, -24(%rbp)188	movl	%eax, -28(%rbp)189# %bb.8:                                # %catch.dispatch3190	movl	-28(%rbp), %eax191	movl	$1, %ecx192	cmpl	%ecx, %eax193	jne	.LBB1_12194# %bb.9:                                # %catch6195	movq	-24(%rbp), %rdi196	callq	__cxa_begin_catch@PLT197	movl	(%rax), %eax198	movl	%eax, -36(%rbp)199	movq	$0, -8(%rbp)200	callq	__cxa_end_catch@PLT201	jmp	.LBB1_11202.Lfunc_end3:203	.size	foo.cold.1, .Lfunc_end3-foo.cold.1204	.cfi_endproc205 206 207	.text208	.globl	main                            # -- Begin function main209	.p2align	4, 0x90210	.type	main,@function211main:                                   # @main212	.cfi_startproc213# %bb.0:                                # %entry214	pushq	%rbp215	.cfi_def_cfa_offset 16216	.cfi_offset %rbp, -16217	movq	%rsp, %rbp218	.cfi_def_cfa_register %rbp219	subq	$16, %rsp220	movl	$0, -4(%rbp)221	movl	%edi, -8(%rbp)222	movq	%rsi, -16(%rbp)223	xorl	%eax, %eax224	movl	%eax, %edi225	callq	foo226                                        # kill: def $eax killed $eax killed $rax227	addq	$16, %rsp228	popq	%rbp229	.cfi_def_cfa %rsp, 8230	retq231.Lfunc_end2:232	.size	main, .Lfunc_end2-main233	.cfi_endproc234                                        # -- End function235	.data236	.p2align	3237.L_ZTIi.DW.stub:238	.quad	_ZTIi239	.hidden	DW.ref.__gxx_personality_v0240	.weak	DW.ref.__gxx_personality_v0241	.section	.data.DW.ref.__gxx_personality_v0,"aGw",@progbits,DW.ref.__gxx_personality_v0,comdat242	.p2align	3243	.type	DW.ref.__gxx_personality_v0,@object244	.size	DW.ref.__gxx_personality_v0, 8245DW.ref.__gxx_personality_v0:246	.quad	__gxx_personality_v0247	.section	".note.GNU-stack","",@progbits248	.addrsig249	.addrsig_sym bar250	.addrsig_sym __cxa_allocate_exception251	.addrsig_sym __cxa_throw252	.addrsig_sym foo253	.addrsig_sym __gxx_personality_v0254	.addrsig_sym __cxa_begin_catch255	.addrsig_sym __cxa_end_catch256	.addrsig_sym _Unwind_Resume257	.addrsig_sym _ZTIi258	.addrsig_sym _ZTIDn259        .addrsig_sym foo.cold.1260        .addrsig_sym __cxa_begin_catch261        .addrsig_sym __cxa_end_catch262