* alpha.c (alpha_Instruction): Don't use.
authorAlan Modra <amodra@gmail.com>
Thu, 31 Jan 2002 12:56:08 +0000 (12:56 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 31 Jan 2002 12:56:08 +0000 (12:56 +0000)
(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.

34 files changed:
gprof/ChangeLog
gprof/alpha.c
gprof/basic_blocks.c
gprof/basic_blocks.h
gprof/call_graph.c
gprof/call_graph.h
gprof/cg_arcs.c
gprof/cg_arcs.h
gprof/cg_dfn.c
gprof/cg_print.c
gprof/cg_print.h
gprof/corefile.c
gprof/corefile.h
gprof/gmon_io.c
gprof/gmon_io.h
gprof/gmon_out.h
gprof/gprof.c
gprof/gprof.h
gprof/hertz.c
gprof/hertz.h
gprof/hist.c
gprof/hist.h
gprof/i386.c
gprof/mips.c
gprof/po/POTFILES.in
gprof/source.h
gprof/sparc.c
gprof/sym_ids.c
gprof/sym_ids.h
gprof/symtab.c
gprof/symtab.h
gprof/tahoe.c
gprof/utils.c
gprof/vax.c

index d903d106a4601504e1548339393876ac3257121e..0eb592dcee21a15909b4849559b7cbdac11040c8 100644 (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>
 
        * configure: Regenerated.
index 4fa917ea551cf7bedcf63f228691539b7fc3f642..978f2abac03745b103f822dda11f93578e1e0b75 100644 (file)
  * 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);
index 8f560b4b2f606103d6381121399bf2801add6247..65a662c2058d4a4e128563a1c75999ed6925d9ee 100644 (file)
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 \f
-#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;
index 3e85bc2d6bcb8386803a988556a5e48c98833e9a..e6fcf1f209a568ace7257e4a13889f8ad8f50657 100644 (file)
@@ -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.  */
index a09938d103b670c9f9da0a975a291ea190e8994d..20977f989f41b9f14f9ab586de4cd784ddaa3161 100644 (file)
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 \f
+#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
index ffa269df96aba5d66f3c42b13a3c61e40d3d53d2..233dd701ecbfb4373c50a231888d77048d2b3767 100644 (file)
@@ -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 *));
index 7ea048b069467a80594a2c17479112537ac84b9b..83696310f740cbb32b1b95339364c0c90064282b 100644 (file)
@@ -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"
index caa0197a2bb489cb48e8eb2a6043691f5d60d216..0364eefa2e91e90d06549de0f776797e182f59d3 100644 (file)
@@ -1,9 +1,6 @@
 #ifndef cg_arcs_h
 #define cg_arcs_h
 
-#include "gprof.h"
-#include "symtab.h"
-
 /*
  * Arc structure for call-graph.
  *
index 02d64e7388865c82bb0c53f87eab2a71596a2742..75b033beb456e3bf3456c4f75cba3fd867d45557 100644 (file)
  * 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)
index 696a07354f920bca276899f0a7498267107f203d..867a4ec2756168d49e0f58cb4e9afea9c23383e7 100644 (file)
    02111-1307, USA.  */
 \f
 #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"
index ad9f4240c8a5fad568d212538d4e9d520176006d..ce41987df2cb7cc8604699e088e8972ccfb0c0cf 100644 (file)
@@ -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 **));
index 55515ecf663379e51308df55615cb7b6e029a7ff..5616dfac02aace8f5c9bb4793ce46dd59cd7f139 100644 (file)
 \f
 #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;
index a876d620b85c759075d6b2544f055c96c44457e4..a1457da7e2cfae995ca067cc9630e39226a085c5 100644 (file)
@@ -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.  */
index b15d64297da429c1e182f66892ec30af84529816..bf8efef8c0915b6132da05d86f5ac2f3c23c9051 100644 (file)
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 \f
+#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"
index 7936d836efe36d451fc7cadf38525da6baa7816e..48a036764774462e6fd3b4e44786d9d277f987e7 100644 (file)
@@ -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"
index 714f9f21b515fe81a067531cd197772cb376c9c6..25dce59d93c6dbe2d7c7ee9761fa79939172b49d 100644 (file)
@@ -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 */
 
index 4a1fd50d01d620bf32410ce98478d62de81b85ee..3c29e09f00fe0348166854ee6c5ebf73ae31cb0a 100644 (file)
@@ -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"
 
index fdf9a28e4ac3af8f0b90ce1313f0267a339d4a3c..07ca5f0e1d87a6138e8e7e563bd0ac757ed3c5c8 100644 (file)
 #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 */
index a7fc14ed7f8cc8d8b3e5691eea4b4555ee9fd24b..7e16511c26abcd882b4bd70ef0b8a25b1d3c0bbe 100644 (file)
@@ -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"
 
 
index fc30a1f9d787046de1c25ea70161f9e6080ddc35..7f8b3ee58b219752f2c1b2774d216ea0a2039a29 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef hertz_h
 #define hertz_h
 
-#include "gprof.h"
-
 #define        HZ_WRONG 0              /* impossible clock frequency */
 
 /*
index ed360cdc8b63c2b161e68d2e0ac8d671f051f506..403b7790c0a7e0a00732916f7297ab78d7d64480 100644 (file)
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 \f
-#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"
 
index ea395cd06c28347b361b28ee335b964d2eaee586..fe4362bdec01d5e44429b54cc6ef9009634eb6f4 100644 (file)
@@ -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.  */
index e30648fe08d3ab8c8957d613032d196659f4a669..af2731c1f0fcab62937c6c77c3850749c42c33a9 100644 (file)
  * 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);
index 1d050527eda4420033013af00bcffbb3948ace7e..078474f7cceee9606d9229429e211c25c1664b30 100644 (file)
  * 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;
 
index 5ae8116a5c1aa504d2ce909f98694b7a17a9bc7f..6ea40f18244caa591b9db4482eeb2e66259b64b7 100644 (file)
@@ -22,6 +22,7 @@ hertz.h
 hist.c
 hist.h
 i386.c
+mips.c
 search_list.c
 search_list.h
 source.c
index 58a4e976a1be86daf8a7ee60b7b98289b169e9ba..746848e02f1679c146fbc59d66b0f6a4fff047b7 100644 (file)
@@ -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;
index 1fbeae78fbd282332a6f75acf2c553861de533a7..5b1b1e88869a8677fece6bee4df003cd5fe6b1c4 100644 (file)
  * 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);
index bf6ffcd054b1e424a5811c584d19a73677d01d44..378d1aee7c7113e0c8b9167d7fb00d94d2743aa3 100644 (file)
 \f
 #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"
 
index 4cef81d09c693385ea03cff52804682fd2389814..ca0ad069e29fd28dd3bcee473a89569707bc2f72 100644 (file)
@@ -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,
index 6b5a093d067fcdbcd977aabda991a1c5fb6fbe11..9ca2002e6bc639d40bd27f6061a70452cf895320 100644 (file)
    02111-1307, USA.  */
 \f
 #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;
 
index 8aa9ee534f2e39bc80a13d70b8cc60c23b790543..d25323bfe2801521a15fa19c6dd0c04dd0074caf 100644 (file)
@@ -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
index 214309ac34eb1cd86ca1b6bcdfb17f9626d404ce..1e627c866976817f5ad0d07d60cd9f5fdbfb1be9 100644 (file)
  * 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);
index c18f83342efa42375b13d383e35fc849458fd66a..cf6dd29e91eafa98a76558052d42da586007b2bd 100644 (file)
  * 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"
 
 
 /*
index bce1e7218b99871ea131e02e36317ffa849c2871..bbecff99c65532567f2bcc7b0007fe3c225add82 100644 (file)
  * 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;