## 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