# Assembly generated from building the followingC++ code with the following # command using trunk clang. Then, basic block at .LBB1_7 was moved before the # landing pad. # # clang --target=x86_64-linux -O2 -fPIC -fno-inline exceptions-failed-split.cpp # # #include # #include # # void bar(int a) { # if (a > 2 && a % 2) # throw new int(); # } # # uint64_t throw_test(int argc, char **argv) { # uint64_t rv = 0; # # if (argc == 99) # return 0; # # uint64_t limit = (argc >= 2 ? 10 : 5000); # for (uint64_t i = 0; i < limit; ++i) { # rv += i; # try { # bar(argc); # } catch (...) { # } # } # # if (argc == 5) # return 0; # # if (argc == 7) # return 0; # # if (argc >= 103 && argc <= 203) # return 0; # # if (*argv == 0) # return 0; # # if (argc >= 13 && argc <= 23) # return 0; # # return rv; # } # # int main(int argc, char **argv) { # return !throw_test(argc, argv); # } .text .file "exceptions-failed-split.cpp" .globl _Z3bari # -- Begin function _Z3bari .p2align 4, 0x90 .type _Z3bari,@function _Z3bari: # @_Z3bari .Lfunc_begin0: .cfi_startproc .cfi_personality 155, DW.ref.__gxx_personality_v0 .cfi_lsda 27, .Lexception0 # %bb.0: # %entry pushq %r14 .cfi_def_cfa_offset 16 pushq %rbx .cfi_def_cfa_offset 24 pushq %rax .cfi_def_cfa_offset 32 .cfi_offset %rbx, -24 .cfi_offset %r14, -16 cmpl $3, %edi jl .LBB0_5 # %bb.1: # %entry andl $1, %edi jne .LBB0_2 .LBB0_5: # %if.end addq $8, %rsp .cfi_def_cfa_offset 24 popq %rbx .cfi_def_cfa_offset 16 popq %r14 .cfi_def_cfa_offset 8 retq .LBB0_2: # %if.then .cfi_def_cfa_offset 32 movl $8, %edi callq __cxa_allocate_exception@PLT movq %rax, %rbx .Ltmp0: movl $4, %edi callq _Znwm@PLT .Ltmp1: # %bb.3: # %invoke.cont movl $0, (%rax) movq %rax, (%rbx) movq _ZTIPi@GOTPCREL(%rip), %rsi movq %rbx, %rdi xorl %edx, %edx callq __cxa_throw@PLT .LBB0_4: # %lpad .Ltmp2: movq %rax, %r14 movq %rbx, %rdi callq __cxa_free_exception@PLT movq %r14, %rdi callq _Unwind_Resume@PLT .Lfunc_end0: .size _Z3bari, .Lfunc_end0-_Z3bari .cfi_endproc .section .gcc_except_table,"a",@progbits .p2align 2 GCC_except_table0: .Lexception0: .byte 255 # @LPStart Encoding = omit .byte 255 # @TType Encoding = omit .byte 1 # Call site Encoding = uleb128 .uleb128 .Lcst_end0-.Lcst_begin0 .Lcst_begin0: .uleb128 .Lfunc_begin0-.Lfunc_begin0 # >> Call Site 1 << .uleb128 .Ltmp0-.Lfunc_begin0 # Call between .Lfunc_begin0 and .Ltmp0 .byte 0 # has no landing pad .byte 0 # On action: cleanup .uleb128 .Ltmp0-.Lfunc_begin0 # >> Call Site 2 << .uleb128 .Ltmp1-.Ltmp0 # Call between .Ltmp0 and .Ltmp1 .uleb128 .Ltmp2-.Lfunc_begin0 # jumps to .Ltmp2 .byte 0 # On action: cleanup .uleb128 .Ltmp1-.Lfunc_begin0 # >> Call Site 3 << .uleb128 .Lfunc_end0-.Ltmp1 # Call between .Ltmp1 and .Lfunc_end0 .byte 0 # has no landing pad .byte 0 # On action: cleanup .Lcst_end0: .p2align 2 # -- End function .text .globl _Z10throw_testiPPc # -- Begin function _Z10throw_testiPPc .p2align 4, 0x90 .type _Z10throw_testiPPc,@function _Z10throw_testiPPc: # @_Z10throw_testiPPc .Lfunc_begin1: .cfi_startproc .cfi_personality 155, DW.ref.__gxx_personality_v0 .cfi_lsda 27, .Lexception1 # %bb.0: # %entry pushq %r15 .cfi_def_cfa_offset 16 pushq %r14 .cfi_def_cfa_offset 24 pushq %r13 .cfi_def_cfa_offset 32 pushq %r12 .cfi_def_cfa_offset 40 pushq %rbx .cfi_def_cfa_offset 48 .cfi_offset %rbx, -48 .cfi_offset %r12, -40 .cfi_offset %r13, -32 .cfi_offset %r14, -24 .cfi_offset %r15, -16 cmpl $99, %edi je .LBB1_7 # %bb.2: # %if.end movq %rsi, %r15 movl %edi, %r14d cmpl $2, %edi movl $10, %eax movl $5000, %r12d # imm = 0x1388 cmovgeq %rax, %r12 xorl %r13d, %r13d xorl %ebx, %ebx .p2align 4, 0x90 .LBB1_3: # %for.body # =>This Inner Loop Header: Depth=1 .Ltmp3: movl %r14d, %edi callq _Z3bari@PLT .Ltmp4: .LBB1_4: # %for.inc # in Loop: Header=BB1_3 Depth=1 addq %rbx, %r13 incq %rbx cmpq %rbx, %r12 jne .LBB1_3 jmp .LBB1_6 .LBB1_7: xorl %r13d, %r13d jmp .LBB1_8 .LBB1_5: # %lpad # in Loop: Header=BB1_3 Depth=1 .Ltmp5: movq %rax, %rdi callq __cxa_begin_catch@PLT callq __cxa_end_catch@PLT jmp .LBB1_4 .LBB1_6: # %for.cond.cleanup movl %r14d, %eax orl $2, %eax cmpl $7, %eax jne .LBB1_9 jmp .LBB1_7 .LBB1_8: # %cleanup21 movq %r13, %rax popq %rbx .cfi_def_cfa_offset 40 popq %r12 .cfi_def_cfa_offset 32 popq %r13 .cfi_def_cfa_offset 24 popq %r14 .cfi_def_cfa_offset 16 popq %r15 .cfi_def_cfa_offset 8 retq .LBB1_9: # %if.end8 .cfi_def_cfa_offset 48 leal -103(%r14), %eax cmpl $101, %eax jb .LBB1_7 # %bb.11: # %if.end12 cmpq $0, (%r15) je .LBB1_7 # %bb.12: # %if.end15 addl $-13, %r14d xorl %eax, %eax cmpl $11, %r14d cmovbq %rax, %r13 jmp .LBB1_8 .Lfunc_end1: .size _Z10throw_testiPPc, .Lfunc_end1-_Z10throw_testiPPc .cfi_endproc .section .gcc_except_table,"a",@progbits .p2align 2 GCC_except_table1: .Lexception1: .byte 255 # @LPStart Encoding = omit .byte 155 # @TType Encoding = indirect pcrel sdata4 .uleb128 .Lttbase0-.Lttbaseref0 .Lttbaseref0: .byte 1 # Call site Encoding = uleb128 .uleb128 .Lcst_end1-.Lcst_begin1 .Lcst_begin1: .uleb128 .Ltmp3-.Lfunc_begin1 # >> Call Site 1 << .uleb128 .Ltmp4-.Ltmp3 # Call between .Ltmp3 and .Ltmp4 .uleb128 .Ltmp5-.Lfunc_begin1 # jumps to .Ltmp5 .byte 1 # On action: 1 .uleb128 .Ltmp4-.Lfunc_begin1 # >> Call Site 2 << .uleb128 .Lfunc_end1-.Ltmp4 # Call between .Ltmp4 and .Lfunc_end1 .byte 0 # has no landing pad .byte 0 # On action: cleanup .Lcst_end1: .byte 1 # >> Action Record 1 << # Catch TypeInfo 1 .byte 0 # No further actions .p2align 2 # >> Catch TypeInfos << .long 0 # TypeInfo 1 .Lttbase0: .p2align 2 # -- End function .text .globl main # -- Begin function main .p2align 4, 0x90 .type main,@function main: # @main .cfi_startproc # %bb.0: # %entry pushq %rax .cfi_def_cfa_offset 16 callq _Z10throw_testiPPc@PLT xorl %ecx, %ecx testq %rax, %rax sete %cl movl %ecx, %eax popq %rcx .cfi_def_cfa_offset 8 retq .Lfunc_end2: .size main, .Lfunc_end2-main .cfi_endproc # -- End function .hidden DW.ref.__gxx_personality_v0 .weak DW.ref.__gxx_personality_v0 .section .data.DW.ref.__gxx_personality_v0,"aGw",@progbits,DW.ref.__gxx_personality_v0,comdat .p2align 3 .type DW.ref.__gxx_personality_v0,@object .size DW.ref.__gxx_personality_v0, 8 DW.ref.__gxx_personality_v0: .quad __gxx_personality_v0 .ident "clang version 15.0.0" .section ".note.GNU-stack","",@progbits .addrsig .addrsig_sym __gxx_personality_v0 .addrsig_sym _Unwind_Resume .addrsig_sym _ZTIPi