From 6d9c411afd0301f0262ff63d6dc59dac38f58e63 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 31 Jan 2002 12:56:08 +0000 Subject: [PATCH] * 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. --- gprof/ChangeLog | 55 ++++++++++++++++++++++++++++++++ gprof/alpha.c | 46 ++++++++++++++------------- gprof/basic_blocks.c | 10 +++--- gprof/basic_blocks.h | 5 --- gprof/call_graph.c | 5 ++- gprof/call_graph.h | 4 --- gprof/cg_arcs.c | 3 ++ gprof/cg_arcs.h | 3 -- gprof/cg_dfn.c | 5 +-- gprof/cg_print.c | 4 +++ gprof/cg_print.h | 3 -- gprof/corefile.c | 4 ++- gprof/corefile.h | 2 -- gprof/gmon_io.c | 6 ++-- gprof/gmon_io.h | 3 -- gprof/gmon_out.h | 2 -- gprof/gprof.c | 4 ++- gprof/gprof.h | 4 +-- gprof/hertz.c | 1 + gprof/hertz.h | 2 -- gprof/hist.c | 5 +-- gprof/hist.h | 2 -- gprof/i386.c | 19 +++++------ gprof/mips.c | 4 ++- gprof/po/POTFILES.in | 1 + gprof/source.h | 4 --- gprof/sparc.c | 24 +++++++------- gprof/sym_ids.c | 4 +++ gprof/sym_ids.h | 2 -- gprof/symtab.c | 4 ++- gprof/symtab.h | 5 --- gprof/tahoe.c | 53 +++++++++++++------------------ gprof/utils.c | 6 ++-- gprof/vax.c | 75 +++++++++++++++++++++----------------------- 34 files changed, 204 insertions(+), 175 deletions(-) diff --git a/gprof/ChangeLog b/gprof/ChangeLog index d903d106a46..0eb592dcee2 100644 --- a/gprof/ChangeLog +++ b/gprof/ChangeLog @@ -1,3 +1,58 @@ +2002-01-31 Alan Modra + + * 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 * configure: Regenerated. diff --git a/gprof/alpha.c b/gprof/alpha.c index 4fa917ea551..978f2abac03 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.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 \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 8f560b4b2f6..65a662c2058 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 +#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 -#endif /* Default option values: */ bool bb_annotate_all_lines = FALSE; diff --git a/gprof/basic_blocks.h b/gprof/basic_blocks.h index 3e85bc2d6bc..e6fcf1f209a 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 -#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 a09938d103b..20977f989f4 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 ffa269df96a..233dd701ecb 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 -#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 7ea048b0694..83696310f74 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 caa0197a2bb..0364eefa2e9 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 02d64e73888..75b033beb45 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 #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 696a07354f9..867a4ec2756 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 ad9f4240c8a..ce41987df2c 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 55515ecf663..5616dfac02a 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 a876d620b85..a1457da7e2c 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 b15d64297da..bf8efef8c09 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 7936d836efe..48a03676477 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 714f9f21b51..25dce59d93c 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 - #define GMON_MAGIC "gmon" /* magic cookie */ #define GMON_VERSION 1 /* version number */ diff --git a/gprof/gprof.c b/gprof/gprof.c index 4a1fd50d01d..3c29e09f00f 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 fdf9a28e4ac..07ca5f0e1d8 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 a7fc14ed7f8..7e16511c26a 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 fc30a1f9d78..7f8b3ee58b2 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 ed360cdc8b6..403b7790c0a 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 #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 ea395cd06c2..fe4362bdec0 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 e30648fe08d..af2731c1f0f 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 1d050527eda..078474f7cce 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 5ae8116a5c1..6ea40f18244 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 58a4e976a1b..746848e02f1 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 -#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 1fbeae78fbd..5b1b1e88869 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 bf6ffcd054b..378d1aee7c7 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 4cef81d09c6..ca0ad069e29 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 6b5a093d067..9ca2002e6bc 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 8aa9ee534f2..d25323bfe28 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 214309ac34e..1e627c86697 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 c18f83342ef..cf6dd29e91e 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 +#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 bce1e7218b9..bbecff99c65 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; -- 2.30.2