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