aboutsummaryrefslogtreecommitdiff
path: root/gprof/i386.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1998-02-03 19:52:41 +0000
committerIan Lance Taylor <ian@airs.com>1998-02-03 19:52:41 +0000
commitc3de2a19e8e6b333525efb65de2e83791c73a378 (patch)
tree2c0cdd285d1d194c9223323e775aad85f83324a0 /gprof/i386.c
parent37379a256bf9e85add0024d7e13f43aa0eba4282 (diff)
downloadgdb-c3de2a19e8e6b333525efb65de2e83791c73a378.zip
gdb-c3de2a19e8e6b333525efb65de2e83791c73a378.tar.gz
gdb-c3de2a19e8e6b333525efb65de2e83791c73a378.tar.bz2
Tue Feb 3 14:25:25 1998 Brent Baccala <baccala@freesoft.org>
Make it possible to build a cross gprof, although a few cases are still not handled: * configure.in: Don't set MY_TARGET. * gprof.h: Don't include MACHINE_H. Don't define FOPEN_RB or FOPEN_WB; just get them from sysdep.h. * core.h (min_insn_size, offset_to_code): Declare. * core.c (MIN_INSN_SIZE): Don't define. (min_insn_size, offset_to_code): New variables. (core_init): Initialize min_insn_size and offset_to_code. (find_call): New function. (core_create_line_syms): Don't use min_dist. Set is_static in pass 2. * hist.c (UNITS_TO_CODE): Define. * gprof.c (default_excluded_list): Add "__mcount_internal". * gmon.h: Change TARGET_alpha to __alpha__. * hertz.h: Ifdef MACH, define hertz as HZ. * alpha.c (alpha_Instruction): Rename from Instruction. Change all references. (alpha_find_call): Rename from find_call. * alpha.h: Remove. * dummy.c, dummy.h: Remove. * i386.c (i386_iscall): Rename from iscall. Change all references. Check for call instruction, not jump or lcall. (i386_find_call): Rename from find_call. Correct for VMA. Correct call destination computation. Don't dereference symbol if it is NULL. * i386.h: Remove. * ns532.c, ns532.h: Remove. * sparc.c (CALL): Define. (sparc_find_call): Rename from find_call. * sparc.h: Remove. * tahoe.c: Include cg_arcs.h, core.h, hist.h, and symtab.h. Don't include time_host.h. (CALLF, PC): Define. (enum tahoe_opermodes, tahoe_operandenum): Define. Rename all references to opermodes or operandenum to these. (tahoe_operandmode): Rename from operandmode. Call abort if switch does not return. (tahoe_operandname): Rename from operandname. Call abort if switch does not return. (tahoe_operandlength): Rename from operandlength. Call abort if switch does not return. (tahoe_reladdr): Rename from reladdr. (tahoe_find_call): Rename from find_call. Use core_text_space rather than textspace. * tahoe.h: Remove. * vax.c (CALLS, PC): Define. (enum opermodes, operandenum, struct modebyte): Define. (vax_operandmode): Rename from operandmode. Call abort if switch does not return. (vax_operandname): Rename from operandname. Call abort if switch does not return. (vax_operandlength): Rename from operandlength. Call abort if switch does not return. (vax_reladdr): Rename from reladdr. (vax_find_call): Rename from find_call. * vax.h: Remove. * Makefile.am (AUTOMAKE_OPTIONS): Set to cygnus. (MY_TARGET): Remove. (INCLUDES): Remove -DTARGET_$(MY_TARGET) and -DMACHINE_H= \"$(MY_TARGET).h\". (gprof_SOURCES): Add i386.c, alpha.c, vax.c, tahoe.c, sparc.c. (gprof_DEPENDENCIES): Remove $(MY_TARGET).o. (gprof_LDADD): Likewise. (noinst_HEADERS): Remove alpha.h, i386.h, ns532.h, sparc.h, tahoe.h, vax.h, dummy.h. (EXTRA_DIST): Remove alpha.c, i386.c, ns532.c, sparc.c, tahoe.c, vax.c, dummy.c. ($(OBJECTS)): Don't depend upon $(MY_TARGET).h. ($(MY_TARGET).o): Remove target. (i386.o, alpha.o, vax.o, tahoe.o, sparc.o): New targets. * configure, Makefile.in, aclocal.m4: Rebuild.
Diffstat (limited to 'gprof/i386.c')
-rw-r--r--gprof/i386.c56
1 files changed, 25 insertions, 31 deletions
diff --git a/gprof/i386.c b/gprof/i386.c
index 01202a7..d09d34e 100644
--- a/gprof/i386.c
+++ b/gprof/i386.c
@@ -24,24 +24,23 @@
int
-DEFUN (iscall, (ip), unsigned char *ip)
+DEFUN (i386_iscall, (ip), unsigned char *ip)
{
- if (*ip == 0xeb || *ip == 0x9a)
+ if (*ip == 0xe8)
return 1;
return 0;
}
void
-find_call (parent, p_lowpc, p_highpc)
+i386_find_call (parent, p_lowpc, p_highpc)
Sym *parent;
bfd_vma p_lowpc;
bfd_vma p_highpc;
{
unsigned char *instructp;
- long length;
Sym *child;
- bfd_vma destpc;
+ bfd_vma destpc, delta;
if (core_text_space == 0)
{
@@ -57,54 +56,49 @@ find_call (parent, p_lowpc, p_highpc)
}
DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n",
parent->name, p_lowpc, p_highpc));
- for (instructp = (unsigned char *) core_text_space + p_lowpc;
- instructp < (unsigned char *) core_text_space + p_highpc;
- instructp += length)
+
+ delta = (bfd_vma) core_text_space - core_text_sect->vma;
+
+ for (instructp = (unsigned char *) (p_lowpc + delta);
+ instructp < (unsigned char *) (p_highpc + delta);
+ instructp ++)
{
- length = 1;
- if (iscall (instructp))
+ if (i386_iscall (instructp))
{
DBG (CALLDEBUG,
- printf ("[findcall]\t0x%x:callf",
- instructp - (unsigned char *) core_text_space));
- length = 4;
+ printf ("[findcall]\t0x%x:call",
+ instructp - (unsigned char *) delta));
/*
* regular pc relative addressing
* check that this is the address of
* a function.
*/
- destpc = ((bfd_vma) instructp + 5 - (bfd_vma) core_text_space);
+
+ destpc = ((bfd_vma) bfd_get_32 (core_bfd, instructp + 1)
+ + (bfd_vma) instructp - (bfd_vma) delta + 5);
if (destpc >= s_lowpc && destpc <= s_highpc)
{
child = sym_lookup (&symtab, destpc);
- DBG (CALLDEBUG,
- printf ("[findcall]\tdestpc 0x%lx", destpc);
- printf (" child->name %s", child->name);
- printf (" child->addr 0x%lx\n", child->addr);
- );
- if (child->addr == destpc)
+ if (child && child->addr == destpc)
{
/*
* a hit
*/
+ DBG (CALLDEBUG,
+ printf ("\tdestpc 0x%lx (%s)\n", destpc, child->name));
arc_add (parent, child, (long) 0);
- length += 4; /* constant lengths */
+ instructp += 4; /* call is a 5 byte instruction */
continue;
}
- goto botched;
}
/*
* else:
- * it looked like a callf,
- * but it wasn't to anywhere.
- */
- botched:
- /*
- * something funny going on.
+ * it looked like a callf, but it:
+ * a) wasn't actually a callf, or
+ * b) didn't point to a known function in the symtab, or
+ * c) something funny is going on.
*/
- DBG (CALLDEBUG, printf ("[findcall]\tbut it's a botch\n"));
- length = 1;
- continue;
+ DBG (CALLDEBUG, printf ("\tbut it's a botch\n"));
}
}
}