// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // base::mac::CallWithEHFrame(void () block_pointer) #define CALL_WITH_EH_FRAME __ZN4base3mac15CallWithEHFrameEU13block_pointerFvvE .section __TEXT,__text,regular,pure_instructions #if !defined(COMPONENT_BUILD) .private_extern CALL_WITH_EH_FRAME #endif .globl CALL_WITH_EH_FRAME .align 4 CALL_WITH_EH_FRAME: .cfi_startproc // Configure the C++ exception handler personality routine. Normally the // compiler would emit ___gxx_personality_v0 here. The purpose of this // function is to use a custom personality routine. .cfi_personality 155, __ZN4base3mac21CxxPersonalityRoutineEi14_Unwind_ActionyP17_Unwind_ExceptionP15_Unwind_Context .cfi_lsda 16, CallWithEHFrame_exception_table Lfunction_start: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp // Load the function pointer from the block descriptor. movq 16(%rdi), %rax // Execute the block in the context of a C++ try{}. Ltry_start: callq *%rax Ltry_end: popq %rbp ret // Landing pad for the exception handler. This should never be called, since // the personality routine will stop the search for an exception handler, // which will cause the runtime to invoke the default terminate handler. Lcatch: movq %rax, %rdi callq ___cxa_begin_catch // The ABI requires a call to the catch handler. ud2 // In the event this is called, make it fatal. Lfunction_end: .cfi_endproc // The C++ exception table that is used to identify this frame as an // exception handler. See http://llvm.org/docs/ExceptionHandling.html and // http://mentorembedded.github.io/cxx-abi/exceptions.pdf. .section __TEXT,__gcc_except_tab .align 2 CallWithEHFrame_exception_table: .byte 255 // DW_EH_PE_omit .byte 155 // DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4 .asciz "\242\200\200" // LE int128 for the number of bytes in this table. .byte 3 // DW_EH_PE_udata4 .byte 26 // Callsite table length. // First callsite. CS1_begin = Ltry_start - Lfunction_start .long CS1_begin CS1_end = Ltry_end - Ltry_start .long CS1_end // First landing pad. LP1 = Lcatch - Lfunction_start .long LP1 .byte 1 // Action record. // Second callsite. CS2_begin = Ltry_end - Lfunction_start .long CS2_begin CS2_end = Lfunction_end - Ltry_end .long CS2_end // Second landing pad (none). .long 0 .byte 0 // No action. // Action table. .byte 1 // Action record 1. .byte 0 // No further action to take. .long 0 // No type filter for this catch(){} clause. .align 2