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