Blame sysdeps/arm/arm-mcount.S

Packit Service 82fcde
/* Implementation of profiling support.  ARM EABI version.
Packit Service 82fcde
   Copyright (C) 2008-2018 Free Software Foundation, Inc.
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
/* Don't call mcount when calling mcount...  */
Packit Service 82fcde
#undef PROF
Packit Service 82fcde
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
Packit Service 82fcde
#undef mcount
Packit Service 82fcde
Packit Service 82fcde
#ifdef __thumb2__
Packit Service 82fcde
	.thumb
Packit Service 82fcde
#endif
Packit Service 82fcde
	.syntax unified
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Use an assembly stub with a special ABI.  The calling lr has been
Packit Service 82fcde
   pushed to the stack (which will be misaligned).  We should preserve
Packit Service 82fcde
   all registers except ip and pop a word off the stack.
Packit Service 82fcde
Packit Service 82fcde
   NOTE: This assumes mcount_internal does not clobber any non-core
Packit Service 82fcde
   (coprocessor) registers.  Currently this is true, but may require
Packit Service 82fcde
   additional attention in the future.
Packit Service 82fcde
Packit Service 82fcde
   The calling sequence looks something like:
Packit Service 82fcde
func:
Packit Service 82fcde
   push {lr}
Packit Service 82fcde
   bl __gnu_mcount_nc
Packit Service 82fcde
   <function body>
Packit Service 82fcde
*/
Packit Service 82fcde
Packit Service 82fcde
ENTRY(__gnu_mcount_nc)
Packit Service 82fcde
	push {r0, r1, r2, r3, lr}
Packit Service 82fcde
	cfi_adjust_cfa_offset (20)
Packit Service 82fcde
	cfi_rel_offset (r0, 0)
Packit Service 82fcde
	cfi_rel_offset (r1, 4)
Packit Service 82fcde
	cfi_rel_offset (r2, 8)
Packit Service 82fcde
	cfi_rel_offset (r3, 12)
Packit Service 82fcde
	cfi_rel_offset (lr, 16)
Packit Service 82fcde
	bic r1, lr, #1
Packit Service 82fcde
	ldr r0, [sp, #20]
Packit Service 82fcde
	bl __mcount_internal
Packit Service 82fcde
	pop {r0, r1, r2, r3, ip, lr}
Packit Service 82fcde
	cfi_adjust_cfa_offset (-24)
Packit Service 82fcde
	cfi_restore (r0)
Packit Service 82fcde
	cfi_restore (r1)
Packit Service 82fcde
	cfi_restore (r2)
Packit Service 82fcde
	cfi_restore (r3)
Packit Service 82fcde
	cfi_register (lr, ip)
Packit Service 82fcde
	bx ip
Packit Service 82fcde
END(__gnu_mcount_nc)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
#include <gcc-compat.h>
Packit Service 82fcde
#include <shlib-compat.h>
Packit Service 82fcde
Packit Service 82fcde
/* The new __gnu_mcount_nc entry point was introduced in 4.4, so the
Packit Service 82fcde
   static library needs the old one only to support older compilers.
Packit Service 82fcde
   Even in a configuration that only cares about newer compilers, the
Packit Service 82fcde
   shared library might need it only for strict ABI compatibility.  */
Packit Service 82fcde
Packit Service 82fcde
#if GCC_COMPAT (4, 3) || SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
Packit Service 82fcde
Packit Service 82fcde
/* Provide old mcount for backwards compatibility.  This requires
Packit Service 82fcde
   code be compiled with APCS frame pointers.  */
Packit Service 82fcde
Packit Service 82fcde
ENTRY(__mcount_arm_compat)
Packit Service 82fcde
	push	{r0, r1, r2, r3, fp, lr}
Packit Service 82fcde
	cfi_adjust_cfa_offset (24)
Packit Service 82fcde
	cfi_rel_offset (r0, 0)
Packit Service 82fcde
	cfi_rel_offset (r1, 4)
Packit Service 82fcde
	cfi_rel_offset (r2, 8)
Packit Service 82fcde
	cfi_rel_offset (r3, 12)
Packit Service 82fcde
	cfi_rel_offset (fp, 16)
Packit Service 82fcde
	cfi_rel_offset (lr, 20)
Packit Service 82fcde
	movs r0, fp
Packit Service 82fcde
	ittt ne
Packit Service 82fcde
	ldrne r0, [r0, #-4]
Packit Service 82fcde
	movsne r1, lr
Packit Service 82fcde
	blne __mcount_internal
Packit Service 82fcde
# if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
Packit Service 82fcde
	pop	{r0, r1, r2, r3, fp, lr}
Packit Service 82fcde
	cfi_adjust_cfa_offset (-24)
Packit Service 82fcde
	cfi_restore (r0)
Packit Service 82fcde
	cfi_restore (r1)
Packit Service 82fcde
	cfi_restore (r2)
Packit Service 82fcde
	cfi_restore (r3)
Packit Service 82fcde
	cfi_restore (fp)
Packit Service 82fcde
	cfi_restore (lr)
Packit Service 82fcde
	bx lr
Packit Service 82fcde
# else
Packit Service 82fcde
	pop	{r0, r1, r2, r3, fp, pc}
Packit Service 82fcde
# endif
Packit Service 82fcde
END(__mcount_arm_compat)
Packit Service 82fcde
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#if GCC_COMPAT (4, 3)
Packit Service 82fcde
Packit Service 82fcde
strong_alias (__mcount_arm_compat, _mcount)
Packit Service 82fcde
Packit Service 82fcde
/* The canonical name for the function is `_mcount' in both C and asm,
Packit Service 82fcde
   but some old asm code might assume it's `mcount'.  */
Packit Service 82fcde
weak_alias (_mcount, mcount)
Packit Service 82fcde
Packit Service 82fcde
#elif SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
Packit Service 82fcde
Packit Service 82fcde
compat_symbol (libc, __mcount_arm_compat, _mcount, GLIBC_2_0)
Packit Service 82fcde
Packit Service 82fcde
strong_alias (__mcount_arm_compat, __mcount_arm_compat_1)
Packit Service 82fcde
compat_symbol (libc, __mcount_arm_compat_1, mcount, GLIBC_2_0)
Packit Service 82fcde
Packit Service 82fcde
#endif