(linenum→info "unix/slp.c:2238")

binutils/2.18/gprof/i386.c

    1: /*
    2:  * Copyright (c) 1983, 1993, 2001
    3:  *      The Regents of the University of California.  All rights reserved.
    4:  *
    5:  * Redistribution and use in source and binary forms, with or without
    6:  * modification, are permitted provided that the following conditions
    7:  * are met:
    8:  * 1. Redistributions of source code must retain the above copyright
    9:  *    notice, this list of conditions and the following disclaimer.
   10:  * 2. Redistributions in binary form must reproduce the above copyright
   11:  *    notice, this list of conditions and the following disclaimer in the
   12:  *    documentation and/or other materials provided with the distribution.
   13:  * 3. Neither the name of the University nor the names of its contributors
   14:  *    may be used to endorse or promote products derived from this software
   15:  *    without specific prior written permission.
   16:  *
   17:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   18:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   19:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   20:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   21:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   22:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   23:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   25:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27:  * SUCH DAMAGE.
   28:  */
   29: #include "gprof.h"
   30: #include "search_list.h"
   31: #include "source.h"
   32: #include "symtab.h"
   33: #include "cg_arcs.h"
   34: #include "corefile.h"
   35: #include "hist.h"
   36: 
   37: static int i386_iscall (unsigned char *);
   38: void i386_find_call (Sym *, bfd_vma, bfd_vma);
   39: 
   40: static int
   41: i386_iscall (unsigned char *ip)
   42: {
   43:   if (*ip == 0xe8)
   44:     return 1;
   45:   return 0;
   46: }
   47: 
   48: 
   49: void
   50: i386_find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc)
   51: {
   52:   unsigned char *instructp;
   53:   Sym *child;
   54:   bfd_vma pc, destpc;
   55: 
   56:   DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n",
   57:                           parent->name, (unsigned long) p_lowpc,
   58:                           (unsigned long) p_highpc));
   59: 
   60:   for (pc = p_lowpc; pc < p_highpc; ++pc)
   61:     {
   62:       instructp = (unsigned char *) core_text_space + pc - core_text_sect->vma;
   63:       if (i386_iscall (instructp))
   64:         {
   65:           DBG (CALLDEBUG,
   66:                printf ("[findcall]\t0x%lx:call", (unsigned long) pc));
   67:           /*
   68:            *  regular pc relative addressing
   69:            *    check that this is the address of
   70:            *    a function.
   71:            */
   72: 
   73:           destpc = bfd_get_32 (core_bfd, instructp + 1) + pc + 5;
   74:           if (hist_check_address (destpc))
   75:             {
   76:               child = sym_lookup (&symtab, destpc);
   77:               if (child && child->addr == destpc)
   78:                 {
   79:                   /*
   80:                    *      a hit
   81:                    */
   82:                   DBG (CALLDEBUG,
   83:                        printf ("\tdestpc 0x%lx (%s)\n",
   84:                                (unsigned long) destpc, child->name));
   85:                   arc_add (parent, child, (unsigned long) 0);
   86:                   instructp += 4;     /* call is a 5 byte instruction */
   87:                   continue;
   88:                 }
   89:             }
   90:           /*
   91:            *  else:
   92:            *    it looked like a callf, but it:
   93:            *      a) wasn't actually a callf, or
   94:            *      b) didn't point to a known function in the symtab, or
   95:            *      c) something funny is going on.
   96:            */
   97:           DBG (CALLDEBUG, printf ("\tbut it's a botch\n"));
   98:         }
   99:     }
  100: }
Syntax (Markdown)