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 48FunctionEntry_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 59FunctionEntry_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 95FunctionExit_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 107FunctionExit_end: 108 .size __xray_FunctionExit, FunctionExit_end-__xray_FunctionExit 109 .cfi_endproc 110