1//===-- xray_trampoline_hexagon.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 hexagon-specific assembler for the trampolines.
12//
13//===----------------------------------------------------------------------===//
14
15#include "../builtins/assembly.h"
16#include "../sanitizer_common/sanitizer_asm.h"
17
18.macro SAVE_REGISTERS
19memw(sp+#0)=r0
20memw(sp+#4)=r1
21memw(sp+#8)=r2
22memw(sp+#12)=r3
23memw(sp+#16)=r4
24.endm
25.macro RESTORE_REGISTERS
26r0=memw(sp+#0)
27r1=memw(sp+#4)
28r2=memw(sp+#8)
29r3=memw(sp+#12)
30r4=memw(sp+#16)
31.endm
32
33.macro CALL_PATCHED_FUNC entry_type
34	// if (xray::XRayPatchedFunctionE != NULL)
35	//     xray::XRayPatchedFunctionE(FuncType);
36
37	r8 = #ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
38
39	// The patched sled puts the function type
40	// into r6.  Move it into r0 to pass it to
41	// the patched function.
42	{ r0 = r6
43          r1 = \entry_type
44          p0 = !cmp.eq(r8, #0)
45	  if (p0) callr r8 }
46.endm
47
48	.text
49	.globl ASM_SYMBOL(__xray_FunctionEntry)
50	ASM_HIDDEN(__xray_FunctionEntry)
51	ASM_TYPE_FUNCTION(__xray_FunctionEntry)
52# LLVM-MCA-BEGIN __xray_FunctionEntry
53ASM_SYMBOL(__xray_FunctionEntry):
54	CFI_STARTPROC
55	SAVE_REGISTERS
56
57	CALL_PATCHED_FUNC #0  // XRayEntryType::ENTRY
58.Ltmp0:
59	RESTORE_REGISTERS
60	// return
61# LLVM-MCA-END
62	ASM_SIZE(__xray_FunctionEntry)
63	CFI_ENDPROC
64
65
66	.globl ASM_SYMBOL(__xray_FunctionExit)
67	ASM_HIDDEN(__xray_FunctionExit)
68	ASM_TYPE_FUNCTION(__xray_FunctionExit)
69# LLVM-MCA-BEGIN __xray_FunctionExit
70ASM_SYMBOL(__xray_FunctionExit):
71	CFI_STARTPROC
72	SAVE_REGISTERS
73
74	CALL_PATCHED_FUNC #1  // XRayEntryType::EXIT
75.Ltmp1:
76	RESTORE_REGISTERS
77	// return
78	jumpr r31
79# LLVM-MCA-END
80	ASM_SIZE(__xray_FunctionExit)
81	CFI_ENDPROC
82
83
84	.globl ASM_SYMBOL(__xray_FunctionTailExit)
85	ASM_HIDDEN(__xray_FunctionTailExit)
86	ASM_TYPE_FUNCTION(__xray_FunctionTailExit)
87# LLVM-MCA-BEGIN __xray_FunctionTailExit
88ASM_SYMBOL(__xray_FunctionTailExit):
89	CFI_STARTPROC
90	SAVE_REGISTERS
91
92	CALL_PATCHED_FUNC #2  // XRayEntryType::TAIL
93.Ltmp2:
94	RESTORE_REGISTERS
95	// return
96	jumpr r31
97# LLVM-MCA-END
98	ASM_SIZE(__xray_FunctionTailExit)
99	CFI_ENDPROC
100