| //===-- xray_trampoline_hexagon.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 hexagon-specific assembler for the trampolines. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "../builtins/assembly.h" |
| #include "../sanitizer_common/sanitizer_asm.h" |
| |
| .macro SAVE_REGISTERS |
| memw(sp+#0)=r0 |
| memw(sp+#4)=r1 |
| memw(sp+#8)=r2 |
| memw(sp+#12)=r3 |
| memw(sp+#16)=r4 |
| .endm |
| .macro RESTORE_REGISTERS |
| r0=memw(sp+#0) |
| r1=memw(sp+#4) |
| r2=memw(sp+#8) |
| r3=memw(sp+#12) |
| r4=memw(sp+#16) |
| .endm |
| |
| .macro CALL_PATCHED_FUNC entry_type |
| // if (xray::XRayPatchedFunctionE != NULL) |
| // xray::XRayPatchedFunctionE(FuncType); |
| |
| r8 = #ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) |
| |
| // The patched sled puts the function type |
| // into r6. Move it into r0 to pass it to |
| // the patched function. |
| { r0 = r6 |
| r1 = \entry_type |
| p0 = !cmp.eq(r8, #0) |
| if (p0) callr r8 } |
| .endm |
| |
| .text |
| .globl ASM_SYMBOL(__xray_FunctionEntry) |
| ASM_HIDDEN(__xray_FunctionEntry) |
| ASM_TYPE_FUNCTION(__xray_FunctionEntry) |
| # LLVM-MCA-BEGIN __xray_FunctionEntry |
| ASM_SYMBOL(__xray_FunctionEntry): |
| CFI_STARTPROC |
| SAVE_REGISTERS |
| |
| CALL_PATCHED_FUNC #0 // XRayEntryType::ENTRY |
| .Ltmp0: |
| RESTORE_REGISTERS |
| // return |
| # LLVM-MCA-END |
| ASM_SIZE(__xray_FunctionEntry) |
| CFI_ENDPROC |
| |
| |
| .globl ASM_SYMBOL(__xray_FunctionExit) |
| ASM_HIDDEN(__xray_FunctionExit) |
| ASM_TYPE_FUNCTION(__xray_FunctionExit) |
| # LLVM-MCA-BEGIN __xray_FunctionExit |
| ASM_SYMBOL(__xray_FunctionExit): |
| CFI_STARTPROC |
| SAVE_REGISTERS |
| |
| CALL_PATCHED_FUNC #1 // XRayEntryType::EXIT |
| .Ltmp1: |
| RESTORE_REGISTERS |
| // return |
| jumpr r31 |
| # LLVM-MCA-END |
| ASM_SIZE(__xray_FunctionExit) |
| CFI_ENDPROC |
| |
| |
| .globl ASM_SYMBOL(__xray_FunctionTailExit) |
| ASM_HIDDEN(__xray_FunctionTailExit) |
| ASM_TYPE_FUNCTION(__xray_FunctionTailExit) |
| # LLVM-MCA-BEGIN __xray_FunctionTailExit |
| ASM_SYMBOL(__xray_FunctionTailExit): |
| CFI_STARTPROC |
| SAVE_REGISTERS |
| |
| CALL_PATCHED_FUNC #2 // XRayEntryType::TAIL |
| .Ltmp2: |
| RESTORE_REGISTERS |
| // return |
| jumpr r31 |
| # LLVM-MCA-END |
| ASM_SIZE(__xray_FunctionTailExit) |
| CFI_ENDPROC |