aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gprof/ChangeLog55
-rw-r--r--gprof/alpha.c46
-rw-r--r--gprof/basic_blocks.c10
-rw-r--r--gprof/basic_blocks.h5
-rw-r--r--gprof/call_graph.c5
-rw-r--r--gprof/call_graph.h4
-rw-r--r--gprof/cg_arcs.c3
-rw-r--r--gprof/cg_arcs.h3
-rw-r--r--gprof/cg_dfn.c5
-rw-r--r--gprof/cg_print.c4
-rw-r--r--gprof/cg_print.h3
-rw-r--r--gprof/corefile.c4
-rw-r--r--gprof/corefile.h2
-rw-r--r--gprof/gmon_io.c6
-rw-r--r--gprof/gmon_io.h3
-rw-r--r--gprof/gmon_out.h2
-rw-r--r--gprof/gprof.c4
-rw-r--r--gprof/gprof.h4
-rw-r--r--gprof/hertz.c1
-rw-r--r--gprof/hertz.h2
-rw-r--r--gprof/hist.c5
-rw-r--r--gprof/hist.h2
-rw-r--r--gprof/i386.c19
-rw-r--r--gprof/mips.c4
-rw-r--r--gprof/po/POTFILES.in1
-rw-r--r--gprof/source.h4
-rw-r--r--gprof/sparc.c24
-rw-r--r--gprof/sym_ids.c4
-rw-r--r--gprof/sym_ids.h2
-rw-r--r--gprof/symtab.c4
-rw-r--r--gprof/symtab.h5
-rw-r--r--gprof/tahoe.c53
-rw-r--r--gprof/utils.c6
-rw-r--r--gprof/vax.c75
34 files changed, 204 insertions, 175 deletions
diff --git a/gprof/ChangeLog b/gprof/ChangeLog
index d903d10..0eb592d 100644
--- a/gprof/ChangeLog
+++ b/gprof/ChangeLog
@@ -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>
* configure: Regenerated.
diff --git a/gprof/alpha.c b/gprof/alpha.c
index 4fa917e..978f2ab 100644
--- a/gprof/alpha.c
+++ b/gprof/alpha.c
@@ -17,10 +17,12 @@
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "corefile.h"
#include "hist.h"
-#include "symtab.h"
/*
* Opcodes of the call instructions:
@@ -33,6 +35,9 @@
#define Jxx_FUNC_RET 2
#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
{
struct
@@ -59,6 +64,7 @@ typedef union
j; /* jump format */
}
alpha_Instruction;
+#endif
static Sym indirect_child;
@@ -77,15 +83,12 @@ alpha_find_call (parent, p_lowpc, p_highpc)
bfd_vma p_lowpc;
bfd_vma p_highpc;
{
- static bfd_vma delta = 0;
- bfd_vma dest_pc;
- alpha_Instruction *pc;
+ bfd_vma pc, dest_pc;
+ unsigned long insn;
Sym *child;
- if (!delta)
+ if (indirect_child.name == NULL)
{
- delta = (bfd_vma) core_text_space - core_text_sect->vma;
-
sym_init (&indirect_child);
indirect_child.name = _("<indirect child>");
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"),
parent->name, (unsigned long) p_lowpc,
(unsigned long) p_highpc));
- for (pc = (alpha_Instruction *) (p_lowpc + delta);
- pc < (alpha_Instruction *) (p_highpc + delta);
- ++pc)
+ for (pc = (p_lowpc + 3) & ~3; pc < p_highpc; pc += 4)
{
- 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
* 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 see that there are other calls as well.
*/
- if (pc->j.func == Jxx_FUNC_JSR
- || pc->j.func == Jxx_FUNC_JSR_COROUTINE)
+ if ((insn & (3 << 14)) == Jxx_FUNC_JSR << 14
+ || (insn & (3 << 14)) == Jxx_FUNC_JSR_COROUTINE << 14)
{
DBG (CALLDEBUG,
printf (_("[find_call] 0x%lx: jsr%s <indirect_child>\n"),
- (unsigned long) pc - (unsigned long) delta,
- pc->j.func == Jxx_FUNC_JSR ? "" : "_coroutine"));
+ (unsigned long) pc,
+ ((insn & (3 << 14)) == Jxx_FUNC_JSR << 14
+ ? "" : "_coroutine")));
arc_add (parent, &indirect_child, (unsigned long) 0);
}
break;
- case OP_BSR:
+ case OP_BSR << 26:
DBG (CALLDEBUG,
- printf (_("[find_call] 0x%lx: bsr"),
- (unsigned long) pc - (unsigned long) delta));
+ printf (_("[find_call] 0x%lx: bsr"), (unsigned long) pc));
/*
* Regular PC relative addressing. Check that this is the
* address of a function. The linker sometimes redirects
* 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)
{
child = sym_lookup (&symtab, dest_pc);
diff --git a/gprof/basic_blocks.c b/gprof/basic_blocks.c
index 8f560b4..65a662c 100644
--- a/gprof/basic_blocks.c
+++ b/gprof/basic_blocks.c
@@ -21,18 +21,16 @@
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
-#include <stdio.h>
+#include "libiberty.h"
+#include "gprof.h"
#include "basic_blocks.h"
#include "corefile.h"
#include "gmon_io.h"
#include "gmon_out.h"
-#include "gprof.h"
-#include "libiberty.h"
+#include "search_list.h"
#include "source.h"
+#include "symtab.h"
#include "sym_ids.h"
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
/* Default option values: */
bool bb_annotate_all_lines = FALSE;
diff --git a/gprof/basic_blocks.h b/gprof/basic_blocks.h
index 3e85bc2..e6fcf1f 100644
--- a/gprof/basic_blocks.h
+++ b/gprof/basic_blocks.h
@@ -20,11 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef basic_blocks_h
#define basic_blocks_h
-#include <stdio.h>
-#include "gprof.h"
-#include "source.h"
-#include "symtab.h"
-
/* Options: */
extern bool bb_annotate_all_lines; /* Force annotation of all lines? */
extern int bb_table_length; /* Length of most-used bb table. */
diff --git a/gprof/call_graph.c b/gprof/call_graph.c
index a09938d..20977f9 100644
--- a/gprof/call_graph.c
+++ b/gprof/call_graph.c
@@ -19,12 +19,15 @@
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
+#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "call_graph.h"
#include "corefile.h"
#include "gmon_io.h"
#include "gmon_out.h"
-#include "symtab.h"
#include "sym_ids.h"
extern void
diff --git a/gprof/call_graph.h b/gprof/call_graph.h
index ffa269d..233dd70 100644
--- a/gprof/call_graph.h
+++ b/gprof/call_graph.h
@@ -21,10 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef 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_read_rec PARAMS ((FILE *, const char *));
extern void cg_write_arcs PARAMS ((FILE *, const char *));
diff --git a/gprof/cg_arcs.c b/gprof/cg_arcs.c
index 7ea048b..8369631 100644
--- a/gprof/cg_arcs.c
+++ b/gprof/cg_arcs.c
@@ -18,6 +18,9 @@
*/
#include "libiberty.h"
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "call_graph.h"
#include "cg_arcs.h"
#include "cg_dfn.h"
diff --git a/gprof/cg_arcs.h b/gprof/cg_arcs.h
index caa0197..0364eef 100644
--- a/gprof/cg_arcs.h
+++ b/gprof/cg_arcs.h
@@ -1,9 +1,6 @@
#ifndef cg_arcs_h
#define cg_arcs_h
-#include "gprof.h"
-#include "symtab.h"
-
/*
* Arc structure for call-graph.
*
diff --git a/gprof/cg_dfn.c b/gprof/cg_dfn.c
index 02d64e7..75b033b 100644
--- a/gprof/cg_dfn.c
+++ b/gprof/cg_dfn.c
@@ -16,12 +16,13 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-#include <stdio.h>
#include "libiberty.h"
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "cg_dfn.h"
-#include "symtab.h"
#include "utils.h"
#define DFN_INCR_DEPTH (128)
diff --git a/gprof/cg_print.c b/gprof/cg_print.c
index 696a073..867a4ec 100644
--- a/gprof/cg_print.c
+++ b/gprof/cg_print.c
@@ -20,6 +20,10 @@
02111-1307, USA. */
#include "libiberty.h"
+#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "cg_print.h"
#include "hist.h"
diff --git a/gprof/cg_print.h b/gprof/cg_print.h
index ad9f424..ce41987 100644
--- a/gprof/cg_print.h
+++ b/gprof/cg_print.h
@@ -21,9 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef cg_print_h
#define cg_print_h
-#include "gprof.h"
-#include "symtab.h"
-
extern double print_time; /* Total of time being printed. */
extern void cg_print PARAMS ((Sym **));
diff --git a/gprof/corefile.c b/gprof/corefile.c
index 55515ec..5616dfa 100644
--- a/gprof/corefile.c
+++ b/gprof/corefile.c
@@ -21,8 +21,10 @@
#include "libiberty.h"
#include "gprof.h"
-#include "corefile.h"
+#include "search_list.h"
+#include "source.h"
#include "symtab.h"
+#include "corefile.h"
bfd *core_bfd;
int core_num_syms;
diff --git a/gprof/corefile.h b/gprof/corefile.h
index a876d62..a1457da 100644
--- a/gprof/corefile.h
+++ b/gprof/corefile.h
@@ -21,8 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef corefile_h
#define corefile_h
-#include "bfd.h"
-
extern bfd *core_bfd; /* BFD for core-file. */
extern int core_num_syms; /* # of entries in symbol-table. */
extern asymbol **core_syms; /* Symbol table in a.out. */
diff --git a/gprof/gmon_io.c b/gprof/gmon_io.c
index b15d642..bf8efef 100644
--- a/gprof/gmon_io.c
+++ b/gprof/gmon_io.c
@@ -19,15 +19,17 @@
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
+#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "basic_blocks.h"
-#include "bfd.h"
#include "corefile.h"
#include "call_graph.h"
#include "gmon_io.h"
#include "gmon_out.h"
#include "gmon.h" /* Fetch header for old format. */
-#include "gprof.h"
#include "hertz.h"
#include "hist.h"
#include "libiberty.h"
diff --git a/gprof/gmon_io.h b/gprof/gmon_io.h
index 7936d83..48a0367 100644
--- a/gprof/gmon_io.h
+++ b/gprof/gmon_io.h
@@ -21,9 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef gmon_io_h
#define gmon_io_h
-#include "bfd.h"
-#include "gmon.h"
-
/* Some platforms need to put stdin into binary mode, to read
binary files. */
#include "sysdep.h"
diff --git a/gprof/gmon_out.h b/gprof/gmon_out.h
index 714f9f2..25dce59 100644
--- a/gprof/gmon_out.h
+++ b/gprof/gmon_out.h
@@ -24,8 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef gmon_out_h
#define gmon_out_h
-#include <gconfig.h>
-
#define GMON_MAGIC "gmon" /* magic cookie */
#define GMON_VERSION 1 /* version number */
diff --git a/gprof/gprof.c b/gprof/gprof.c
index 4a1fd50..3c29e09 100644
--- a/gprof/gprof.c
+++ b/gprof/gprof.c
@@ -19,6 +19,9 @@
#include "getopt.h"
#include "libiberty.h"
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "basic_blocks.h"
#include "call_graph.h"
#include "cg_arcs.h"
@@ -27,7 +30,6 @@
#include "gmon_io.h"
#include "hertz.h"
#include "hist.h"
-#include "source.h"
#include "sym_ids.h"
#include "demangle.h"
diff --git a/gprof/gprof.h b/gprof/gprof.h
index fdf9a28..07ca5f0 100644
--- a/gprof/gprof.h
+++ b/gprof/gprof.h
@@ -21,10 +21,9 @@
#ifndef gprof_h
#define gprof_h
-#include "ansidecl.h"
-
/* Include the BFD sysdep.h file. */
#include "sysdep.h"
+#include "bfd.h"
/* Undefine the BFD PACKAGE and VERSION macros before including the
gprof config.h file. */
@@ -109,7 +108,6 @@ typedef enum
}
File_Format;
-typedef int bool;
typedef unsigned char UNIT[2]; /* unit of profiling */
extern const char *whoami; /* command-name, for error messages */
diff --git a/gprof/hertz.c b/gprof/hertz.c
index a7fc14e..7e16511 100644
--- a/gprof/hertz.c
+++ b/gprof/hertz.c
@@ -16,6 +16,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
+#include "gprof.h"
#include "hertz.h"
diff --git a/gprof/hertz.h b/gprof/hertz.h
index fc30a1f..7f8b3ee 100644
--- a/gprof/hertz.h
+++ b/gprof/hertz.h
@@ -1,8 +1,6 @@
#ifndef hertz_h
#define hertz_h
-#include "gprof.h"
-
#define HZ_WRONG 0 /* impossible clock frequency */
/*
diff --git a/gprof/hist.c b/gprof/hist.c
index ed360cd..403b779 100644
--- a/gprof/hist.c
+++ b/gprof/hist.c
@@ -19,14 +19,15 @@
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
-#include <stdio.h>
#include "libiberty.h"
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "corefile.h"
#include "gmon_io.h"
#include "gmon_out.h"
#include "hist.h"
-#include "symtab.h"
#include "sym_ids.h"
#include "utils.h"
diff --git a/gprof/hist.h b/gprof/hist.h
index ea395cd..fe4362b 100644
--- a/gprof/hist.h
+++ b/gprof/hist.h
@@ -21,8 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef hist_h
#define hist_h
-#include "bfd.h"
-
extern bfd_vma s_lowpc; /* Lowpc from the profile file. */
extern bfd_vma s_highpc; /* Highpc from the profile file. */
extern bfd_vma lowpc, highpc; /* Range profiled, in UNIT's. */
diff --git a/gprof/i386.c b/gprof/i386.c
index e30648f..af2731c 100644
--- a/gprof/i386.c
+++ b/gprof/i386.c
@@ -17,10 +17,12 @@
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "corefile.h"
#include "hist.h"
-#include "symtab.h"
static int i386_iscall PARAMS ((unsigned char *));
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;
Sym *child;
- bfd_vma destpc, delta;
+ bfd_vma pc, destpc;
if (core_text_space == 0)
{
@@ -61,25 +63,20 @@ i386_find_call (parent, p_lowpc, p_highpc)
parent->name, (unsigned long) p_lowpc,
(unsigned long) p_highpc));
- delta = (bfd_vma) core_text_space - core_text_sect->vma;
-
- for (instructp = (unsigned char *) (p_lowpc + delta);
- instructp < (unsigned char *) (p_highpc + delta);
- instructp ++)
+ for (pc = p_lowpc; pc < p_highpc; ++pc)
{
+ instructp = (unsigned char *) core_text_space + pc - core_text_sect->vma;
if (i386_iscall (instructp))
{
DBG (CALLDEBUG,
- printf ("[findcall]\t0x%lx:call",
- (unsigned long) (instructp - (unsigned char *) delta)));
+ printf ("[findcall]\t0x%lx:call", (unsigned long) pc));
/*
* regular pc relative addressing
* check that this is the address of
* a function.
*/
- destpc = ((bfd_vma) bfd_get_32 (core_bfd, instructp + 1)
- + (bfd_vma) instructp - (bfd_vma) delta + 5);
+ destpc = bfd_get_32 (core_bfd, instructp + 1) + pc + 5;
if (destpc >= s_lowpc && destpc <= s_highpc)
{
child = sym_lookup (&symtab, destpc);
diff --git a/gprof/mips.c b/gprof/mips.c
index 1d05052..078474f 100644
--- a/gprof/mips.c
+++ b/gprof/mips.c
@@ -17,10 +17,12 @@
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "corefile.h"
#include "hist.h"
-#include "symtab.h"
static Sym indirect_child;
diff --git a/gprof/po/POTFILES.in b/gprof/po/POTFILES.in
index 5ae8116..6ea40f1 100644
--- a/gprof/po/POTFILES.in
+++ b/gprof/po/POTFILES.in
@@ -22,6 +22,7 @@ hertz.h
hist.c
hist.h
i386.c
+mips.c
search_list.c
search_list.h
source.c
diff --git a/gprof/source.h b/gprof/source.h
index 58a4e97..746848e 100644
--- a/gprof/source.h
+++ b/gprof/source.h
@@ -21,10 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef source_h
#define source_h
-#include <stdio.h>
-#include "gprof.h"
-#include "search_list.h"
-
typedef struct source_file
{
struct source_file *next;
diff --git a/gprof/sparc.c b/gprof/sparc.c
index 1fbeae7..5b1b1e8 100644
--- a/gprof/sparc.c
+++ b/gprof/sparc.c
@@ -17,10 +17,12 @@
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "corefile.h"
#include "hist.h"
-#include "symtab.h"
/*
* opcode of the `callf' instruction
@@ -35,12 +37,10 @@ sparc_find_call (parent, p_lowpc, p_highpc)
bfd_vma p_lowpc;
bfd_vma p_highpc;
{
- bfd_vma dest_pc, delta;
- unsigned int *instr;
+ bfd_vma pc, dest_pc;
+ unsigned long insn;
Sym *child;
- delta = (bfd_vma) core_text_space - core_text_sect->vma;
-
if (core_text_space == 0)
{
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",
parent->name, (unsigned long) p_lowpc,
(unsigned long) p_highpc));
- for (instr = (unsigned int *) (((p_lowpc + delta) + 3) &~ 3);
- instr < (unsigned int *) (p_highpc + delta);
- ++instr)
+ for (pc = (p_lowpc + 3) & ~3; pc < p_highpc; pc += 4)
{
- if ((*instr & CALL))
+ insn = bfd_get_32 (core_bfd, ((unsigned char *) core_text_space
+ + pc - core_text_sect->vma));
+ if (insn & CALL)
{
DBG (CALLDEBUG,
- printf ("[find_call] 0x%lx: callf",
- (unsigned long) instr - (unsigned long) delta));
+ printf ("[find_call] 0x%lx: callf", (unsigned long) pc));
/*
* Regular pc relative addressing check that this is the
* 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)
{
child = sym_lookup (&symtab, dest_pc);
diff --git a/gprof/sym_ids.c b/gprof/sym_ids.c
index bf6ffcd..378d1ae 100644
--- a/gprof/sym_ids.c
+++ b/gprof/sym_ids.c
@@ -21,6 +21,10 @@
#include "libiberty.h"
#include "safe-ctype.h"
+#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "sym_ids.h"
diff --git a/gprof/sym_ids.h b/gprof/sym_ids.h
index 4cef81d..ca0ad06 100644
--- a/gprof/sym_ids.h
+++ b/gprof/sym_ids.h
@@ -21,8 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef sym_ids_h
#define sym_ids_h
-#include "symtab.h"
-
typedef enum
{
INCL_GRAPH = 0, EXCL_GRAPH,
diff --git a/gprof/symtab.c b/gprof/symtab.c
index 6b5a093..9ca2002 100644
--- a/gprof/symtab.c
+++ b/gprof/symtab.c
@@ -20,9 +20,11 @@
02111-1307, USA. */
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "corefile.h"
-#include "symtab.h"
Sym_Table symtab;
diff --git a/gprof/symtab.h b/gprof/symtab.h
index 8aa9ee5..d25323b 100644
--- a/gprof/symtab.h
+++ b/gprof/symtab.h
@@ -21,9 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef symtab_h
#define symtab_h
-#include "bfd.h"
-#include "gprof.h"
-
/* For a profile to be intelligible to a human user, it is necessary
to map code-addresses into source-code information. Source-code
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
information. */
-#include "source.h"
-
#define NBBS 10
/* Symbol-entry. For each external in the specified file we gather
diff --git a/gprof/tahoe.c b/gprof/tahoe.c
index 214309a..1e627c8 100644
--- a/gprof/tahoe.c
+++ b/gprof/tahoe.c
@@ -17,10 +17,12 @@
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "corefile.h"
#include "hist.h"
-#include "symtab.h"
/*
* opcode of the `callf' instruction
@@ -49,16 +51,16 @@ static Sym indirectchild;
static tahoe_operandenum tahoe_operandmode PARAMS ((unsigned char *));
static char *tahoe_operandname PARAMS ((tahoe_operandenum));
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));
static tahoe_operandenum
tahoe_operandmode (modep)
unsigned char *modep;
{
- long usesreg = ((long) *modep) & 0xf;
+ long usesreg = *modep & 0xf;
- switch (((long) *modep) >> 4)
+ switch ((*modep >> 4) & 0xf)
{
case 0:
case 1:
@@ -186,34 +188,24 @@ tahoe_operandlength (modep)
abort ();
}
-static bfd_vma
-tahoe_reladdr (modep)
- char *modep;
+static bfd_signed_vma
+tahoe_offset (modep)
+ unsigned char *modep;
{
tahoe_operandenum mode = tahoe_operandmode (modep);
- char *cp;
- short *sp;
- long *lp;
- int i;
- long value = 0;
- cp = modep;
- ++cp; /* skip over the mode */
+ ++modep; /* skip over the mode */
switch (mode)
{
default:
fprintf (stderr, "[reladdr] not relative address\n");
- return (bfd_vma) modep;
+ return 0;
case byterel:
- return (bfd_vma) (cp + sizeof *cp + *cp);
+ return 1 + bfd_get_signed_8 (core_bfd, modep);
case wordrel:
- for (i = 0; (size_t) i < sizeof *sp; i++)
- value = (value << 8) + (cp[i] & 0xff);
- return (bfd_vma) (cp + sizeof *sp + value);
+ return 2 + bfd_get_signed_16 (core_bfd, modep);
case longrel:
- for (i = 0; (size_t) i < sizeof *lp; i++)
- value = (value << 8) + (cp[i] & 0xff);
- return (bfd_vma) (cp + sizeof *lp + value);
+ return 4 + bfd_get_signed_32 (core_bfd, modep);
}
}
@@ -228,7 +220,7 @@ tahoe_find_call (parent, p_lowpc, p_highpc)
Sym *child;
tahoe_operandenum mode;
tahoe_operandenum firstmode;
- bfd_vma destpc;
+ bfd_vma pc, destpc;
static bool inited = FALSE;
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",
parent->name, (unsigned long) p_lowpc,
(unsigned long) p_highpc));
- for (instructp = (unsigned char *) core_text_space + p_lowpc;
- instructp < (unsigned char *) core_text_space + p_highpc;
- instructp += length)
+ for (pc = p_lowpc; pc < p_highpc; pc += length)
{
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.
* skip the count of the number of arguments.
*/
DBG (CALLDEBUG, printf ("[findcall]\t0x%lx:callf",
- ((unsigned long)
- (instructp
- - (unsigned char *) core_text_space))));
+ (unsigned long) pc));
firstmode = tahoe_operandmode (instructp + length);
switch (firstmode)
{
@@ -312,8 +302,7 @@ tahoe_find_call (parent, p_lowpc, p_highpc)
* check that this is the address of
* a function.
*/
- destpc = tahoe_reladdr (instructp + length)
- - (bfd_vma) core_text_space;
+ destpc = pc + tahoe_offset (instructp + length);
if (destpc >= s_lowpc && destpc <= s_highpc)
{
child = sym_lookup (&symtab, destpc);
diff --git a/gprof/utils.c b/gprof/utils.c
index c18f833..cf6dd29 100644
--- a/gprof/utils.c
+++ b/gprof/utils.c
@@ -16,10 +16,12 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-#include <demangle.h>
+#include "demangle.h"
#include "gprof.h"
-#include "cg_arcs.h"
+#include "search_list.h"
+#include "source.h"
#include "symtab.h"
+#include "cg_arcs.h"
/*
diff --git a/gprof/vax.c b/gprof/vax.c
index bce1e72..bbecff9 100644
--- a/gprof/vax.c
+++ b/gprof/vax.c
@@ -17,10 +17,12 @@
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "gprof.h"
+#include "search_list.h"
+#include "source.h"
+#include "symtab.h"
#include "cg_arcs.h"
#include "corefile.h"
#include "hist.h"
-#include "symtab.h"
/*
* opcode of the `calls' instruction
@@ -41,30 +43,34 @@ enum opermodes
};
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
{
unsigned int regfield:4;
unsigned int modefield:4;
};
+#endif
/*
* A symbol to be the child of indirect calls:
*/
static Sym indirectchild;
-static operandenum vax_operandmode PARAMS ((struct modebyte *));
+static operandenum vax_operandmode PARAMS ((unsigned char *));
static char *vax_operandname PARAMS ((operandenum));
-static long vax_operandlength PARAMS ((struct modebyte *));
-static bfd_vma vax_reladdr PARAMS ((struct modebyte *));
+static long vax_operandlength PARAMS ((unsigned char *));
+static bfd_signed_vma vax_offset PARAMS ((unsigned char *));
void vax_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
static operandenum
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 1:
@@ -156,7 +162,7 @@ vax_operandname (mode)
static long
vax_operandlength (modep)
- struct modebyte *modep;
+ unsigned char *modep;
{
switch (vax_operandmode (modep))
@@ -186,36 +192,30 @@ vax_operandlength (modep)
case longreldef:
return 5;
case indexed:
- return 1 + vax_operandlength ((struct modebyte *) ((char *) modep) + 1);
+ return 1 + vax_operandlength (modep + 1);
}
/* NOTREACHED */
abort ();
}
-static bfd_vma
-vax_reladdr (modep)
- struct modebyte *modep;
+static bfd_signed_vma
+vax_offset (modep)
+ unsigned char *modep;
{
operandenum mode = vax_operandmode (modep);
- char *cp;
- short *sp;
- long *lp;
- cp = (char *) modep;
- ++cp; /* skip over the mode */
+ ++modep; /* skip over the mode */
switch (mode)
{
default:
fprintf (stderr, "[reladdr] not relative address\n");
- return (bfd_vma) modep;
+ return 0;
case byterel:
- return (bfd_vma) (cp + sizeof *cp + *cp);
+ return 1 + bfd_get_signed_8 (core_bfd, modep);
case wordrel:
- sp = (short *) cp;
- return (bfd_vma) (cp + sizeof *sp + *sp);
+ return 2 + bfd_get_signed_16 (core_bfd, modep);
case longrel:
- lp = (long *) cp;
- return (bfd_vma) (cp + sizeof *lp + *lp);
+ return 4 + bfd_get_signed_32 (core_bfd, modep);
}
}
@@ -231,7 +231,7 @@ vax_find_call (parent, p_lowpc, p_highpc)
Sym *child;
operandenum mode;
operandenum firstmode;
- bfd_vma destpc;
+ bfd_vma pc, destpc;
static bool inited = FALSE;
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",
parent->name, (unsigned long) p_lowpc,
(unsigned long) p_highpc));
- for (instructp = (unsigned char *) core_text_space + p_lowpc;
- instructp < (unsigned char *) core_text_space + p_highpc;
- instructp += length)
+ for (pc = p_lowpc; pc < p_highpc; pc += length)
{
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.
* skip the count of the number of arguments.
*/
DBG (CALLDEBUG,
- printf ("[findcall]\t0x%lx:calls",
- ((unsigned long)
- (instructp - (unsigned char *) core_text_space))));
- firstmode = vax_operandmode ((struct modebyte *) (instructp + length));
+ printf ("[findcall]\t0x%lx:calls", (unsigned long) pc));
+ firstmode = vax_operandmode (instructp + length);
switch (firstmode)
{
case literal:
@@ -281,8 +279,8 @@ vax_find_call (parent, p_lowpc, p_highpc)
default:
goto botched;
}
- length += vax_operandlength ((struct modebyte *) (instructp + length));
- mode = vax_operandmode ((struct modebyte *) (instructp + length));
+ length += vax_operandlength (instructp + length);
+ mode = vax_operandmode (instructp + length);
DBG (CALLDEBUG,
printf ("\tfirst operand is %s", vax_operandname (firstmode));
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???]
*/
arc_add (parent, &indirectchild, (unsigned long) 0);
- length += vax_operandlength (
- (struct modebyte *) (instructp + length));
+ length += vax_operandlength (instructp + length);
continue;
case byterel:
case wordrel:
@@ -315,8 +312,7 @@ vax_find_call (parent, p_lowpc, p_highpc)
* check that this is the address of
* a function.
*/
- destpc = vax_reladdr ((struct modebyte *) (instructp + length))
- - (bfd_vma) core_text_space;
+ destpc = pc + vax_offset (instructp + length);
if (destpc >= s_lowpc && destpc <= s_highpc)
{
child = sym_lookup (&symtab, destpc);
@@ -333,8 +329,7 @@ vax_find_call (parent, p_lowpc, p_highpc)
* a hit
*/
arc_add (parent, child, (unsigned long) 0);
- length += vax_operandlength ((struct modebyte *)
- (instructp + length));
+ length += vax_operandlength (instructp + length);
continue;
}
goto botched;