* 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:
Alan Modra 2002-01-31 12:56:08 +00:00
parent caf8ca8e1c
commit 6d9c411afd
34 changed files with 204 additions and 175 deletions

View file

@ -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.

View file

@ -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);

View file

@ -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;

View file

@ -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. */

View file

@ -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

View file

@ -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 *));

View file

@ -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"

View file

@ -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.
* *

View file

@ -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)

View file

@ -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"

View file

@ -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 **));

View file

@ -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;

View file

@ -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. */

View file

@ -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"

View file

@ -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"

View file

@ -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 */

View file

@ -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"

View file

@ -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 */

View file

@ -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"

View file

@ -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 */
/* /*

View file

@ -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"

View file

@ -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. */

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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"

View file

@ -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,

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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"
/* /*

View file

@ -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;