diff options
Diffstat (limited to 'gmon')
-rw-r--r-- | gmon/Makefile | 2 | ||||
-rw-r--r-- | gmon/mcount.c | 30 | ||||
-rw-r--r-- | gmon/sys/gmon.h | 1 |
3 files changed, 29 insertions, 4 deletions
diff --git a/gmon/Makefile b/gmon/Makefile index e44e3c75af..8fd25c6258 100644 --- a/gmon/Makefile +++ b/gmon/Makefile @@ -21,7 +21,7 @@ # subdir := gmon -headers := sys/gmon.h machine-gmon.h +headers := sys/gmon.h routines := gmon mcount profil diff --git a/gmon/mcount.c b/gmon/mcount.c index 523217d1d2..ac3584d4a5 100644 --- a/gmon/mcount.c +++ b/gmon/mcount.c @@ -48,14 +48,38 @@ static char sccsid[] = "@(#)mcount.c 8.1 (Berkeley) 6/4/93"; * _mcount updates data structures that represent traversals of the * program's call graph edges. frompc and selfpc are the return * address and function address that represents the given call graph edge. - * + * * Note: the original BSD code used the same variable (frompcindex) for * both frompcindex and frompc. Any reasonable, modern compiler will * perform this optimization. */ +#if 0 _MCOUNT_DECL(frompc, selfpc) /* _mcount; may be static, inline, etc */ register u_long frompc, selfpc; +#endif + +/* GCC version 2 gives us a perfect magical function to get + just the information we need: + void *__builtin_return_address (unsigned int N) + returns the return address of the frame N frames up. */ + +#if __GNUC__ < 2 + #error "This file uses __builtin_return_address, a GCC 2 extension." +#endif + +#include <sysdep.h> +#ifndef NO_UNDERSCORES +/* The asm symbols for C functions are `_function'. + The canonical name for the counter function is `mcount', no _. */ +void _mcount (void) asm ("mcount"); +#endif + +void +_mcount (void) { + register u_long selfpc = (u_long) __builtin_return_address (0); + register u_long frompc = (u_long) __builtin_return_address (1); + register u_short *frompcindex; register struct tostruct *top, *prevtop; register struct gmonparam *p; @@ -154,7 +178,7 @@ _MCOUNT_DECL(frompc, selfpc) /* _mcount; may be static, inline, etc */ *frompcindex = toindex; goto done; } - + } done: #ifdef KERNEL @@ -171,8 +195,10 @@ overflow: return; } +#if 0 /* Obsolete with __builtin_return_address. */ /* * Actual definition of mcount function. Defined in <machine/profile.h>, * which is included by <sys/gmon.h>. */ MCOUNT +#endif diff --git a/gmon/sys/gmon.h b/gmon/sys/gmon.h index 7064a43cb9..f7af72b98a 100644 --- a/gmon/sys/gmon.h +++ b/gmon/sys/gmon.h @@ -37,7 +37,6 @@ #define _SYS_GMON_H_ #include <sys/cdefs.h> -#include <machine-gmon.h> /* * Structure prepended to gmon.out profiling data file. |