# RUN: %{cxx} %{flags} %s %{link_flags} -no-pie -o %t.exe
# RUN: %{exec} %t.exe
# REQUIRES: linux && target={{x86_64-.+}}
# UNSUPPORTED: target={{.+-android.*}}
# UNSUPPORTED: no-exceptions
## Check that libc++abi works correctly when LPStart address is explicitly set
## to zero.
## This file is generated from the following C++ source code.
##
## ```
## int main() {
## try {
## throw 42;
## } catch (...) {
## return 0;
## }
## return 1;
## }
## ```
## The exception table is modified to use udata4 encoding for LPStart and
## sdata4 encoding for call sites.
.text
.globl main # -- Begin function main
.p2align 4, 0x90
.type main,@function
main: # @main
.Lfunc_begin0:
.cfi_startproc
.globl __gxx_personality_v0
.cfi_personality 3, __gxx_personality_v0
.cfi_lsda 27, .Lexception0
# %bb.0: # %entry
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $32, %rsp
movl $0, -4(%rbp)
movl $4, %edi
callq __cxa_allocate_exception@PLT
movq %rax, %rdi
movl $42, (%rdi)
.Ltmp0:
movq _ZTIi@GOTPCREL(%rip), %rsi
xorl %eax, %eax
movl %eax, %edx
callq __cxa_throw@PLT
.Ltmp1:
jmp .LBB0_4
.LBB0_1: # %lpad
.Ltmp2:
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -16(%rbp)
movl %eax, -20(%rbp)
# %bb.2: # %catch
movq -16(%rbp), %rdi
callq __cxa_begin_catch@PLT
movl $0, -4(%rbp)
callq __cxa_end_catch@PLT
# %bb.3: # %return
movl -4(%rbp), %eax
addq $32, %rsp
popq %rbp
.cfi_def_cfa %rsp, 8
retq
.LBB0_4: # %unreachable
.Lfunc_end0:
.size main, .Lfunc_end0-main
.cfi_endproc
.section .gcc_except_table,"a",@progbits
.p2align 2, 0x0
GCC_except_table0:
.Lexception0:
.byte 3 # @LPStart Encoding = udata4
.long 0
.byte 155 # @TType Encoding = indirect pcrel sdata4
.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
.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, 0x0
# >> Catch TypeInfos <<
.long 0 # TypeInfo 1
.Lttbase0:
.p2align 2, 0x0
# -- End function