| //===-- xray_trampoline_riscv_common.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 trampolines code shared between riscv32 and riscv64. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "../builtins/assembly.h" |
| |
| .text |
| .p2align 2 |
| .global ASM_SYMBOL(__xray_FunctionEntry) |
| ASM_TYPE_FUNCTION(__xray_FunctionEntry) |
| ASM_SYMBOL(__xray_FunctionEntry): |
| CFI_STARTPROC |
| SAVE_ARG_REGISTERS |
| |
| // Load the handler function pointer into a2 |
| la a2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) |
| LOAD_XLEN a2, 0(a2) |
| |
| // Handler address will be null if it is not set |
| beq a2, x0, 1f |
| |
| // If we reach here, we are tracing an event |
| // a0 already contains function id |
| // a1 = 0 means we are tracing an entry event |
| li a1, 0 |
| jalr a2 |
| |
| 1: |
| RESTORE_ARG_REGISTERS |
| jr ra |
| ASM_SIZE(__xray_FunctionEntry) |
| CFI_ENDPROC |
| |
| .text |
| .p2align 2 |
| .global ASM_SYMBOL(__xray_FunctionExit) |
| ASM_TYPE_FUNCTION(__xray_FunctionExit) |
| ASM_SYMBOL(__xray_FunctionExit): |
| CFI_STARTPROC |
| SAVE_RET_REGISTERS |
| |
| // Load the handler function pointer into a2 |
| la a2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) |
| LOAD_XLEN a2, 0(a2) |
| |
| // Handler address will be null if it is not set |
| beq a2, x0, 1f |
| |
| // If we reach here, we are tracing an event |
| // a0 already contains function id |
| // a1 = 1 means we are tracing an exit event |
| li a1, 1 |
| jalr a2 |
| |
| 1: |
| RESTORE_RET_REGISTERS |
| jr ra |
| ASM_SIZE(__xray_FunctionExit) |
| CFI_ENDPROC |
| |
| .text |
| .p2align 2 |
| .global ASM_SYMBOL(__xray_FunctionTailExit) |
| ASM_TYPE_FUNCTION(__xray_FunctionTailExit) |
| ASM_SYMBOL(__xray_FunctionTailExit): |
| CFI_STARTPROC |
| SAVE_ARG_REGISTERS |
| |
| // Load the handler function pointer into a2 |
| la a2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) |
| LOAD_XLEN a2, 0(a2) |
| |
| // Handler address will be null if it is not set |
| beq a2, x0, 1f |
| |
| // If we reach here, we are tracing an event |
| // a0 already contains function id |
| // a1 = 2 means we are tracing a tail exit event |
| li a1, 2 |
| jalr a2 |
| |
| 1: |
| RESTORE_ARG_REGISTERS |
| jr ra |
| ASM_SIZE(__xray_FunctionTailExit) |
| CFI_ENDPROC |