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