## This test checks that trampolines are inserted in split fragments if ## necessary. There are 4 LSDA ranges with a landing pad to three landing pads. ## After splitting all blocks, there have to be 4 trampolines in the output. # RUN: llvm-mc --filetype=obj --triple x86_64-unknown-unknown %s -o %t.o # RUN: %clangxx %cxxflags %t.o -o %t.exe -Wl,-q -pie # RUN: llvm-bolt %t.exe --split-functions --split-strategy=all --split-eh \ # RUN: -o %t.bolt --print-split --print-only=main 2>&1 | FileCheck %s # CHECK: ------- HOT-COLD SPLIT POINT ------- # CHECK: .LFT0 # CHECK: Landing Pads: .LBB0 # CHECK: .LBB0 # CHECK-NEXT: Landing Pad # CHECK: ------- HOT-COLD SPLIT POINT ------- # CHECK: .Ltmp0 # CHECK: Landing Pads: .LBB1, .LBB2 # CHECK: .LBB1 # CHECK-NEXT: Landing Pad # CHECK: .LBB2 # CHECK-NEXT: Landing Pad # CHECK: ------- HOT-COLD SPLIT POINT ------- # CHECK: ------- HOT-COLD SPLIT POINT ------- # CHECK: ------- HOT-COLD SPLIT POINT ------- # CHECK: ------- HOT-COLD SPLIT POINT ------- # CHECK: ------- HOT-COLD SPLIT POINT ------- # CHECK: .Ltmp3 # CHECK: Landing Pads: .LBB3 # CHECK: .LBB3 # CHECK-NEXT: Landing Pad # CHECK: ------- HOT-COLD SPLIT POINT ------- # CHECK: ------- HOT-COLD SPLIT POINT ------- .text .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "E" .LC1: .string "C" .text .globl main .type main, @function main: .LFB1265: .cfi_startproc .cfi_personality 0x9b,DW.ref.__gxx_personality_v0 .cfi_lsda 0x1b,.LLSDA1265 pushq %r12 .cfi_def_cfa_offset 16 .cfi_offset 12, -16 pushq %rbp .cfi_def_cfa_offset 24 .cfi_offset 6, -24 pushq %rbx .cfi_def_cfa_offset 32 .cfi_offset 3, -32 testb $3, %dil jne .L13 leaq .LC1(%rip), %rdi .LEHB0: call puts@PLT # Trampoline to .L9 .LEHE0: jmp .L11 .L13: movl $16, %edi call __cxa_allocate_exception@PLT movq %rax, %rbx leaq .LC0(%rip), %rsi movq %rax, %rdi .LEHB1: call _ZNSt13runtime_errorC1EPKc@PLT # Trampoline to .L8 .LEHE1: movq _ZNSt13runtime_errorD1Ev@GOTPCREL(%rip), %rdx movq _ZTISt13runtime_error@GOTPCREL(%rip), %rsi movq %rbx, %rdi .LEHB2: call __cxa_throw@PLT # Trampoline to .L9 .LEHE2: .L9: movq %rax, %rdi movq %rdx, %rax jmp .L4 .L8: movq %rax, %r12 movq %rdx, %rbp movq %rbx, %rdi call __cxa_free_exception@PLT movq %r12, %rdi movq %rbp, %rax .L4: cmpq $1, %rax je .L5 .LEHB3: call _Unwind_Resume@PLT .LEHE3: .L5: call __cxa_begin_catch@PLT movq %rax, %rdi movq (%rax), %rax call *16(%rax) movq %rax, %rdi .LEHB4: call puts@PLT # Trampoline to .L10 .LEHE4: call __cxa_end_catch@PLT .L11: movl $0, %eax popq %rbx .cfi_remember_state .cfi_def_cfa_offset 24 popq %rbp .cfi_def_cfa_offset 16 popq %r12 .cfi_def_cfa_offset 8 ret .L10: .cfi_restore_state movq %rax, %rbx call __cxa_end_catch@PLT movq %rbx, %rdi .LEHB5: call _Unwind_Resume@PLT .LEHE5: .cfi_endproc .globl __gxx_personality_v0 .section .gcc_except_table,"a",@progbits .align 4 .LLSDA1265: .byte 0xff .byte 0x9b .uleb128 .LLSDATT1265-.LLSDATTD1265 .LLSDATTD1265: .byte 0x1 .uleb128 .LLSDACSE1265-.LLSDACSB1265 .LLSDACSB1265: .uleb128 .LEHB0-.LFB1265 .uleb128 .LEHE0-.LEHB0 .uleb128 .L9-.LFB1265 .uleb128 0x1 .uleb128 .LEHB1-.LFB1265 .uleb128 .LEHE1-.LEHB1 .uleb128 .L8-.LFB1265 .uleb128 0x3 .uleb128 .LEHB2-.LFB1265 .uleb128 .LEHE2-.LEHB2 .uleb128 .L9-.LFB1265 .uleb128 0x1 .uleb128 .LEHB3-.LFB1265 .uleb128 .LEHE3-.LEHB3 .uleb128 0 .uleb128 0 .uleb128 .LEHB4-.LFB1265 .uleb128 .LEHE4-.LEHB4 .uleb128 .L10-.LFB1265 .uleb128 0 .uleb128 .LEHB5-.LFB1265 .uleb128 .LEHE5-.LEHB5 .uleb128 0 .uleb128 0 .LLSDACSE1265: .byte 0x1 .byte 0 .byte 0 .byte 0x7d .align 4 .long DW.ref._ZTISt13runtime_error-. .LLSDATT1265: .text .size main, .-main .hidden DW.ref._ZTISt13runtime_error .weak DW.ref._ZTISt13runtime_error .section .data.rel.local.DW.ref._ZTISt13runtime_error,"awG",@progbits,DW.ref._ZTISt13runtime_error,comdat .align 8 .type DW.ref._ZTISt13runtime_error, @object .size DW.ref._ZTISt13runtime_error, 8 DW.ref._ZTISt13runtime_error: .quad _ZTISt13runtime_error .hidden DW.ref.__gxx_personality_v0 .weak DW.ref.__gxx_personality_v0 .section .data.rel.local.DW.ref.__gxx_personality_v0,"awG",@progbits,DW.ref.__gxx_personality_v0,comdat .align 8 .type DW.ref.__gxx_personality_v0, @object .size DW.ref.__gxx_personality_v0, 8 DW.ref.__gxx_personality_v0: .quad __gxx_personality_v0 .ident "GCC: (Compiler-Explorer-Build-gcc--binutils-2.38) 12.1.0" .section .note.GNU-stack,"",@progbits