#include "core.h"
#include "hist.h"
#include "symtab.h"
-#include "vax.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:
static operandenum
-operandmode (modep)
+vax_operandmode (modep)
struct modebyte *modep;
{
long usesreg = modep->regfield;
return usesreg != PC ? longdispdef : longreldef;
}
/* NOTREACHED */
+ abort ();
}
static char *
-operandname (mode)
+vax_operandname (mode)
operandenum 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:
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;
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;
sym_init (&indirectchild);
indirectchild.cg.prop.fract = 1.0;
indirectchild.cg.cyc.head = &indirectchild;
- } /* if */
+ }
if (core_text_space == 0)
{
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:
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:
* 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:
* 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)
{
* a hit
*/
arc_add (parent, child, (long) 0);
- length += operandlength ((struct modebyte *)
- (instructp + length));
+ length += vax_operandlength ((struct modebyte *)
+ (instructp + length));
continue;
}
goto botched;