* alpha.c (alpha_Instruction): Don't use.
[deliverable/binutils-gdb.git] / gprof / sparc.c
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);
This page took 0.023808 seconds and 4 git commands to generate.