aboutsummaryrefslogtreecommitdiff
path: root/gprof/vax.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/vax.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/vax.c')
-rw-r--r--gprof/vax.c62
1 files changed, 45 insertions, 17 deletions
diff --git a/gprof/vax.c b/gprof/vax.c
index 6a1034c..020409c 100644
--- a/gprof/vax.c
+++ b/gprof/vax.c
@@ -22,6 +22,31 @@
#include "hist.h"
#include "symtab.h"
+ /*
+ * opcode of the `calls' instruction
+ */
+#define CALLS 0xfb
+
+ /*
+ * register for pc relative addressing
+ */
+#define PC 0xf
+
+enum opermodes
+ {
+ literal, indexed, reg, regdef, autodec, autoinc, autoincdef,
+ bytedisp, bytedispdef, worddisp, worddispdef, longdisp, longdispdef,
+ immediate, absolute, byterel, bytereldef, wordrel, wordreldef,
+ longrel, longreldef
+ };
+typedef enum opermodes operandenum;
+
+struct modebyte
+ {
+ unsigned int regfield:4;
+ unsigned int modefield:4;
+ };
+
/*
* A symbol to be the child of indirect calls:
*/
@@ -29,7 +54,7 @@ Sym indirectchild;
static operandenum
-operandmode (modep)
+vax_operandmode (modep)
struct modebyte *modep;
{
long usesreg = modep->regfield;
@@ -67,10 +92,11 @@ operandmode (modep)
return usesreg != PC ? longdispdef : longreldef;
}
/* NOTREACHED */
+ abort ();
}
static char *
-operandname (mode)
+vax_operandname (mode)
operandenum mode;
{
@@ -120,14 +146,15 @@ operandname (mode)
return "long relative deferred";
}
/* NOTREACHED */
+ abort ();
}
static long
-operandlength (modep)
+vax_operandlength (modep)
struct modebyte *modep;
{
- switch (operandmode (modep))
+ switch (vax_operandmode (modep))
{
case literal:
case reg:
@@ -154,16 +181,17 @@ operandlength (modep)
case longreldef:
return 5;
case indexed:
- return 1 + operandlength ((struct modebyte *) ((char *) modep) + 1);
+ return 1 + vax_operandlength ((struct modebyte *) ((char *) modep) + 1);
}
/* NOTREACHED */
+ abort ();
}
static bfd_vma
-reladdr (modep)
+vax_reladdr (modep)
struct modebyte *modep;
{
- operandenum mode = operandmode (modep);
+ operandenum mode = vax_operandmode (modep);
char *cp;
short *sp;
long *lp;
@@ -188,7 +216,7 @@ reladdr (modep)
void
-find_call (parent, p_lowpc, p_highpc)
+vax_find_call (parent, p_lowpc, p_highpc)
Sym *parent;
bfd_vma p_lowpc;
bfd_vma p_highpc;
@@ -237,7 +265,7 @@ find_call (parent, p_lowpc, p_highpc)
DBG (CALLDEBUG,
printf ("[findcall]\t0x%x:calls",
instructp - (unsigned char *) core_text_space));
- firstmode = operandmode ((struct modebyte *) (instructp + length));
+ firstmode = vax_operandmode ((struct modebyte *) (instructp + length));
switch (firstmode)
{
case literal:
@@ -246,11 +274,11 @@ find_call (parent, p_lowpc, p_highpc)
default:
goto botched;
}
- length += operandlength ((struct modebyte *) (instructp + length));
- mode = operandmode ((struct modebyte *) (instructp + length));
+ length += vax_operandlength ((struct modebyte *) (instructp + length));
+ mode = vax_operandmode ((struct modebyte *) (instructp + length));
DBG (CALLDEBUG,
- printf ("\tfirst operand is %s", operandname (firstmode));
- printf ("\tsecond operand is %s\n", operandname (mode)));
+ printf ("\tfirst operand is %s", vax_operandname (firstmode));
+ printf ("\tsecond operand is %s\n", vax_operandname (mode)));
switch (mode)
{
case regdef:
@@ -269,7 +297,7 @@ find_call (parent, p_lowpc, p_highpc)
* e.g. arrays of pointers to functions???]
*/
arc_add (parent, &indirectchild, (long) 0);
- length += operandlength (
+ length += vax_operandlength (
(struct modebyte *) (instructp + length));
continue;
case byterel:
@@ -280,7 +308,7 @@ find_call (parent, p_lowpc, p_highpc)
* check that this is the address of
* a function.
*/
- destpc = reladdr ((struct modebyte *) (instructp + length))
+ destpc = vax_reladdr ((struct modebyte *) (instructp + length))
- (bfd_vma) core_text_space;
if (destpc >= s_lowpc && destpc <= s_highpc)
{
@@ -296,8 +324,8 @@ find_call (parent, p_lowpc, p_highpc)
* a hit
*/
arc_add (parent, child, (long) 0);
- length += operandlength ((struct modebyte *)
- (instructp + length));
+ length += vax_operandlength ((struct modebyte *)
+ (instructp + length));
continue;
}
goto botched;