# 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