1 | //===-- xray_trampoline_mips.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 MIPS-specific assembler for the trampolines. |
12 | // |
13 | //===----------------------------------------------------------------------===// |
14 | |
15 | .text |
16 | .file "xray_trampoline_mips.S" |
17 | .globl __xray_FunctionEntry |
18 | .p2align 2 |
19 | .type __xray_FunctionEntry,@function |
20 | __xray_FunctionEntry: |
21 | .cfi_startproc |
22 | .set noreorder |
23 | .cpload $t9 |
24 | .set reorder |
25 | // Save argument registers before doing any actual work |
26 | .cfi_def_cfa_offset 36 |
27 | addiu $sp, $sp, -36 |
28 | sw $ra, 32($sp) |
29 | .cfi_offset 31, -4 |
30 | sw $a3, 28($sp) |
31 | sw $a2, 24($sp) |
32 | sw $a1, 20($sp) |
33 | sw $a0, 16($sp) |
34 | sdc1 $f14, 8($sp) |
35 | sdc1 $f12, 0($sp) |
36 | |
37 | la $t9, _ZN6__xray19XRayPatchedFunctionE |
38 | lw $t9, 0($t9) |
39 | |
40 | beqz $t9, FunctionEntry_restore |
41 | |
42 | // a1=0 means that we are tracing an entry event |
43 | move $a1, $zero |
44 | // Function ID is in t0 (the first parameter). |
45 | move $a0, $t0 |
46 | jalr $t9 |
47 | |
48 | FunctionEntry_restore: |
49 | // Restore argument registers |
50 | ldc1 $f12, 0($sp) |
51 | ldc1 $f14, 8($sp) |
52 | lw $a0, 16($sp) |
53 | lw $a1, 20($sp) |
54 | lw $a2, 24($sp) |
55 | lw $a3, 28($sp) |
56 | lw $ra, 32($sp) |
57 | addiu $sp, $sp, 36 |
58 | jr $ra |
59 | FunctionEntry_end: |
60 | .size __xray_FunctionEntry, FunctionEntry_end-__xray_FunctionEntry |
61 | .cfi_endproc |
62 | |
63 | .text |
64 | .globl __xray_FunctionExit |
65 | .p2align 2 |
66 | .type __xray_FunctionExit,@function |
67 | __xray_FunctionExit: |
68 | .cfi_startproc |
69 | .set noreorder |
70 | .cpload $t9 |
71 | .set reorder |
72 | // Save return registers before doing any actual work. |
73 | .cfi_def_cfa_offset 36 |
74 | addiu $sp, $sp, -36 |
75 | sw $ra, 32($sp) |
76 | .cfi_offset 31, -4 |
77 | sw $a1, 28($sp) |
78 | sw $a0, 24($sp) |
79 | sw $v1, 20($sp) |
80 | sw $v0, 16($sp) |
81 | sdc1 $f2, 8($sp) |
82 | sdc1 $f0, 0($sp) |
83 | |
84 | la $t9, _ZN6__xray19XRayPatchedFunctionE |
85 | lw $t9, 0($t9) |
86 | |
87 | beqz $t9, FunctionExit_restore |
88 | |
89 | // a1=1 means that we are tracing an exit event |
90 | li $a1, 1 |
91 | // Function ID is in t0 (the first parameter). |
92 | move $a0, $t0 |
93 | jalr $t9 |
94 | |
95 | FunctionExit_restore: |
96 | // Restore return registers |
97 | ldc1 $f0, 0($sp) |
98 | ldc1 $f2, 8($sp) |
99 | lw $v0, 16($sp) |
100 | lw $v1, 20($sp) |
101 | lw $a0, 24($sp) |
102 | lw $a1, 28($sp) |
103 | lw $ra, 32($sp) |
104 | addiu $sp, $sp, 36 |
105 | jr $ra |
106 | |
107 | FunctionExit_end: |
108 | .size __xray_FunctionExit, FunctionExit_end-__xray_FunctionExit |
109 | .cfi_endproc |
110 | |