mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 04:06:48 +00:00

Only support patching FunctionEntry/FunctionExit/FunctionTailExit for now. Reviewed By: MaskRay, xen0n Co-Authored-By: zhanglimin <zhanglimin@loongson.cn> Differential Revision: https://reviews.llvm.org/D140727
125 lines
3.0 KiB
ArmAsm
125 lines
3.0 KiB
ArmAsm
//===-- xray_trampoline_loongarch64.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 loongarch-specific assembler for the trampolines.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "../sanitizer_common/sanitizer_asm.h"
|
|
|
|
#define FROM_0_TO_7 0,1,2,3,4,5,6,7
|
|
#define FROM_7_TO_0 7,6,5,4,3,2,1,0
|
|
|
|
.macro SAVE_ARG_REGISTERS
|
|
.irp i,FROM_7_TO_0
|
|
st.d $a\i, $sp, (8 * 8 + 8 * \i)
|
|
.endr
|
|
.irp i,FROM_7_TO_0
|
|
fst.d $f\i, $sp, (8 * \i)
|
|
.endr
|
|
.endm
|
|
|
|
.macro RESTORE_ARG_REGISTERS
|
|
.irp i,FROM_0_TO_7
|
|
fld.d $f\i, $sp, (8 * \i)
|
|
.endr
|
|
.irp i,FROM_0_TO_7
|
|
ld.d $a\i, $sp, (8 * 8 + 8 * \i)
|
|
.endr
|
|
.endm
|
|
|
|
.macro SAVE_RET_REGISTERS
|
|
st.d $a1, $sp, 24
|
|
st.d $a0, $sp, 16
|
|
fst.d $f1, $sp, 8
|
|
fst.d $f0, $sp, 0
|
|
.endm
|
|
|
|
.macro RESTORE_RET_REGISTERS
|
|
fld.d $f0, $sp, 0
|
|
fld.d $f1, $sp, 8
|
|
ld.d $a0, $sp, 16
|
|
ld.d $a1, $sp, 24
|
|
.endm
|
|
|
|
.text
|
|
.file "xray_trampoline_loongarch64.S"
|
|
.globl ASM_SYMBOL(__xray_FunctionEntry)
|
|
ASM_HIDDEN(__xray_FunctionEntry)
|
|
.p2align 2
|
|
ASM_TYPE_FUNCTION(__xray_FunctionEntry)
|
|
ASM_SYMBOL(__xray_FunctionEntry):
|
|
.cfi_startproc
|
|
// Save argument registers before doing any actual work.
|
|
.cfi_def_cfa_offset 136
|
|
addi.d $sp, $sp, -136
|
|
st.d $ra, $sp, 128
|
|
.cfi_offset 1, -8
|
|
SAVE_ARG_REGISTERS
|
|
|
|
la.got $t2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
|
|
ld.d $t2, $t2, 0
|
|
|
|
beqz $t2, FunctionEntry_restore
|
|
|
|
// a1=0 means that we are tracing an entry event.
|
|
move $a1, $zero
|
|
// Function ID is in t1 (the first parameter).
|
|
move $a0, $t1
|
|
jirl $ra, $t2, 0
|
|
|
|
FunctionEntry_restore:
|
|
// Restore argument registers.
|
|
RESTORE_ARG_REGISTERS
|
|
ld.d $ra, $sp, 128
|
|
addi.d $sp, $sp, 136
|
|
ret
|
|
FunctionEntry_end:
|
|
ASM_SIZE(__xray_FunctionEntry)
|
|
.cfi_endproc
|
|
|
|
.text
|
|
.globl ASM_SYMBOL(__xray_FunctionExit)
|
|
ASM_HIDDEN(__xray_FunctionExit)
|
|
.p2align 2
|
|
ASM_TYPE_FUNCTION(__xray_FunctionExit)
|
|
ASM_SYMBOL(__xray_FunctionExit):
|
|
.cfi_startproc
|
|
// Save return registers before doing any actual work.
|
|
.cfi_def_cfa_offset 48
|
|
addi.d $sp, $sp, -48
|
|
st.d $ra, $sp, 40
|
|
.cfi_offset 1, -8
|
|
st.d $fp, $sp, 32
|
|
SAVE_RET_REGISTERS
|
|
|
|
la.got $t2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
|
|
ld.d $t2, $t2, 0
|
|
|
|
beqz $t2, FunctionExit_restore
|
|
|
|
// a1=1 means that we are tracing an exit event.
|
|
li.w $a1, 1
|
|
// Function ID is in t1 (the first parameter).
|
|
move $a0, $t1
|
|
jirl $ra, $t2, 0
|
|
|
|
FunctionExit_restore:
|
|
// Restore return registers.
|
|
RESTORE_RET_REGISTERS
|
|
ld.d $fp, $sp, 32
|
|
ld.d $ra, $sp, 40
|
|
addi.d $sp, $sp, 48
|
|
ret
|
|
|
|
FunctionExit_end:
|
|
ASM_SIZE(__xray_FunctionExit)
|
|
.cfi_endproc
|