Annotation of src/usr.bin/gprof/i386.c, Revision 1.8
1.8 ! deraadt 1: /* $OpenBSD: i386.c,v 1.7 2002/05/08 16:46:35 art Exp $ */
1.1 deraadt 2: /* $NetBSD: i386.c,v 1.5 1995/04/19 07:16:04 cgd Exp $ */
3:
1.6 tholo 4: /*-
5: * Copyright (c) 1996 SigmaSoft, Th. Lockert
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: *
17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27: */
28:
1.1 deraadt 29: #ifndef lint
1.8 ! deraadt 30: static char rcsid[] = "$OpenBSD: i386.c,v 1.7 2002/05/08 16:46:35 art Exp $";
1.1 deraadt 31: #endif /* not lint */
32:
33: #include "gprof.h"
34:
1.7 art 35: #define iscall(off) ((*(u_char *)&textspace[off]) == 0xE8)
1.3 tholo 36:
1.4 mickey 37: void
1.1 deraadt 38: findcall( parentp , p_lowpc , p_highpc )
39: nltype *parentp;
40: unsigned long p_lowpc;
41: unsigned long p_highpc;
42: {
1.7 art 43: unsigned long pc;
1.3 tholo 44: long len;
45: nltype *childp;
46: unsigned long destpc;
1.7 art 47: int off;
1.3 tholo 48:
49: if (textspace == 0)
50: return;
51: if (p_lowpc < s_lowpc)
52: p_lowpc = s_lowpc;
53: if (p_highpc > s_highpc)
54: p_highpc = s_highpc;
55: # ifdef DEBUG
56: if ( debug & CALLDEBUG ) {
57: printf( "[findcall] %s: 0x%x to 0x%x\n" ,
58: parentp -> name , p_lowpc , p_highpc );
59: }
1.5 danh 60: # endif /* DEBUG */
1.7 art 61: for (pc = p_lowpc; pc < p_highpc; pc += len) {
62: off = pc - s_lowpc;
1.3 tholo 63: len = 1;
1.7 art 64: if (iscall(off)) {
65: destpc = *(u_long *)&textspace[off + 1] + off + 5;
1.3 tholo 66: # ifdef DEBUG
67: if ( debug & CALLDEBUG ) {
68: printf( "[findcall]\t0x%x:calls" , pc - textspace );
69: printf( "\tdestpc 0x%x" , destpc );
70: }
1.5 danh 71: # endif /* DEBUG */
1.3 tholo 72: if (destpc >= s_lowpc && destpc <= s_highpc) {
73: childp = nllookup(destpc);
74: # ifdef DEBUG
75: if ( debug & CALLDEBUG ) {
76: printf( " childp->name %s" , childp -> name );
77: printf( " childp->value 0x%x\n" ,
78: childp -> value );
79: }
1.5 danh 80: # endif /* DEBUG */
1.3 tholo 81: if (childp != NULL && childp->value == destpc) {
82: addarc(parentp, childp, 0L);
83: len += 4;
84: continue;
85: }
86: }
87: # ifdef DEBUG
88: if ( debug & CALLDEBUG ) {
89: printf( "\tbut it's a botch\n" );
90: }
1.5 danh 91: # endif /* DEBUG */
1.3 tholo 92: }
93: }
1.1 deraadt 94: }