Blame sysdeps/alpha/_mcount.S

Packit Service 82fcde
/* Machine-specific calling sequence for `mcount' profiling function.  alpha
Packit Service 82fcde
   Copyright (C) 1995-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   Contributed by David Mosberger (davidm@cs.arizona.edu).
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library.  If not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
/* Assembly stub to invoke _mcount().  Compiler generated code calls
Packit Service 82fcde
   this stub after executing a function's prologue and without saving any
Packit Service 82fcde
   registers.  It is therefore necessary to preserve a0..a5 as they may
Packit Service 82fcde
   contain function arguments.  To work correctly with frame- less
Packit Service 82fcde
   functions, it is also necessary to preserve ra.  Finally, division
Packit Service 82fcde
   routines are invoked with a special calling convention and the
Packit Service 82fcde
   compiler treats those calls as if they were instructions.  In
Packit Service 82fcde
   particular, it doesn't save any of the temporary registers (caller
Packit Service 82fcde
   saved registers).  It is therefore necessary to preserve all
Packit Service 82fcde
   caller-saved registers as well.
Packit Service 82fcde
Packit Service 82fcde
   Upon entering _mcount, register $at holds the return address and ra
Packit Service 82fcde
   holds the return address of the function's caller (selfpc and frompc,
Packit Service 82fcde
   respectively in gmon.c language...). */
Packit Service 82fcde
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
Packit Service 82fcde
	.set	noat
Packit Service 82fcde
	.set	noreorder
Packit Service 82fcde
Packit Service 82fcde
LEAF(_mcount, 0xb0)
Packit Service 82fcde
	subq	 sp, 0xb0, sp
Packit Service 82fcde
	.prologue 0
Packit Service 82fcde
	stq	 a0, 0x00(sp)
Packit Service 82fcde
	mov	 ra, a0		# a0 = caller-pc
Packit Service 82fcde
	stq	 a1, 0x08(sp)
Packit Service 82fcde
	mov	$at, a1		# a1 = self-pc
Packit Service 82fcde
	stq	$at, 0x10(sp)
Packit Service 82fcde
Packit Service 82fcde
	stq	 a2, 0x18(sp)
Packit Service 82fcde
	stq	 a3, 0x20(sp)
Packit Service 82fcde
	stq	 a4, 0x28(sp)
Packit Service 82fcde
	stq	 a5, 0x30(sp)
Packit Service 82fcde
	stq	 ra, 0x38(sp)
Packit Service 82fcde
	stq	 gp, 0x40(sp)
Packit Service 82fcde
Packit Service 82fcde
	br	gp, 1f
Packit Service 82fcde
1:	ldgp	gp, 0(gp)
Packit Service 82fcde
Packit Service 82fcde
	stq	 t0, 0x48(sp)
Packit Service 82fcde
	stq	 t1, 0x50(sp)
Packit Service 82fcde
	stq	 t2, 0x58(sp)
Packit Service 82fcde
	stq	 t3, 0x60(sp)
Packit Service 82fcde
	stq	 t4, 0x68(sp)
Packit Service 82fcde
	stq	 t5, 0x70(sp)
Packit Service 82fcde
	stq	 t6, 0x78(sp)
Packit Service 82fcde
Packit Service 82fcde
	stq	 t7, 0x80(sp)
Packit Service 82fcde
	stq	 t8, 0x88(sp)
Packit Service 82fcde
	stq	 t9, 0x90(sp)
Packit Service 82fcde
	stq	t10, 0x98(sp)
Packit Service 82fcde
	stq	t11, 0xa0(sp)
Packit Service 82fcde
	stq	 v0, 0xa8(sp)
Packit Service 82fcde
Packit Service 82fcde
	jsr	ra, __mcount
Packit Service 82fcde
Packit Service 82fcde
	ldq	 a0, 0x00(sp)
Packit Service 82fcde
	ldq	 a1, 0x08(sp)
Packit Service 82fcde
	ldq	$at, 0x10(sp)	# restore self-pc
Packit Service 82fcde
	ldq	 a2, 0x18(sp)
Packit Service 82fcde
	ldq	 a3, 0x20(sp)
Packit Service 82fcde
	ldq	 a4, 0x28(sp)
Packit Service 82fcde
	ldq	 a5, 0x30(sp)
Packit Service 82fcde
	ldq	 ra, 0x38(sp)
Packit Service 82fcde
	ldq	 gp, 0x40(sp)
Packit Service 82fcde
	mov	$at, pv		# make pv point to return address
Packit Service 82fcde
	ldq	 t0, 0x48(sp)	# this is important under OSF/1 to
Packit Service 82fcde
	ldq	 t1, 0x50(sp)	# ensure that the code that we return
Packit Service 82fcde
	ldq	 t2, 0x58(sp)	# can correctly compute its gp
Packit Service 82fcde
	ldq	 t3, 0x60(sp)
Packit Service 82fcde
	ldq	 t4, 0x68(sp)
Packit Service 82fcde
	ldq	 t5, 0x70(sp)
Packit Service 82fcde
	ldq	 t6, 0x78(sp)
Packit Service 82fcde
	ldq	 t7, 0x80(sp)
Packit Service 82fcde
	ldq	 t8, 0x88(sp)
Packit Service 82fcde
	ldq	 t9, 0x90(sp)
Packit Service 82fcde
	ldq	t10, 0x98(sp)
Packit Service 82fcde
	ldq	t11, 0xa0(sp)
Packit Service 82fcde
	ldq	 v0, 0xa8(sp)
Packit Service 82fcde
Packit Service 82fcde
	addq	sp, 0xb0, sp
Packit Service 82fcde
	ret	zero,($at),1
Packit Service 82fcde
Packit Service 82fcde
	END(_mcount)
Packit Service 82fcde
Packit Service 82fcde
weak_alias (_mcount, mcount)