forked from OSchip/llvm-project
100 lines
2.4 KiB
ArmAsm
100 lines
2.4 KiB
ArmAsm
//===-- xray_trampoline_hexagon.s -------------------------------*- ASM -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file is a part of XRay, a dynamic runtime instrumentation system.
|
|
//
|
|
// This implements the hexagon-specific assembler for the trampolines.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "../builtins/assembly.h"
|
|
#include "../sanitizer_common/sanitizer_asm.h"
|
|
|
|
.macro SAVE_REGISTERS
|
|
memw(sp+#0)=r0
|
|
memw(sp+#4)=r1
|
|
memw(sp+#8)=r2
|
|
memw(sp+#12)=r3
|
|
memw(sp+#16)=r4
|
|
.endm
|
|
.macro RESTORE_REGISTERS
|
|
r0=memw(sp+#0)
|
|
r1=memw(sp+#4)
|
|
r2=memw(sp+#8)
|
|
r3=memw(sp+#12)
|
|
r4=memw(sp+#16)
|
|
.endm
|
|
|
|
.macro CALL_PATCHED_FUNC entry_type
|
|
// if (xray::XRayPatchedFunctionE != NULL)
|
|
// xray::XRayPatchedFunctionE(FuncType);
|
|
|
|
r8 = #ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
|
|
|
|
// The patched sled puts the function type
|
|
// into r6. Move it into r0 to pass it to
|
|
// the patched function.
|
|
{ r0 = r6
|
|
r1 = \entry_type
|
|
p0 = !cmp.eq(r8, #0)
|
|
if (p0) callr r8 }
|
|
.endm
|
|
|
|
.text
|
|
.globl ASM_SYMBOL(__xray_FunctionEntry)
|
|
ASM_HIDDEN(__xray_FunctionEntry)
|
|
ASM_TYPE_FUNCTION(__xray_FunctionEntry)
|
|
# LLVM-MCA-BEGIN __xray_FunctionEntry
|
|
ASM_SYMBOL(__xray_FunctionEntry):
|
|
CFI_STARTPROC
|
|
SAVE_REGISTERS
|
|
|
|
CALL_PATCHED_FUNC #0 // XRayEntryType::ENTRY
|
|
.Ltmp0:
|
|
RESTORE_REGISTERS
|
|
// return
|
|
# LLVM-MCA-END
|
|
ASM_SIZE(__xray_FunctionEntry)
|
|
CFI_ENDPROC
|
|
|
|
|
|
.globl ASM_SYMBOL(__xray_FunctionExit)
|
|
ASM_HIDDEN(__xray_FunctionExit)
|
|
ASM_TYPE_FUNCTION(__xray_FunctionExit)
|
|
# LLVM-MCA-BEGIN __xray_FunctionExit
|
|
ASM_SYMBOL(__xray_FunctionExit):
|
|
CFI_STARTPROC
|
|
SAVE_REGISTERS
|
|
|
|
CALL_PATCHED_FUNC #1 // XRayEntryType::EXIT
|
|
.Ltmp1:
|
|
RESTORE_REGISTERS
|
|
// return
|
|
jumpr r31
|
|
# LLVM-MCA-END
|
|
ASM_SIZE(__xray_FunctionExit)
|
|
CFI_ENDPROC
|
|
|
|
|
|
.globl ASM_SYMBOL(__xray_FunctionTailExit)
|
|
ASM_HIDDEN(__xray_FunctionTailExit)
|
|
ASM_TYPE_FUNCTION(__xray_FunctionTailExit)
|
|
# LLVM-MCA-BEGIN __xray_FunctionTailExit
|
|
ASM_SYMBOL(__xray_FunctionTailExit):
|
|
CFI_STARTPROC
|
|
SAVE_REGISTERS
|
|
|
|
CALL_PATCHED_FUNC #2 // XRayEntryType::TAIL
|
|
.Ltmp2:
|
|
RESTORE_REGISTERS
|
|
// return
|
|
jumpr r31
|
|
# LLVM-MCA-END
|
|
ASM_SIZE(__xray_FunctionTailExit)
|
|
CFI_ENDPROC
|