* alpha.c (alpha_Instruction): Don't use.
(alpha_find_call): Avoid use of bitfields and casts between pointers and integers of different sizes. Avoid endian problems when cross-compiling. * vax.c (vax_find_call): Likewise. (struct modebyte): Don't use. (vax_operandmode): Pass in an unsigned char *. (vax_operandlength): Likewise. (vax_reladdr): Rename to vax_offset and return relative offset rather than address. * i386.c (i386_find_call): Avoid casts between pointers and integers of different sizes. * sparc.c (sparc_find_call): Likewise. Avoid endian problems. * tahoe.c (tahoe_find_call): Likewise. (tahoe_reladdr): Rename to tahoe_offset and return relative offset rather than address. * basic_blocks.h: Don't include headers here. * call_graph.h: Likewise. * cg_arcs.h: Likewise. * cg_print.h: Likewise. * corefile.h: Likewise. * gmon_io.h: Likewise. * gmon_out.h: Likewise. * hertz.h: Likewise. * hist.h: Likewise. * source.h: Likewise. * sym_ids.h: Likewise. * symtab.h: Likewise. * gprof.h: Don't include ansidecl.h, do include bfd.h. (bool): Don't typedef. * alpha.c: Adjust #include's for above header changes. * basic_blocks.c: Likewise. * call_graph.c: Likewise. * cg_arcs.c: Likewise. * cg_dfn.c: Likewise. * cg_print.c: Likewise. * corefile.c: Likewise. * gmon_io.c: Likewise. * gprof.c: Likewise. * hertz.c: Likewise. * hist.c: Likewise. * i386.c: Likewise. * mips.c: Likewise. * sparc.c: Likewise. * sym_ids.c: Likewise. * symtab.c: Likewise. * tahoe.c: Likewise. * utils.c: Likewise. * vax.c: Likewise. * po/POTFILES.in: Regenerate.
This commit is contained in:
parent
caf8ca8e1c
commit
6d9c411afd
34 changed files with 204 additions and 175 deletions
|
@ -1,3 +1,58 @@
|
||||||
|
2002-01-31 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* alpha.c (alpha_Instruction): Don't use.
|
||||||
|
(alpha_find_call): Avoid use of bitfields and casts between
|
||||||
|
pointers and integers of different sizes. Avoid endian problems
|
||||||
|
when cross-compiling.
|
||||||
|
* vax.c (vax_find_call): Likewise.
|
||||||
|
(struct modebyte): Don't use.
|
||||||
|
(vax_operandmode): Pass in an unsigned char *.
|
||||||
|
(vax_operandlength): Likewise.
|
||||||
|
(vax_reladdr): Rename to vax_offset and return relative offset
|
||||||
|
rather than address.
|
||||||
|
* i386.c (i386_find_call): Avoid casts between pointers and
|
||||||
|
integers of different sizes.
|
||||||
|
* sparc.c (sparc_find_call): Likewise. Avoid endian problems.
|
||||||
|
* tahoe.c (tahoe_find_call): Likewise.
|
||||||
|
(tahoe_reladdr): Rename to tahoe_offset and return relative offset
|
||||||
|
rather than address.
|
||||||
|
|
||||||
|
* basic_blocks.h: Don't include headers here.
|
||||||
|
* call_graph.h: Likewise.
|
||||||
|
* cg_arcs.h: Likewise.
|
||||||
|
* cg_print.h: Likewise.
|
||||||
|
* corefile.h: Likewise.
|
||||||
|
* gmon_io.h: Likewise.
|
||||||
|
* gmon_out.h: Likewise.
|
||||||
|
* hertz.h: Likewise.
|
||||||
|
* hist.h: Likewise.
|
||||||
|
* source.h: Likewise.
|
||||||
|
* sym_ids.h: Likewise.
|
||||||
|
* symtab.h: Likewise.
|
||||||
|
* gprof.h: Don't include ansidecl.h, do include bfd.h.
|
||||||
|
(bool): Don't typedef.
|
||||||
|
* alpha.c: Adjust #include's for above header changes.
|
||||||
|
* basic_blocks.c: Likewise.
|
||||||
|
* call_graph.c: Likewise.
|
||||||
|
* cg_arcs.c: Likewise.
|
||||||
|
* cg_dfn.c: Likewise.
|
||||||
|
* cg_print.c: Likewise.
|
||||||
|
* corefile.c: Likewise.
|
||||||
|
* gmon_io.c: Likewise.
|
||||||
|
* gprof.c: Likewise.
|
||||||
|
* hertz.c: Likewise.
|
||||||
|
* hist.c: Likewise.
|
||||||
|
* i386.c: Likewise.
|
||||||
|
* mips.c: Likewise.
|
||||||
|
* sparc.c: Likewise.
|
||||||
|
* sym_ids.c: Likewise.
|
||||||
|
* symtab.c: Likewise.
|
||||||
|
* tahoe.c: Likewise.
|
||||||
|
* utils.c: Likewise.
|
||||||
|
* vax.c: Likewise.
|
||||||
|
|
||||||
|
* po/POTFILES.in: Regenerate.
|
||||||
|
|
||||||
2002-01-27 Daniel Jacobowitz <drow@mvista.com>
|
2002-01-27 Daniel Jacobowitz <drow@mvista.com>
|
||||||
|
|
||||||
* configure: Regenerated.
|
* configure: Regenerated.
|
||||||
|
|
|
@ -17,10 +17,12 @@
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*/
|
*/
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Opcodes of the call instructions:
|
* Opcodes of the call instructions:
|
||||||
|
@ -33,6 +35,9 @@
|
||||||
#define Jxx_FUNC_RET 2
|
#define Jxx_FUNC_RET 2
|
||||||
#define Jxx_FUNC_JSR_COROUTINE 3
|
#define Jxx_FUNC_JSR_COROUTINE 3
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Here to document only. We can't use this when cross compiling as
|
||||||
|
the bitfield layout might not be the same as native. */
|
||||||
typedef union
|
typedef union
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
|
@ -59,6 +64,7 @@ typedef union
|
||||||
j; /* jump format */
|
j; /* jump format */
|
||||||
}
|
}
|
||||||
alpha_Instruction;
|
alpha_Instruction;
|
||||||
|
#endif
|
||||||
|
|
||||||
static Sym indirect_child;
|
static Sym indirect_child;
|
||||||
|
|
||||||
|
@ -77,15 +83,12 @@ alpha_find_call (parent, p_lowpc, p_highpc)
|
||||||
bfd_vma p_lowpc;
|
bfd_vma p_lowpc;
|
||||||
bfd_vma p_highpc;
|
bfd_vma p_highpc;
|
||||||
{
|
{
|
||||||
static bfd_vma delta = 0;
|
bfd_vma pc, dest_pc;
|
||||||
bfd_vma dest_pc;
|
unsigned long insn;
|
||||||
alpha_Instruction *pc;
|
|
||||||
Sym *child;
|
Sym *child;
|
||||||
|
|
||||||
if (!delta)
|
if (indirect_child.name == NULL)
|
||||||
{
|
{
|
||||||
delta = (bfd_vma) core_text_space - core_text_sect->vma;
|
|
||||||
|
|
||||||
sym_init (&indirect_child);
|
sym_init (&indirect_child);
|
||||||
indirect_child.name = _("<indirect child>");
|
indirect_child.name = _("<indirect child>");
|
||||||
indirect_child.cg.prop.fract = 1.0;
|
indirect_child.cg.prop.fract = 1.0;
|
||||||
|
@ -107,13 +110,13 @@ alpha_find_call (parent, p_lowpc, p_highpc)
|
||||||
DBG (CALLDEBUG, printf (_("[find_call] %s: 0x%lx to 0x%lx\n"),
|
DBG (CALLDEBUG, printf (_("[find_call] %s: 0x%lx to 0x%lx\n"),
|
||||||
parent->name, (unsigned long) p_lowpc,
|
parent->name, (unsigned long) p_lowpc,
|
||||||
(unsigned long) p_highpc));
|
(unsigned long) p_highpc));
|
||||||
for (pc = (alpha_Instruction *) (p_lowpc + delta);
|
for (pc = (p_lowpc + 3) & ~3; pc < p_highpc; pc += 4)
|
||||||
pc < (alpha_Instruction *) (p_highpc + delta);
|
|
||||||
++pc)
|
|
||||||
{
|
{
|
||||||
switch (pc->a.op_code)
|
insn = bfd_get_32 (core_bfd, ((unsigned char *) core_text_space
|
||||||
|
+ pc - core_text_sect->vma));
|
||||||
|
switch (insn & (0x3f << 26))
|
||||||
{
|
{
|
||||||
case OP_Jxx:
|
case OP_Jxx << 26:
|
||||||
/*
|
/*
|
||||||
* There is no simple and reliable way to determine the
|
* There is no simple and reliable way to determine the
|
||||||
* target of a jsr (the hint bits help, but there aren't
|
* target of a jsr (the hint bits help, but there aren't
|
||||||
|
@ -122,28 +125,29 @@ alpha_find_call (parent, p_lowpc, p_highpc)
|
||||||
* to INDIRECT_CHILD---that way the user it at least able
|
* to INDIRECT_CHILD---that way the user it at least able
|
||||||
* to see that there are other calls as well.
|
* to see that there are other calls as well.
|
||||||
*/
|
*/
|
||||||
if (pc->j.func == Jxx_FUNC_JSR
|
if ((insn & (3 << 14)) == Jxx_FUNC_JSR << 14
|
||||||
|| pc->j.func == Jxx_FUNC_JSR_COROUTINE)
|
|| (insn & (3 << 14)) == Jxx_FUNC_JSR_COROUTINE << 14)
|
||||||
{
|
{
|
||||||
DBG (CALLDEBUG,
|
DBG (CALLDEBUG,
|
||||||
printf (_("[find_call] 0x%lx: jsr%s <indirect_child>\n"),
|
printf (_("[find_call] 0x%lx: jsr%s <indirect_child>\n"),
|
||||||
(unsigned long) pc - (unsigned long) delta,
|
(unsigned long) pc,
|
||||||
pc->j.func == Jxx_FUNC_JSR ? "" : "_coroutine"));
|
((insn & (3 << 14)) == Jxx_FUNC_JSR << 14
|
||||||
|
? "" : "_coroutine")));
|
||||||
arc_add (parent, &indirect_child, (unsigned long) 0);
|
arc_add (parent, &indirect_child, (unsigned long) 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_BSR:
|
case OP_BSR << 26:
|
||||||
DBG (CALLDEBUG,
|
DBG (CALLDEBUG,
|
||||||
printf (_("[find_call] 0x%lx: bsr"),
|
printf (_("[find_call] 0x%lx: bsr"), (unsigned long) pc));
|
||||||
(unsigned long) pc - (unsigned long) delta));
|
|
||||||
/*
|
/*
|
||||||
* Regular PC relative addressing. Check that this is the
|
* Regular PC relative addressing. Check that this is the
|
||||||
* address of a function. The linker sometimes redirects
|
* address of a function. The linker sometimes redirects
|
||||||
* the entry point by 8 bytes to skip loading the global
|
* the entry point by 8 bytes to skip loading the global
|
||||||
* pointer, so we all for either address:
|
* pointer, so we allow for either address:
|
||||||
*/
|
*/
|
||||||
dest_pc = ((bfd_vma) (pc + 1 + pc->b.disp)) - delta;
|
dest_pc = pc + 4 + (((bfd_signed_vma) (insn & 0x1fffff)
|
||||||
|
^ 0x100000) - 0x100000);
|
||||||
if (dest_pc >= s_lowpc && dest_pc <= s_highpc)
|
if (dest_pc >= s_lowpc && dest_pc <= s_highpc)
|
||||||
{
|
{
|
||||||
child = sym_lookup (&symtab, dest_pc);
|
child = sym_lookup (&symtab, dest_pc);
|
||||||
|
|
|
@ -21,18 +21,16 @@
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include "libiberty.h"
|
||||||
|
#include "gprof.h"
|
||||||
#include "basic_blocks.h"
|
#include "basic_blocks.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "gmon_io.h"
|
#include "gmon_io.h"
|
||||||
#include "gmon_out.h"
|
#include "gmon_out.h"
|
||||||
#include "gprof.h"
|
#include "search_list.h"
|
||||||
#include "libiberty.h"
|
|
||||||
#include "source.h"
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "sym_ids.h"
|
#include "sym_ids.h"
|
||||||
#ifdef HAVE_UNISTD_H
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Default option values: */
|
/* Default option values: */
|
||||||
bool bb_annotate_all_lines = FALSE;
|
bool bb_annotate_all_lines = FALSE;
|
||||||
|
|
|
@ -20,11 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef basic_blocks_h
|
#ifndef basic_blocks_h
|
||||||
#define basic_blocks_h
|
#define basic_blocks_h
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "gprof.h"
|
|
||||||
#include "source.h"
|
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
/* Options: */
|
/* Options: */
|
||||||
extern bool bb_annotate_all_lines; /* Force annotation of all lines? */
|
extern bool bb_annotate_all_lines; /* Force annotation of all lines? */
|
||||||
extern int bb_table_length; /* Length of most-used bb table. */
|
extern int bb_table_length; /* Length of most-used bb table. */
|
||||||
|
|
|
@ -19,12 +19,15 @@
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "call_graph.h"
|
#include "call_graph.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "gmon_io.h"
|
#include "gmon_io.h"
|
||||||
#include "gmon_out.h"
|
#include "gmon_out.h"
|
||||||
#include "symtab.h"
|
|
||||||
#include "sym_ids.h"
|
#include "sym_ids.h"
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
|
|
|
@ -21,10 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef call_graph_h
|
#ifndef call_graph_h
|
||||||
#define call_graph_h
|
#define call_graph_h
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "gprof.h"
|
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
extern void cg_tally PARAMS ((bfd_vma, bfd_vma, unsigned long));
|
extern void cg_tally PARAMS ((bfd_vma, bfd_vma, unsigned long));
|
||||||
extern void cg_read_rec PARAMS ((FILE *, const char *));
|
extern void cg_read_rec PARAMS ((FILE *, const char *));
|
||||||
extern void cg_write_arcs PARAMS ((FILE *, const char *));
|
extern void cg_write_arcs PARAMS ((FILE *, const char *));
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
*/
|
*/
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "call_graph.h"
|
#include "call_graph.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "cg_dfn.h"
|
#include "cg_dfn.h"
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
#ifndef cg_arcs_h
|
#ifndef cg_arcs_h
|
||||||
#define cg_arcs_h
|
#define cg_arcs_h
|
||||||
|
|
||||||
#include "gprof.h"
|
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Arc structure for call-graph.
|
* Arc structure for call-graph.
|
||||||
*
|
*
|
||||||
|
|
|
@ -16,12 +16,13 @@
|
||||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "cg_dfn.h"
|
#include "cg_dfn.h"
|
||||||
#include "symtab.h"
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#define DFN_INCR_DEPTH (128)
|
#define DFN_INCR_DEPTH (128)
|
||||||
|
|
|
@ -20,6 +20,10 @@
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "cg_print.h"
|
#include "cg_print.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
|
|
|
@ -21,9 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef cg_print_h
|
#ifndef cg_print_h
|
||||||
#define cg_print_h
|
#define cg_print_h
|
||||||
|
|
||||||
#include "gprof.h"
|
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
extern double print_time; /* Total of time being printed. */
|
extern double print_time; /* Total of time being printed. */
|
||||||
|
|
||||||
extern void cg_print PARAMS ((Sym **));
|
extern void cg_print PARAMS ((Sym **));
|
||||||
|
|
|
@ -21,8 +21,10 @@
|
||||||
|
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
#include "corefile.h"
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
|
#include "corefile.h"
|
||||||
|
|
||||||
bfd *core_bfd;
|
bfd *core_bfd;
|
||||||
int core_num_syms;
|
int core_num_syms;
|
||||||
|
|
|
@ -21,8 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef corefile_h
|
#ifndef corefile_h
|
||||||
#define corefile_h
|
#define corefile_h
|
||||||
|
|
||||||
#include "bfd.h"
|
|
||||||
|
|
||||||
extern bfd *core_bfd; /* BFD for core-file. */
|
extern bfd *core_bfd; /* BFD for core-file. */
|
||||||
extern int core_num_syms; /* # of entries in symbol-table. */
|
extern int core_num_syms; /* # of entries in symbol-table. */
|
||||||
extern asymbol **core_syms; /* Symbol table in a.out. */
|
extern asymbol **core_syms; /* Symbol table in a.out. */
|
||||||
|
|
|
@ -19,15 +19,17 @@
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "basic_blocks.h"
|
#include "basic_blocks.h"
|
||||||
#include "bfd.h"
|
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "call_graph.h"
|
#include "call_graph.h"
|
||||||
#include "gmon_io.h"
|
#include "gmon_io.h"
|
||||||
#include "gmon_out.h"
|
#include "gmon_out.h"
|
||||||
#include "gmon.h" /* Fetch header for old format. */
|
#include "gmon.h" /* Fetch header for old format. */
|
||||||
#include "gprof.h"
|
|
||||||
#include "hertz.h"
|
#include "hertz.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
|
|
|
@ -21,9 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef gmon_io_h
|
#ifndef gmon_io_h
|
||||||
#define gmon_io_h
|
#define gmon_io_h
|
||||||
|
|
||||||
#include "bfd.h"
|
|
||||||
#include "gmon.h"
|
|
||||||
|
|
||||||
/* Some platforms need to put stdin into binary mode, to read
|
/* Some platforms need to put stdin into binary mode, to read
|
||||||
binary files. */
|
binary files. */
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
|
|
|
@ -24,8 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef gmon_out_h
|
#ifndef gmon_out_h
|
||||||
#define gmon_out_h
|
#define gmon_out_h
|
||||||
|
|
||||||
#include <gconfig.h>
|
|
||||||
|
|
||||||
#define GMON_MAGIC "gmon" /* magic cookie */
|
#define GMON_MAGIC "gmon" /* magic cookie */
|
||||||
#define GMON_VERSION 1 /* version number */
|
#define GMON_VERSION 1 /* version number */
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
#include "getopt.h"
|
#include "getopt.h"
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "basic_blocks.h"
|
#include "basic_blocks.h"
|
||||||
#include "call_graph.h"
|
#include "call_graph.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
|
@ -27,7 +30,6 @@
|
||||||
#include "gmon_io.h"
|
#include "gmon_io.h"
|
||||||
#include "hertz.h"
|
#include "hertz.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
#include "source.h"
|
|
||||||
#include "sym_ids.h"
|
#include "sym_ids.h"
|
||||||
#include "demangle.h"
|
#include "demangle.h"
|
||||||
|
|
||||||
|
|
|
@ -21,10 +21,9 @@
|
||||||
#ifndef gprof_h
|
#ifndef gprof_h
|
||||||
#define gprof_h
|
#define gprof_h
|
||||||
|
|
||||||
#include "ansidecl.h"
|
|
||||||
|
|
||||||
/* Include the BFD sysdep.h file. */
|
/* Include the BFD sysdep.h file. */
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
|
#include "bfd.h"
|
||||||
|
|
||||||
/* Undefine the BFD PACKAGE and VERSION macros before including the
|
/* Undefine the BFD PACKAGE and VERSION macros before including the
|
||||||
gprof config.h file. */
|
gprof config.h file. */
|
||||||
|
@ -109,7 +108,6 @@ typedef enum
|
||||||
}
|
}
|
||||||
File_Format;
|
File_Format;
|
||||||
|
|
||||||
typedef int bool;
|
|
||||||
typedef unsigned char UNIT[2]; /* unit of profiling */
|
typedef unsigned char UNIT[2]; /* unit of profiling */
|
||||||
|
|
||||||
extern const char *whoami; /* command-name, for error messages */
|
extern const char *whoami; /* command-name, for error messages */
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*/
|
*/
|
||||||
|
#include "gprof.h"
|
||||||
#include "hertz.h"
|
#include "hertz.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
#ifndef hertz_h
|
#ifndef hertz_h
|
||||||
#define hertz_h
|
#define hertz_h
|
||||||
|
|
||||||
#include "gprof.h"
|
|
||||||
|
|
||||||
#define HZ_WRONG 0 /* impossible clock frequency */
|
#define HZ_WRONG 0 /* impossible clock frequency */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -19,14 +19,15 @@
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "gmon_io.h"
|
#include "gmon_io.h"
|
||||||
#include "gmon_out.h"
|
#include "gmon_out.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
#include "symtab.h"
|
|
||||||
#include "sym_ids.h"
|
#include "sym_ids.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef hist_h
|
#ifndef hist_h
|
||||||
#define hist_h
|
#define hist_h
|
||||||
|
|
||||||
#include "bfd.h"
|
|
||||||
|
|
||||||
extern bfd_vma s_lowpc; /* Lowpc from the profile file. */
|
extern bfd_vma s_lowpc; /* Lowpc from the profile file. */
|
||||||
extern bfd_vma s_highpc; /* Highpc from the profile file. */
|
extern bfd_vma s_highpc; /* Highpc from the profile file. */
|
||||||
extern bfd_vma lowpc, highpc; /* Range profiled, in UNIT's. */
|
extern bfd_vma lowpc, highpc; /* Range profiled, in UNIT's. */
|
||||||
|
|
19
gprof/i386.c
19
gprof/i386.c
|
@ -17,10 +17,12 @@
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*/
|
*/
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
static int i386_iscall PARAMS ((unsigned char *));
|
static int i386_iscall PARAMS ((unsigned char *));
|
||||||
void i386_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
|
void i386_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
|
||||||
|
@ -43,7 +45,7 @@ i386_find_call (parent, p_lowpc, p_highpc)
|
||||||
{
|
{
|
||||||
unsigned char *instructp;
|
unsigned char *instructp;
|
||||||
Sym *child;
|
Sym *child;
|
||||||
bfd_vma destpc, delta;
|
bfd_vma pc, destpc;
|
||||||
|
|
||||||
if (core_text_space == 0)
|
if (core_text_space == 0)
|
||||||
{
|
{
|
||||||
|
@ -61,25 +63,20 @@ i386_find_call (parent, p_lowpc, p_highpc)
|
||||||
parent->name, (unsigned long) p_lowpc,
|
parent->name, (unsigned long) p_lowpc,
|
||||||
(unsigned long) p_highpc));
|
(unsigned long) p_highpc));
|
||||||
|
|
||||||
delta = (bfd_vma) core_text_space - core_text_sect->vma;
|
for (pc = p_lowpc; pc < p_highpc; ++pc)
|
||||||
|
|
||||||
for (instructp = (unsigned char *) (p_lowpc + delta);
|
|
||||||
instructp < (unsigned char *) (p_highpc + delta);
|
|
||||||
instructp ++)
|
|
||||||
{
|
{
|
||||||
|
instructp = (unsigned char *) core_text_space + pc - core_text_sect->vma;
|
||||||
if (i386_iscall (instructp))
|
if (i386_iscall (instructp))
|
||||||
{
|
{
|
||||||
DBG (CALLDEBUG,
|
DBG (CALLDEBUG,
|
||||||
printf ("[findcall]\t0x%lx:call",
|
printf ("[findcall]\t0x%lx:call", (unsigned long) pc));
|
||||||
(unsigned long) (instructp - (unsigned char *) delta)));
|
|
||||||
/*
|
/*
|
||||||
* regular pc relative addressing
|
* regular pc relative addressing
|
||||||
* check that this is the address of
|
* check that this is the address of
|
||||||
* a function.
|
* a function.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
destpc = ((bfd_vma) bfd_get_32 (core_bfd, instructp + 1)
|
destpc = bfd_get_32 (core_bfd, instructp + 1) + pc + 5;
|
||||||
+ (bfd_vma) instructp - (bfd_vma) delta + 5);
|
|
||||||
if (destpc >= s_lowpc && destpc <= s_highpc)
|
if (destpc >= s_lowpc && destpc <= s_highpc)
|
||||||
{
|
{
|
||||||
child = sym_lookup (&symtab, destpc);
|
child = sym_lookup (&symtab, destpc);
|
||||||
|
|
|
@ -17,10 +17,12 @@
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*/
|
*/
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
static Sym indirect_child;
|
static Sym indirect_child;
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ hertz.h
|
||||||
hist.c
|
hist.c
|
||||||
hist.h
|
hist.h
|
||||||
i386.c
|
i386.c
|
||||||
|
mips.c
|
||||||
search_list.c
|
search_list.c
|
||||||
search_list.h
|
search_list.h
|
||||||
source.c
|
source.c
|
||||||
|
|
|
@ -21,10 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef source_h
|
#ifndef source_h
|
||||||
#define source_h
|
#define source_h
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "gprof.h"
|
|
||||||
#include "search_list.h"
|
|
||||||
|
|
||||||
typedef struct source_file
|
typedef struct source_file
|
||||||
{
|
{
|
||||||
struct source_file *next;
|
struct source_file *next;
|
||||||
|
|
|
@ -17,10 +17,12 @@
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*/
|
*/
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* opcode of the `callf' instruction
|
* opcode of the `callf' instruction
|
||||||
|
@ -35,12 +37,10 @@ sparc_find_call (parent, p_lowpc, p_highpc)
|
||||||
bfd_vma p_lowpc;
|
bfd_vma p_lowpc;
|
||||||
bfd_vma p_highpc;
|
bfd_vma p_highpc;
|
||||||
{
|
{
|
||||||
bfd_vma dest_pc, delta;
|
bfd_vma pc, dest_pc;
|
||||||
unsigned int *instr;
|
unsigned long insn;
|
||||||
Sym *child;
|
Sym *child;
|
||||||
|
|
||||||
delta = (bfd_vma) core_text_space - core_text_sect->vma;
|
|
||||||
|
|
||||||
if (core_text_space == 0)
|
if (core_text_space == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -56,20 +56,20 @@ sparc_find_call (parent, p_lowpc, p_highpc)
|
||||||
DBG (CALLDEBUG, printf ("[find_call] %s: 0x%lx to 0x%lx\n",
|
DBG (CALLDEBUG, printf ("[find_call] %s: 0x%lx to 0x%lx\n",
|
||||||
parent->name, (unsigned long) p_lowpc,
|
parent->name, (unsigned long) p_lowpc,
|
||||||
(unsigned long) p_highpc));
|
(unsigned long) p_highpc));
|
||||||
for (instr = (unsigned int *) (((p_lowpc + delta) + 3) &~ 3);
|
for (pc = (p_lowpc + 3) & ~3; pc < p_highpc; pc += 4)
|
||||||
instr < (unsigned int *) (p_highpc + delta);
|
|
||||||
++instr)
|
|
||||||
{
|
{
|
||||||
if ((*instr & CALL))
|
insn = bfd_get_32 (core_bfd, ((unsigned char *) core_text_space
|
||||||
|
+ pc - core_text_sect->vma));
|
||||||
|
if (insn & CALL)
|
||||||
{
|
{
|
||||||
DBG (CALLDEBUG,
|
DBG (CALLDEBUG,
|
||||||
printf ("[find_call] 0x%lx: callf",
|
printf ("[find_call] 0x%lx: callf", (unsigned long) pc));
|
||||||
(unsigned long) instr - (unsigned long) delta));
|
|
||||||
/*
|
/*
|
||||||
* Regular pc relative addressing check that this is the
|
* Regular pc relative addressing check that this is the
|
||||||
* address of a function.
|
* address of a function.
|
||||||
*/
|
*/
|
||||||
dest_pc = ((bfd_vma) (instr + (*instr & ~CALL))) - delta;
|
dest_pc = pc + (((bfd_signed_vma) (insn & 0x3fffffff)
|
||||||
|
^ 0x20000000) - 0x20000000);
|
||||||
if (dest_pc >= s_lowpc && dest_pc <= s_highpc)
|
if (dest_pc >= s_lowpc && dest_pc <= s_highpc)
|
||||||
{
|
{
|
||||||
child = sym_lookup (&symtab, dest_pc);
|
child = sym_lookup (&symtab, dest_pc);
|
||||||
|
|
|
@ -21,6 +21,10 @@
|
||||||
|
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "safe-ctype.h"
|
#include "safe-ctype.h"
|
||||||
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "sym_ids.h"
|
#include "sym_ids.h"
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef sym_ids_h
|
#ifndef sym_ids_h
|
||||||
#define sym_ids_h
|
#define sym_ids_h
|
||||||
|
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
INCL_GRAPH = 0, EXCL_GRAPH,
|
INCL_GRAPH = 0, EXCL_GRAPH,
|
||||||
|
|
|
@ -20,9 +20,11 @@
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
Sym_Table symtab;
|
Sym_Table symtab;
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#ifndef symtab_h
|
#ifndef symtab_h
|
||||||
#define symtab_h
|
#define symtab_h
|
||||||
|
|
||||||
#include "bfd.h"
|
|
||||||
#include "gprof.h"
|
|
||||||
|
|
||||||
/* For a profile to be intelligible to a human user, it is necessary
|
/* For a profile to be intelligible to a human user, it is necessary
|
||||||
to map code-addresses into source-code information. Source-code
|
to map code-addresses into source-code information. Source-code
|
||||||
information can be any combination of: (i) function-name, (ii)
|
information can be any combination of: (i) function-name, (ii)
|
||||||
|
@ -32,8 +29,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
The symbol table is used to map addresses into source-code
|
The symbol table is used to map addresses into source-code
|
||||||
information. */
|
information. */
|
||||||
|
|
||||||
#include "source.h"
|
|
||||||
|
|
||||||
#define NBBS 10
|
#define NBBS 10
|
||||||
|
|
||||||
/* Symbol-entry. For each external in the specified file we gather
|
/* Symbol-entry. For each external in the specified file we gather
|
||||||
|
|
|
@ -17,10 +17,12 @@
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*/
|
*/
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* opcode of the `callf' instruction
|
* opcode of the `callf' instruction
|
||||||
|
@ -49,16 +51,16 @@ static Sym indirectchild;
|
||||||
static tahoe_operandenum tahoe_operandmode PARAMS ((unsigned char *));
|
static tahoe_operandenum tahoe_operandmode PARAMS ((unsigned char *));
|
||||||
static char *tahoe_operandname PARAMS ((tahoe_operandenum));
|
static char *tahoe_operandname PARAMS ((tahoe_operandenum));
|
||||||
static long tahoe_operandlength PARAMS ((unsigned char *));
|
static long tahoe_operandlength PARAMS ((unsigned char *));
|
||||||
static bfd_vma tahoe_reladdr PARAMS ((char *));
|
static bfd_signed_vma tahoe_offset PARAMS ((unsigned char *));
|
||||||
void tahoe_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
|
void tahoe_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
|
||||||
|
|
||||||
static tahoe_operandenum
|
static tahoe_operandenum
|
||||||
tahoe_operandmode (modep)
|
tahoe_operandmode (modep)
|
||||||
unsigned char *modep;
|
unsigned char *modep;
|
||||||
{
|
{
|
||||||
long usesreg = ((long) *modep) & 0xf;
|
long usesreg = *modep & 0xf;
|
||||||
|
|
||||||
switch (((long) *modep) >> 4)
|
switch ((*modep >> 4) & 0xf)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -186,34 +188,24 @@ tahoe_operandlength (modep)
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bfd_vma
|
static bfd_signed_vma
|
||||||
tahoe_reladdr (modep)
|
tahoe_offset (modep)
|
||||||
char *modep;
|
unsigned char *modep;
|
||||||
{
|
{
|
||||||
tahoe_operandenum mode = tahoe_operandmode (modep);
|
tahoe_operandenum mode = tahoe_operandmode (modep);
|
||||||
char *cp;
|
|
||||||
short *sp;
|
|
||||||
long *lp;
|
|
||||||
int i;
|
|
||||||
long value = 0;
|
|
||||||
|
|
||||||
cp = modep;
|
++modep; /* skip over the mode */
|
||||||
++cp; /* skip over the mode */
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
fprintf (stderr, "[reladdr] not relative address\n");
|
fprintf (stderr, "[reladdr] not relative address\n");
|
||||||
return (bfd_vma) modep;
|
return 0;
|
||||||
case byterel:
|
case byterel:
|
||||||
return (bfd_vma) (cp + sizeof *cp + *cp);
|
return 1 + bfd_get_signed_8 (core_bfd, modep);
|
||||||
case wordrel:
|
case wordrel:
|
||||||
for (i = 0; (size_t) i < sizeof *sp; i++)
|
return 2 + bfd_get_signed_16 (core_bfd, modep);
|
||||||
value = (value << 8) + (cp[i] & 0xff);
|
|
||||||
return (bfd_vma) (cp + sizeof *sp + value);
|
|
||||||
case longrel:
|
case longrel:
|
||||||
for (i = 0; (size_t) i < sizeof *lp; i++)
|
return 4 + bfd_get_signed_32 (core_bfd, modep);
|
||||||
value = (value << 8) + (cp[i] & 0xff);
|
|
||||||
return (bfd_vma) (cp + sizeof *lp + value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,7 +220,7 @@ tahoe_find_call (parent, p_lowpc, p_highpc)
|
||||||
Sym *child;
|
Sym *child;
|
||||||
tahoe_operandenum mode;
|
tahoe_operandenum mode;
|
||||||
tahoe_operandenum firstmode;
|
tahoe_operandenum firstmode;
|
||||||
bfd_vma destpc;
|
bfd_vma pc, destpc;
|
||||||
static bool inited = FALSE;
|
static bool inited = FALSE;
|
||||||
|
|
||||||
if (!inited)
|
if (!inited)
|
||||||
|
@ -254,21 +246,19 @@ tahoe_find_call (parent, p_lowpc, p_highpc)
|
||||||
DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n",
|
DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n",
|
||||||
parent->name, (unsigned long) p_lowpc,
|
parent->name, (unsigned long) p_lowpc,
|
||||||
(unsigned long) p_highpc));
|
(unsigned long) p_highpc));
|
||||||
for (instructp = (unsigned char *) core_text_space + p_lowpc;
|
for (pc = p_lowpc; pc < p_highpc; pc += length)
|
||||||
instructp < (unsigned char *) core_text_space + p_highpc;
|
|
||||||
instructp += length)
|
|
||||||
{
|
{
|
||||||
length = 1;
|
length = 1;
|
||||||
if (*instructp == CALLF)
|
instructp = ((unsigned char *) core_text_space
|
||||||
|
+ pc - core_text_sect->vma);
|
||||||
|
if ((*instructp & 0xff) == CALLF)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* maybe a callf, better check it out.
|
* maybe a callf, better check it out.
|
||||||
* skip the count of the number of arguments.
|
* skip the count of the number of arguments.
|
||||||
*/
|
*/
|
||||||
DBG (CALLDEBUG, printf ("[findcall]\t0x%lx:callf",
|
DBG (CALLDEBUG, printf ("[findcall]\t0x%lx:callf",
|
||||||
((unsigned long)
|
(unsigned long) pc));
|
||||||
(instructp
|
|
||||||
- (unsigned char *) core_text_space))));
|
|
||||||
firstmode = tahoe_operandmode (instructp + length);
|
firstmode = tahoe_operandmode (instructp + length);
|
||||||
switch (firstmode)
|
switch (firstmode)
|
||||||
{
|
{
|
||||||
|
@ -312,8 +302,7 @@ tahoe_find_call (parent, p_lowpc, p_highpc)
|
||||||
* check that this is the address of
|
* check that this is the address of
|
||||||
* a function.
|
* a function.
|
||||||
*/
|
*/
|
||||||
destpc = tahoe_reladdr (instructp + length)
|
destpc = pc + tahoe_offset (instructp + length);
|
||||||
- (bfd_vma) core_text_space;
|
|
||||||
if (destpc >= s_lowpc && destpc <= s_highpc)
|
if (destpc >= s_lowpc && destpc <= s_highpc)
|
||||||
{
|
{
|
||||||
child = sym_lookup (&symtab, destpc);
|
child = sym_lookup (&symtab, destpc);
|
||||||
|
|
|
@ -16,10 +16,12 @@
|
||||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*/
|
*/
|
||||||
#include <demangle.h>
|
#include "demangle.h"
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
#include "cg_arcs.h"
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
|
#include "cg_arcs.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
75
gprof/vax.c
75
gprof/vax.c
|
@ -17,10 +17,12 @@
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*/
|
*/
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
|
#include "search_list.h"
|
||||||
|
#include "source.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "cg_arcs.h"
|
#include "cg_arcs.h"
|
||||||
#include "corefile.h"
|
#include "corefile.h"
|
||||||
#include "hist.h"
|
#include "hist.h"
|
||||||
#include "symtab.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* opcode of the `calls' instruction
|
* opcode of the `calls' instruction
|
||||||
|
@ -41,30 +43,34 @@ enum opermodes
|
||||||
};
|
};
|
||||||
typedef enum opermodes operandenum;
|
typedef enum opermodes operandenum;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Here to document only. We can't use this when cross compiling as
|
||||||
|
the bitfield layout might not be the same as native. */
|
||||||
struct modebyte
|
struct modebyte
|
||||||
{
|
{
|
||||||
unsigned int regfield:4;
|
unsigned int regfield:4;
|
||||||
unsigned int modefield:4;
|
unsigned int modefield:4;
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A symbol to be the child of indirect calls:
|
* A symbol to be the child of indirect calls:
|
||||||
*/
|
*/
|
||||||
static Sym indirectchild;
|
static Sym indirectchild;
|
||||||
|
|
||||||
static operandenum vax_operandmode PARAMS ((struct modebyte *));
|
static operandenum vax_operandmode PARAMS ((unsigned char *));
|
||||||
static char *vax_operandname PARAMS ((operandenum));
|
static char *vax_operandname PARAMS ((operandenum));
|
||||||
static long vax_operandlength PARAMS ((struct modebyte *));
|
static long vax_operandlength PARAMS ((unsigned char *));
|
||||||
static bfd_vma vax_reladdr PARAMS ((struct modebyte *));
|
static bfd_signed_vma vax_offset PARAMS ((unsigned char *));
|
||||||
void vax_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
|
void vax_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
|
||||||
|
|
||||||
static operandenum
|
static operandenum
|
||||||
vax_operandmode (modep)
|
vax_operandmode (modep)
|
||||||
struct modebyte *modep;
|
unsigned char *modep;
|
||||||
{
|
{
|
||||||
long usesreg = modep->regfield;
|
int usesreg = *modep & 0xf;
|
||||||
|
|
||||||
switch (modep->modefield)
|
switch ((*modep >> 4) & 0xf)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -156,7 +162,7 @@ vax_operandname (mode)
|
||||||
|
|
||||||
static long
|
static long
|
||||||
vax_operandlength (modep)
|
vax_operandlength (modep)
|
||||||
struct modebyte *modep;
|
unsigned char *modep;
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (vax_operandmode (modep))
|
switch (vax_operandmode (modep))
|
||||||
|
@ -186,36 +192,30 @@ vax_operandlength (modep)
|
||||||
case longreldef:
|
case longreldef:
|
||||||
return 5;
|
return 5;
|
||||||
case indexed:
|
case indexed:
|
||||||
return 1 + vax_operandlength ((struct modebyte *) ((char *) modep) + 1);
|
return 1 + vax_operandlength (modep + 1);
|
||||||
}
|
}
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bfd_vma
|
static bfd_signed_vma
|
||||||
vax_reladdr (modep)
|
vax_offset (modep)
|
||||||
struct modebyte *modep;
|
unsigned char *modep;
|
||||||
{
|
{
|
||||||
operandenum mode = vax_operandmode (modep);
|
operandenum mode = vax_operandmode (modep);
|
||||||
char *cp;
|
|
||||||
short *sp;
|
|
||||||
long *lp;
|
|
||||||
|
|
||||||
cp = (char *) modep;
|
++modep; /* skip over the mode */
|
||||||
++cp; /* skip over the mode */
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
fprintf (stderr, "[reladdr] not relative address\n");
|
fprintf (stderr, "[reladdr] not relative address\n");
|
||||||
return (bfd_vma) modep;
|
return 0;
|
||||||
case byterel:
|
case byterel:
|
||||||
return (bfd_vma) (cp + sizeof *cp + *cp);
|
return 1 + bfd_get_signed_8 (core_bfd, modep);
|
||||||
case wordrel:
|
case wordrel:
|
||||||
sp = (short *) cp;
|
return 2 + bfd_get_signed_16 (core_bfd, modep);
|
||||||
return (bfd_vma) (cp + sizeof *sp + *sp);
|
|
||||||
case longrel:
|
case longrel:
|
||||||
lp = (long *) cp;
|
return 4 + bfd_get_signed_32 (core_bfd, modep);
|
||||||
return (bfd_vma) (cp + sizeof *lp + *lp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,7 +231,7 @@ vax_find_call (parent, p_lowpc, p_highpc)
|
||||||
Sym *child;
|
Sym *child;
|
||||||
operandenum mode;
|
operandenum mode;
|
||||||
operandenum firstmode;
|
operandenum firstmode;
|
||||||
bfd_vma destpc;
|
bfd_vma pc, destpc;
|
||||||
static bool inited = FALSE;
|
static bool inited = FALSE;
|
||||||
|
|
||||||
if (!inited)
|
if (!inited)
|
||||||
|
@ -257,22 +257,20 @@ vax_find_call (parent, p_lowpc, p_highpc)
|
||||||
DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n",
|
DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n",
|
||||||
parent->name, (unsigned long) p_lowpc,
|
parent->name, (unsigned long) p_lowpc,
|
||||||
(unsigned long) p_highpc));
|
(unsigned long) p_highpc));
|
||||||
for (instructp = (unsigned char *) core_text_space + p_lowpc;
|
for (pc = p_lowpc; pc < p_highpc; pc += length)
|
||||||
instructp < (unsigned char *) core_text_space + p_highpc;
|
|
||||||
instructp += length)
|
|
||||||
{
|
{
|
||||||
length = 1;
|
length = 1;
|
||||||
if (*instructp == CALLS)
|
instructp = ((unsigned char *) core_text_space
|
||||||
|
+ pc - core_text_sect->vma);
|
||||||
|
if ((*instructp & 0xff) == CALLS)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* maybe a calls, better check it out.
|
* maybe a calls, better check it out.
|
||||||
* skip the count of the number of arguments.
|
* skip the count of the number of arguments.
|
||||||
*/
|
*/
|
||||||
DBG (CALLDEBUG,
|
DBG (CALLDEBUG,
|
||||||
printf ("[findcall]\t0x%lx:calls",
|
printf ("[findcall]\t0x%lx:calls", (unsigned long) pc));
|
||||||
((unsigned long)
|
firstmode = vax_operandmode (instructp + length);
|
||||||
(instructp - (unsigned char *) core_text_space))));
|
|
||||||
firstmode = vax_operandmode ((struct modebyte *) (instructp + length));
|
|
||||||
switch (firstmode)
|
switch (firstmode)
|
||||||
{
|
{
|
||||||
case literal:
|
case literal:
|
||||||
|
@ -281,8 +279,8 @@ vax_find_call (parent, p_lowpc, p_highpc)
|
||||||
default:
|
default:
|
||||||
goto botched;
|
goto botched;
|
||||||
}
|
}
|
||||||
length += vax_operandlength ((struct modebyte *) (instructp + length));
|
length += vax_operandlength (instructp + length);
|
||||||
mode = vax_operandmode ((struct modebyte *) (instructp + length));
|
mode = vax_operandmode (instructp + length);
|
||||||
DBG (CALLDEBUG,
|
DBG (CALLDEBUG,
|
||||||
printf ("\tfirst operand is %s", vax_operandname (firstmode));
|
printf ("\tfirst operand is %s", vax_operandname (firstmode));
|
||||||
printf ("\tsecond operand is %s\n", vax_operandname (mode)));
|
printf ("\tsecond operand is %s\n", vax_operandname (mode)));
|
||||||
|
@ -304,8 +302,7 @@ vax_find_call (parent, p_lowpc, p_highpc)
|
||||||
* e.g. arrays of pointers to functions???]
|
* e.g. arrays of pointers to functions???]
|
||||||
*/
|
*/
|
||||||
arc_add (parent, &indirectchild, (unsigned long) 0);
|
arc_add (parent, &indirectchild, (unsigned long) 0);
|
||||||
length += vax_operandlength (
|
length += vax_operandlength (instructp + length);
|
||||||
(struct modebyte *) (instructp + length));
|
|
||||||
continue;
|
continue;
|
||||||
case byterel:
|
case byterel:
|
||||||
case wordrel:
|
case wordrel:
|
||||||
|
@ -315,8 +312,7 @@ vax_find_call (parent, p_lowpc, p_highpc)
|
||||||
* check that this is the address of
|
* check that this is the address of
|
||||||
* a function.
|
* a function.
|
||||||
*/
|
*/
|
||||||
destpc = vax_reladdr ((struct modebyte *) (instructp + length))
|
destpc = pc + vax_offset (instructp + length);
|
||||||
- (bfd_vma) core_text_space;
|
|
||||||
if (destpc >= s_lowpc && destpc <= s_highpc)
|
if (destpc >= s_lowpc && destpc <= s_highpc)
|
||||||
{
|
{
|
||||||
child = sym_lookup (&symtab, destpc);
|
child = sym_lookup (&symtab, destpc);
|
||||||
|
@ -333,8 +329,7 @@ vax_find_call (parent, p_lowpc, p_highpc)
|
||||||
* a hit
|
* a hit
|
||||||
*/
|
*/
|
||||||
arc_add (parent, child, (unsigned long) 0);
|
arc_add (parent, child, (unsigned long) 0);
|
||||||
length += vax_operandlength ((struct modebyte *)
|
length += vax_operandlength (instructp + length);
|
||||||
(instructp + length));
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
goto botched;
|
goto botched;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue