about summary refs log tree commit diff
path: root/gmon
diff options
context:
space:
mode:
Diffstat (limited to 'gmon')
-rw-r--r--gmon/Makefile2
-rw-r--r--gmon/mcount.c30
-rw-r--r--gmon/sys/gmon.h1
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.