Improved profiling for ARM.

This commit is contained in:
Ulrich Drepper 1998-07-27 17:52:05 +00:00
parent 67950c312e
commit 7d39ca8849
1 changed files with 26 additions and 16 deletions

View File

@ -1,5 +1,5 @@
/* Machine-dependent definitions for profiling support. ARM version.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -37,19 +37,29 @@ static void mcount_internal (u_long frompc, u_long selfpc);
#define _MCOUNT_DECL(frompc, selfpc) \
static void mcount_internal (u_long frompc, u_long selfpc)
#define MCOUNT \
void _mcount (void) \
{ \
register unsigned long int frompc, selfpc; \
__asm__("movs fp, fp; " \
"moveq %0, $0; " \
"ldrne %0, [fp, $-4]; " \
"ldrne %1, [fp, $-12]; " \
"movnes %1, %1; " \
"ldrne %1, [%1, $-4]; " \
: "=g" (selfpc), "=g" (frompc) \
: : "cc" \
); \
if (selfpc) \
mcount_internal(frompc, selfpc); \
/* This macro/func MUST save r0, r1 because the compiler inserts
blind calls to _mount(), ignoring the fact that _mcount may
clobber registers; therefore, _mcount may NOT clobber registers */
/* if (this_fp!=0) {
r0 = this_lr
r1 = this_fp
r1 = [r1-4] which is caller's fp
if (r1!=0)
r1 = caller's lr
call mcount_internal(this_lr, caller's_lr)
}
*/
#define MCOUNT \
void _mcount (void) \
{ \
__asm__("stmdb sp!, {r0, r1, r2, r3};" \
"movs fp, fp;" \
"moveq r0, #0;" \
"ldrne r0, [fp, $-4];" \
"ldrne r1, [fp, $-12];" \
"movnes r1, r1;" \
"ldrne r1, [r1, $-4];" \
"movs r1, r1;" \
"blne mcount_internal;" \
"ldmia sp!, {r0, r1, r2, r3}"); \
}