| # Assembly generated from building the following C++ 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 <stdio.h> |
| # #include <stdint.h> |
| # |
| # 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 |