mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-28 16:26:10 +03:00
90 lines
2.6 KiB
ArmAsm
90 lines
2.6 KiB
ArmAsm
|
// 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
|