(root)/
glibc-2.38/
sysdeps/
mips/
machine-gmon.h
       1  /* Machine-specific calling sequence for `mcount' profiling function.  MIPS
       2     Copyright (C) 1996-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library.  If not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <sgidefs.h>
      20  
      21  #define _MCOUNT_DECL(frompc,selfpc) \
      22  static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
      23  
      24  /* Call __mcount with the return PC for our caller,
      25     and the return PC our caller will return to.  */
      26  
      27  #if _MIPS_SIM == _ABIO32
      28  
      29  #ifdef __PIC__
      30  # define CPLOAD ".cpload $25;"
      31  # define CPRESTORE ".cprestore 44\n\t"
      32  #else
      33  # define CPLOAD
      34  # define CPRESTORE
      35  #endif
      36  
      37  #define MCOUNT asm(\
      38  	".globl _mcount;\n\t" \
      39  	".align 2;\n\t" \
      40  	".set push;\n\t" \
      41  	".set nomips16;\n\t" \
      42  	".type _mcount,@function;\n\t" \
      43  	".ent _mcount\n\t" \
      44          "_mcount:\n\t" \
      45          ".frame $sp,44,$31\n\t" \
      46          ".set noreorder;\n\t" \
      47          ".set noat;\n\t" \
      48          CPLOAD \
      49  	"subu $29,$29,48;\n\t" \
      50  	CPRESTORE \
      51          "sw $4,24($29);\n\t" \
      52          "sw $5,28($29);\n\t" \
      53          "sw $6,32($29);\n\t" \
      54          "sw $7,36($29);\n\t" \
      55          "sw $2,40($29);\n\t" \
      56          "sw $1,16($29);\n\t" \
      57          "sw $31,20($29);\n\t" \
      58          "move $5,$31;\n\t" \
      59          "move $4,$1;\n\t" \
      60          "jal __mcount;\n\t" \
      61          "nop;\n\t" \
      62          "lw $4,24($29);\n\t" \
      63          "lw $5,28($29);\n\t" \
      64          "lw $6,32($29);\n\t" \
      65          "lw $7,36($29);\n\t" \
      66          "lw $2,40($29);\n\t" \
      67          "lw $31,20($29);\n\t" \
      68          "lw $1,16($29);\n\t" \
      69          "addu $29,$29,56;\n\t" \
      70          "j $31;\n\t" \
      71          "move $31,$1;\n\t" \
      72  	".end _mcount;\n\t" \
      73  	".set pop");
      74  
      75  #else
      76  
      77  #ifdef __PIC__
      78  # define CPSETUP ".cpsetup $25, 88, _mcount;"
      79  # define CPRETURN ".cpreturn;"
      80  #else
      81  # define CPSETUP
      82  # define CPRETURN
      83  #endif
      84  
      85  #if _MIPS_SIM == _ABIN32
      86  # if !defined __mips_isa_rev || __mips_isa_rev < 6
      87  #  define PTR_ADDU_STRING "add" /* no u */
      88  #  define PTR_SUBU_STRING "sub" /* no u */
      89  # else
      90  #  define PTR_ADDU_STRING "addu"
      91  #  define PTR_SUBU_STRING "subu"
      92  # endif
      93  #elif _MIPS_SIM == _ABI64
      94  # define PTR_ADDU_STRING "daddu"
      95  # define PTR_SUBU_STRING "dsubu"
      96  #else
      97  # error "Unknown ABI"
      98  #endif
      99  
     100  #define MCOUNT asm(\
     101  	".globl _mcount;\n\t" \
     102  	".align 3;\n\t" \
     103  	".set push;\n\t" \
     104  	".set nomips16;\n\t" \
     105  	".type _mcount,@function;\n\t" \
     106  	".ent _mcount\n\t" \
     107          "_mcount:\n\t" \
     108          ".frame $sp,88,$31\n\t" \
     109          ".set noreorder;\n\t" \
     110          ".set noat;\n\t" \
     111          PTR_SUBU_STRING " $29,$29,96;\n\t" \
     112          CPSETUP \
     113          "sd $4,24($29);\n\t" \
     114          "sd $5,32($29);\n\t" \
     115          "sd $6,40($29);\n\t" \
     116          "sd $7,48($29);\n\t" \
     117          "sd $8,56($29);\n\t" \
     118          "sd $9,64($29);\n\t" \
     119          "sd $10,72($29);\n\t" \
     120          "sd $11,80($29);\n\t" \
     121          "sd $2,16($29);\n\t" \
     122          "sd $1,0($29);\n\t" \
     123          "sd $31,8($29);\n\t" \
     124          "move $5,$31;\n\t" \
     125          "move $4,$1;\n\t" \
     126          "jal __mcount;\n\t" \
     127          "nop;\n\t" \
     128          "ld $4,24($29);\n\t" \
     129          "ld $5,32($29);\n\t" \
     130          "ld $6,40($29);\n\t" \
     131          "ld $7,48($29);\n\t" \
     132          "ld $8,56($29);\n\t" \
     133          "ld $9,64($29);\n\t" \
     134          "ld $10,72($29);\n\t" \
     135          "ld $11,80($29);\n\t" \
     136          "ld $2,16($29);\n\t" \
     137          "ld $31,8($29);\n\t" \
     138          "ld $1,0($29);\n\t" \
     139          CPRETURN \
     140          PTR_ADDU_STRING " $29,$29,96;\n\t" \
     141          "j $31;\n\t" \
     142          "move $31,$1;\n\t" \
     143  	".end _mcount;\n\t" \
     144  	".set pop");
     145  
     146  #endif