Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / compiler-rt / lib / xray / xray_trampoline_hexagon.S
blobc87ec4bed1f9c201e3dbcc379014de3a44e4dab8
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.
11 // This implements the hexagon-specific assembler for the trampolines.
13 //===----------------------------------------------------------------------===//
15 #include "../builtins/assembly.h"
16 #include "../sanitizer_common/sanitizer_asm.h"
18 .macro SAVE_REGISTERS
19 memw(sp+#0)=r0
20 memw(sp+#4)=r1
21 memw(sp+#8)=r2
22 memw(sp+#12)=r3
23 memw(sp+#16)=r4
24 .endm
25 .macro RESTORE_REGISTERS
26 r0=memw(sp+#0)
27 r1=memw(sp+#4)
28 r2=memw(sp+#8)
29 r3=memw(sp+#12)
30 r4=memw(sp+#16)
31 .endm
33 .macro CALL_PATCHED_FUNC entry_type
34         // if (xray::XRayPatchedFunctionE != NULL)
35         //     xray::XRayPatchedFunctionE(FuncType);
37         r8 = #ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
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
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
53 ASM_SYMBOL(__xray_FunctionEntry):
54         CFI_STARTPROC
55         SAVE_REGISTERS
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
66         .globl ASM_SYMBOL(__xray_FunctionExit)
67         ASM_HIDDEN(__xray_FunctionExit)
68         ASM_TYPE_FUNCTION(__xray_FunctionExit)
69 # LLVM-MCA-BEGIN __xray_FunctionExit
70 ASM_SYMBOL(__xray_FunctionExit):
71         CFI_STARTPROC
72         SAVE_REGISTERS
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
84         .globl ASM_SYMBOL(__xray_FunctionTailExit)
85         ASM_HIDDEN(__xray_FunctionTailExit)
86         ASM_TYPE_FUNCTION(__xray_FunctionTailExit)
87 # LLVM-MCA-BEGIN __xray_FunctionTailExit
88 ASM_SYMBOL(__xray_FunctionTailExit):
89         CFI_STARTPROC
90         SAVE_REGISTERS
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