Index: base/mac/call_with_eh_frame_asm.S |
diff --git a/base/mac/call_with_eh_frame_asm.S b/base/mac/call_with_eh_frame_asm.S |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0e399cf2ae0b9f17db25bc2fde7c4bc15b98840b |
--- /dev/null |
+++ b/base/mac/call_with_eh_frame_asm.S |
@@ -0,0 +1,89 @@ |
+// 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 |