llvm/bolt/test/runtime/X86/exceptions-lpstart-zero.s

# RUN: %clangxx %cflags -no-pie %s -o %t.exe -Wl,-q
# RUN: llvm-bolt %t.exe -o %t.exe.bolt
# RUN: %t.exe.bolt

# REQUIRES: system-linux

## Test that BOLT properly handles LPStart when LPStartEncoding is different
## from DW_EH_PE_omit.

# The test case compiled with -O1 from:
#
# int main() {
#   try {
#     throw 42;
#   } catch (...) {
#     return 0;
#   }
#   return 1;
# }
#
# The exception table was modified with udata4 LPStartEncoding and sdata4
# CallSiteEncoding.

	.text
	.globl	main                            # -- Begin function main
	.p2align	4, 0x90
	.type	main,@function
main:                                   # @main
.Lfunc_begin0:
	.cfi_startproc
	.cfi_personality 3, __gxx_personality_v0
	.cfi_lsda 3, .Lexception0
# %bb.0:
	pushq	%rax
	.cfi_def_cfa_offset 16
	movl	$4, %edi
	callq	__cxa_allocate_exception
	movl	$42, (%rax)
.Ltmp0:
	movl	$_ZTIi, %esi
	movq	%rax, %rdi
	xorl	%edx, %edx
	callq	__cxa_throw
.Ltmp1:
# %bb.1:
.LBB0_2:
.Ltmp2:
	movq	%rax, %rdi
	callq	__cxa_begin_catch
	callq	__cxa_end_catch
	xorl	%eax, %eax
	popq	%rcx
	.cfi_def_cfa_offset 8
	retq
.Lfunc_end0:
	.size	main, .Lfunc_end0-main
	.cfi_endproc
	.section	.gcc_except_table,"a",@progbits
	.p2align	2
GCC_except_table0:
.Lexception0:
	.byte	3                               # @LPStart Encoding = udata4
  .long 0
	.byte	3                               # @TType Encoding = udata4
	.uleb128 .Lttbase0-.Lttbaseref0
.Lttbaseref0:
	.byte	11                              # Call site Encoding = sdata4
	.uleb128 .Lcst_end0-.Lcst_begin0
.Lcst_begin0:
	.long .Lfunc_begin0-.Lfunc_begin0    # >> Call Site 1 <<
	.long .Ltmp0-.Lfunc_begin0           #   Call between .Lfunc_begin0 and .Ltmp0
	.long	0                               #     has no landing pad
	.byte	0                               #   On action: cleanup
	.long .Ltmp0-.Lfunc_begin0           # >> Call Site 2 <<
	.long .Ltmp1-.Ltmp0                  #   Call between .Ltmp0 and .Ltmp1
	.long .Ltmp2                         #     jumps to .Ltmp2
	.byte	1                               #   On action: 1
	.long .Ltmp1-.Lfunc_begin0           # >> Call Site 3 <<
	.long .Lfunc_end0-.Ltmp1             #   Call between .Ltmp1 and .Lfunc_end0
	.long	0                               #     has no landing pad
	.byte	0                               #   On action: cleanup
.Lcst_end0:
	.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