summaryrefslogtreecommitdiff
path: root/usr.bin/gprof/i386.c
diff options
context:
space:
mode:
authorThorsten Lockert <tholo@cvs.openbsd.org>1996-10-02 02:59:51 +0000
committerThorsten Lockert <tholo@cvs.openbsd.org>1996-10-02 02:59:51 +0000
commit36ae36319d92202d4c1d7634d20ab3dcc402e907 (patch)
tree1dd176e17be7e447ebc7bf06b21254eccc37e73e /usr.bin/gprof/i386.c
parentfdfd0e2d2493cfee377e69f3468092370c9043f2 (diff)
Support for call graph detection using the -c options on i386
Diffstat (limited to 'usr.bin/gprof/i386.c')
-rw-r--r--usr.bin/gprof/i386.c55
1 files changed, 53 insertions, 2 deletions
diff --git a/usr.bin/gprof/i386.c b/usr.bin/gprof/i386.c
index ab3f51d0c2c..250852b167f 100644
--- a/usr.bin/gprof/i386.c
+++ b/usr.bin/gprof/i386.c
@@ -1,12 +1,14 @@
-/* $OpenBSD: i386.c,v 1.2 1996/06/26 05:33:52 deraadt Exp $ */
+/* $OpenBSD: i386.c,v 1.3 1996/10/02 02:59:50 tholo Exp $ */
/* $NetBSD: i386.c,v 1.5 1995/04/19 07:16:04 cgd Exp $ */
#ifndef lint
-static char rcsid[] = "$OpenBSD: i386.c,v 1.2 1996/06/26 05:33:52 deraadt Exp $";
+static char rcsid[] = "$OpenBSD: i386.c,v 1.3 1996/10/02 02:59:50 tholo Exp $";
#endif /* not lint */
#include "gprof.h"
+#define iscall(pc) ((*pc) == 0xE8)
+
/*
* gprof -c isn't currently supported...
*/
@@ -15,4 +17,53 @@ findcall( parentp , p_lowpc , p_highpc )
unsigned long p_lowpc;
unsigned long p_highpc;
{
+ unsigned char *pc;
+ long len;
+ nltype *childp;
+ unsigned long destpc;
+
+ if (textspace == 0)
+ return;
+ if (p_lowpc < s_lowpc)
+ p_lowpc = s_lowpc;
+ if (p_highpc > s_highpc)
+ p_highpc = s_highpc;
+# ifdef DEBUG
+ if ( debug & CALLDEBUG ) {
+ printf( "[findcall] %s: 0x%x to 0x%x\n" ,
+ parentp -> name , p_lowpc , p_highpc );
+ }
+# endif DEBUG
+ for (pc = textspace + p_lowpc - N_TXTADDR(xbuf) ; pc < textspace + p_highpc - N_TXTADDR(xbuf) ; pc += len) {
+ len = 1;
+ if (iscall(pc)) {
+ destpc = *(unsigned long *)(pc + 1) + (pc - textspace + N_TXTADDR(xbuf)) + 5;
+# ifdef DEBUG
+ if ( debug & CALLDEBUG ) {
+ printf( "[findcall]\t0x%x:calls" , pc - textspace );
+ printf( "\tdestpc 0x%x" , destpc );
+ }
+# endif DEBUG
+ if (destpc >= s_lowpc && destpc <= s_highpc) {
+ childp = nllookup(destpc);
+# ifdef DEBUG
+ if ( debug & CALLDEBUG ) {
+ printf( " childp->name %s" , childp -> name );
+ printf( " childp->value 0x%x\n" ,
+ childp -> value );
+ }
+# endif DEBUG
+ if (childp != NULL && childp->value == destpc) {
+ addarc(parentp, childp, 0L);
+ len += 4;
+ continue;
+ }
+ }
+# ifdef DEBUG
+ if ( debug & CALLDEBUG ) {
+ printf( "\tbut it's a botch\n" );
+ }
+# endif DEBUG
+ }
+ }
}