diff options
author | Ian Lance Taylor <ian@airs.com> | 1998-02-03 19:52:41 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1998-02-03 19:52:41 +0000 |
commit | c3de2a19e8e6b333525efb65de2e83791c73a378 (patch) | |
tree | 2c0cdd285d1d194c9223323e775aad85f83324a0 /gprof/tahoe.c | |
parent | 37379a256bf9e85add0024d7e13f43aa0eba4282 (diff) | |
download | gdb-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/tahoe.c')
-rw-r--r-- | gprof/tahoe.c | 86 |
1 files changed, 56 insertions, 30 deletions
diff --git a/gprof/tahoe.c b/gprof/tahoe.c index 967ea01..a9585df 100644 --- a/gprof/tahoe.c +++ b/gprof/tahoe.c @@ -17,7 +17,29 @@ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "gprof.h" -#include "time_host.h" +#include "cg_arcs.h" +#include "core.h" +#include "hist.h" +#include "symtab.h" + + /* + * opcode of the `callf' instruction + */ +#define CALLF 0xfe + + /* + * register for pc relative addressing + */ +#define PC 0xf + +enum tahoe_opermodes + { + literal, indexed, reg, regdef, autodec, autoinc, autoincdef, + bytedisp, bytedispdef, worddisp, worddispdef, longdisp, longdispdef, + immediate, absolute, byterel, bytereldef, wordrel, wordreldef, + longrel, longreldef + }; +typedef enum tahoe_opermodes tahoe_operandenum; /* * A symbol to be the child of indirect callf: @@ -25,8 +47,8 @@ Sym indirectchild; -operandenum -operandmode (modep) +tahoe_operandenum +tahoe_operandmode (modep) unsigned char *modep; { long usesreg = ((long) *modep) & 0xf; @@ -64,11 +86,12 @@ operandmode (modep) return usesreg != PC ? longdispdef : longreldef; } /* NOTREACHED */ + abort (); } char * -operandname (mode) - operandenum mode; +tahoe_operandname (mode) + tahoe_operandenum mode; { switch (mode) @@ -117,14 +140,15 @@ operandname (mode) return "long relative deferred"; } /* NOTREACHED */ + abort (); } long -operandlength (modep) +tahoe_operandlength (modep) unsigned char *modep; { - switch (operandmode (modep)) + switch (tahoe_operandmode (modep)) { case literal: case reg: @@ -151,16 +175,17 @@ operandlength (modep) case longreldef: return 5; case indexed: - return 1 + operandlength (modep + 1); + return 1 + tahoe_operandlength (modep + 1); } /* NOTREACHED */ + abort (); } bfd_vma -reladdr (modep) +tahoe_reladdr (modep) char *modep; { - operandenum mode = operandmode (modep); + tahoe_operandenum mode = tahoe_operandmode (modep); char *cp; short *sp; long *lp; @@ -187,7 +212,8 @@ reladdr (modep) } } -find_call (parent, p_lowpc, p_highpc) +void +tahoe_find_call (parent, p_lowpc, p_highpc) Sym *parent; bfd_vma p_lowpc; bfd_vma p_highpc; @@ -195,8 +221,8 @@ find_call (parent, p_lowpc, p_highpc) unsigned char *instructp; long length; Sym *child; - operandenum mode; - operandenum firstmode; + tahoe_operandenum mode; + tahoe_operandenum firstmode; bfd_vma destpc; static bool inited = FALSE; @@ -208,7 +234,7 @@ find_call (parent, p_lowpc, p_highpc) indirectchild.cg.cyc.head = &indirectchild; } - if (textspace == 0) + if (core_text_space == 0) { return; } @@ -220,10 +246,10 @@ find_call (parent, p_lowpc, p_highpc) { p_highpc = s_highpc; } - DBG (CALLDEBUG, printf ("[findcall] %s: 0x%x to 0x%x\n", + DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n", parent->name, p_lowpc, p_highpc)); - for (instructp = textspace + p_lowpc; - instructp < textspace + p_highpc; + for (instructp = (unsigned char *) core_text_space + p_lowpc; + instructp < (unsigned char *) core_text_space + p_highpc; instructp += length) { length = 1; @@ -234,8 +260,8 @@ find_call (parent, p_lowpc, p_highpc) * skip the count of the number of arguments. */ DBG (CALLDEBUG, printf ("[findcall]\t0x%x:callf", - instructp - textspace)); - firstmode = operandmode (instructp + length); + instructp - (unsigned char *) core_text_space)); + firstmode = tahoe_operandmode (instructp + length); switch (firstmode) { case literal: @@ -244,11 +270,11 @@ find_call (parent, p_lowpc, p_highpc) default: goto botched; } - length += operandlength (instructp + length); - mode = operandmode (instructp + length); + length += tahoe_operandlength (instructp + length); + mode = tahoe_operandmode (instructp + length); DBG (CALLDEBUG, - printf ("\tfirst operand is %s", operandname (firstmode)); - printf ("\tsecond operand is %s\n", operandname (mode)); + printf ("\tfirst operand is %s", tahoe_operandname (firstmode)); + printf ("\tsecond operand is %s\n", tahoe_operandname (mode)); ); switch (mode) { @@ -268,7 +294,7 @@ find_call (parent, p_lowpc, p_highpc) * e.g. arrays of pointers to functions???] */ arc_add (parent, &indirectchild, (long) 0); - length += operandlength (instructp + length); + length += tahoe_operandlength (instructp + length); continue; case byterel: case wordrel: @@ -278,15 +304,15 @@ find_call (parent, p_lowpc, p_highpc) * check that this is the address of * a function. */ - destpc = reladdr (instructp + length) - - (bfd_vma) textspace; + destpc = tahoe_reladdr (instructp + length) + - (bfd_vma) core_text_space; if (destpc >= s_lowpc && destpc <= s_highpc) { - child = sym_lookup (destpc); + child = sym_lookup (&symtab, destpc); DBG (CALLDEBUG, - printf ("[findcall]\tdestpc 0x%x", destpc); + printf ("[findcall]\tdestpc 0x%lx", destpc); printf (" child->name %s", child->name); - printf (" child->addr 0x%x\n", child->addr); + printf (" child->addr 0x%lx\n", child->addr); ); if (child->addr == destpc) { @@ -294,7 +320,7 @@ find_call (parent, p_lowpc, p_highpc) * a hit */ arc_add (parent, child, (long) 0); - length += operandlength (instructp + length); + length += tahoe_operandlength (instructp + length); continue; } goto botched; |