xref: /freebsd/contrib/llvm-project/compiler-rt/lib/xray/xray_trampoline_riscv_common.S (revision 700637cbb5e582861067a11aaca4d053546871d2)
1//===-- xray_trampoline_riscv_common.s --------------------------*- ASM -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is a part of XRay, a dynamic runtime instrumentation system.
10//
11// This implements the trampolines code shared between riscv32 and riscv64.
12//
13//===----------------------------------------------------------------------===//
14
15#include "../builtins/assembly.h"
16
17	.text
18	.p2align 2
19	.global ASM_SYMBOL(__xray_FunctionEntry)
20	ASM_TYPE_FUNCTION(__xray_FunctionEntry)
21ASM_SYMBOL(__xray_FunctionEntry):
22	CFI_STARTPROC
23        SAVE_ARG_REGISTERS
24
25	// Load the handler function pointer into a2
26	la	a2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
27        LOAD_XLEN   a2, 0(a2)
28
29	// Handler address will be null if it is not set
30	beq	a2, x0, 1f
31
32	// If we reach here, we are tracing an event
33	// a0 already contains function id
34	// a1 = 0 means we are tracing an entry event
35	li	a1, 0
36	jalr	a2
37
381:
39        RESTORE_ARG_REGISTERS
40	jr	ra
41	ASM_SIZE(__xray_FunctionEntry)
42	CFI_ENDPROC
43
44	.text
45	.p2align 2
46	.global ASM_SYMBOL(__xray_FunctionExit)
47	ASM_TYPE_FUNCTION(__xray_FunctionExit)
48ASM_SYMBOL(__xray_FunctionExit):
49	CFI_STARTPROC
50	SAVE_RET_REGISTERS
51
52	// Load the handler function pointer into a2
53	la	a2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
54        LOAD_XLEN   a2, 0(a2)
55
56	// Handler address will be null if it is not set
57	beq	a2, x0, 1f
58
59	// If we reach here, we are tracing an event
60	// a0 already contains function id
61	// a1 = 1 means we are tracing an exit event
62	li	a1, 1
63	jalr	a2
64
651:
66	RESTORE_RET_REGISTERS
67        jr	ra
68	ASM_SIZE(__xray_FunctionExit)
69	CFI_ENDPROC
70
71	.text
72	.p2align 2
73	.global ASM_SYMBOL(__xray_FunctionTailExit)
74	ASM_TYPE_FUNCTION(__xray_FunctionTailExit)
75ASM_SYMBOL(__xray_FunctionTailExit):
76	CFI_STARTPROC
77        SAVE_ARG_REGISTERS
78
79	// Load the handler function pointer into a2
80	la	a2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
81        LOAD_XLEN   a2, 0(a2)
82
83	// Handler address will be null if it is not set
84	beq	a2, x0, 1f
85
86	// If we reach here, we are tracing an event
87	// a0 already contains function id
88	// a1 = 2 means we are tracing a tail exit event
89	li	a1, 2
90	jalr	a2
91
921:
93        RESTORE_ARG_REGISTERS
94	jr	ra
95	ASM_SIZE(__xray_FunctionTailExit)
96	CFI_ENDPROC
97