* vax-tdep.c (INVALID_FLOAT, MAXLEN, NOPCODES): Don't define.

(vax_print_insn, print_insn_arg): Remove static functions.
	(vax_gdbarch_init): Call set_gdbarch_print_insn with
	print_insn_vax from opcodes library.
	(_initialize_vax_tdep): Don't set deprecated_tm_print_insn.
This commit is contained in:
Ian Lance Taylor 2003-05-16 07:06:56 +00:00
parent b765d4e375
commit ee2842e23e
2 changed files with 10 additions and 250 deletions

View file

@ -1,3 +1,11 @@
2003-05-16 Ian Lance Taylor <ian@airs.com>
* vax-tdep.c (INVALID_FLOAT, MAXLEN, NOPCODES): Don't define.
(vax_print_insn, print_insn_arg): Remove static functions.
(vax_gdbarch_init): Call set_gdbarch_print_insn with
print_insn_vax from opcodes library.
(_initialize_vax_tdep): Don't set deprecated_tm_print_insn.
2003-05-15 Andrew Cagney <cagney@redhat.com>
* arch-utils.h (legacy_breakpoint_from_pc): Delete declaration.

View file

@ -50,32 +50,6 @@ static gdbarch_deprecated_extract_struct_value_address_ftype
vax_extract_struct_value_address;
static gdbarch_deprecated_push_dummy_frame_ftype vax_push_dummy_frame;
/* Return 1 if P points to an invalid floating point value.
LEN is the length in bytes -- not relevant on the Vax. */
/* FIXME: cagney/2002-01-19: The macro below was originally defined in
tm-vax.h and used in values.c. Two problems. Firstly this is a
very non-portable and secondly it is wrong. The VAX should be
using floatformat and associated methods to identify and handle
invalid floating-point values. Adding to the poor target's woes
there is no floatformat_vax_{f,d} and no TARGET_FLOAT_FORMAT
et.al.. */
/* FIXME: cagney/2002-01-19: It turns out that the only thing that
uses this macro is the vax disassembler code (so how old is this
target?). This target should instead be using the opcodes
disassembler. That allowing the macro to be eliminated. */
#define INVALID_FLOAT(p, len) ((*(short *) p & 0xff80) == 0x8000)
/* Vax instructions are never longer than this. */
#define MAXLEN 62
/* Number of elements in the opcode table. */
#define NOPCODES (sizeof votstrs / sizeof votstrs[0])
static unsigned char *print_insn_arg ();
static const char *
vax_register_name (int regno)
@ -373,228 +347,6 @@ vax_saved_pc_after_call (struct frame_info *frame)
return (DEPRECATED_FRAME_SAVED_PC(frame));
}
/* Print the vax instruction at address MEMADDR in debugged memory,
from disassembler info INFO.
Returns length of the instruction, in bytes. */
static int
vax_print_insn (CORE_ADDR memaddr, disassemble_info *info)
{
unsigned char buffer[MAXLEN];
register int i;
register unsigned char *p;
const char *d;
int status = (*info->read_memory_func) (memaddr, buffer, MAXLEN, info);
if (status != 0)
{
(*info->memory_error_func) (status, memaddr, info);
return -1;
}
for (i = 0; i < NOPCODES; i++)
if (votstrs[i].detail.code == buffer[0]
|| votstrs[i].detail.code == *(unsigned short *) buffer)
break;
/* Handle undefined instructions. */
if (i == NOPCODES)
{
(*info->fprintf_func) (info->stream, "0%o", buffer[0]);
return 1;
}
(*info->fprintf_func) (info->stream, "%s", votstrs[i].name);
/* Point at first byte of argument data,
and at descriptor for first argument. */
p = buffer + 1 + (votstrs[i].detail.code >= 0x100);
d = votstrs[i].detail.args;
if (*d)
(*info->fprintf_func) (info->stream, " ");
while (*d)
{
p = print_insn_arg (d, p, memaddr + (p - buffer), info);
d += 2;
if (*d)
(*info->fprintf_func) (info->stream, ",");
}
return p - buffer;
}
static unsigned char *
print_insn_arg (char *d, register char *p, CORE_ADDR addr,
disassemble_info *info)
{
register int regnum = *p & 0xf;
float floatlitbuf;
if (*d == 'b')
{
if (d[1] == 'b')
(*info->fprintf_func) (info->stream, "0x%x", addr + *p++ + 1);
else
{
(*info->fprintf_func) (info->stream, "0x%x", addr + *(short *) p + 2);
p += 2;
}
}
else
switch ((*p++ >> 4) & 0xf)
{
case 0:
case 1:
case 2:
case 3: /* Literal mode */
if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h')
{
*(int *) &floatlitbuf = 0x4000 + ((p[-1] & 0x3f) << 4);
(*info->fprintf_func) (info->stream, "$%f", floatlitbuf);
}
else
(*info->fprintf_func) (info->stream, "$%d", p[-1] & 0x3f);
break;
case 4: /* Indexed */
p = (char *) print_insn_arg (d, p, addr + 1, info);
(*info->fprintf_func) (info->stream, "[%s]", REGISTER_NAME (regnum));
break;
case 5: /* Register */
(*info->fprintf_func) (info->stream, REGISTER_NAME (regnum));
break;
case 7: /* Autodecrement */
(*info->fprintf_func) (info->stream, "-");
case 6: /* Register deferred */
(*info->fprintf_func) (info->stream, "(%s)", REGISTER_NAME (regnum));
break;
case 9: /* Autoincrement deferred */
(*info->fprintf_func) (info->stream, "@");
if (regnum == PC_REGNUM)
{
(*info->fprintf_func) (info->stream, "#");
info->target = *(long *) p;
(*info->print_address_func) (info->target, info);
p += 4;
break;
}
case 8: /* Autoincrement */
if (regnum == PC_REGNUM)
{
(*info->fprintf_func) (info->stream, "#");
switch (d[1])
{
case 'b':
(*info->fprintf_func) (info->stream, "%d", *p++);
break;
case 'w':
(*info->fprintf_func) (info->stream, "%d", *(short *) p);
p += 2;
break;
case 'l':
(*info->fprintf_func) (info->stream, "%d", *(long *) p);
p += 4;
break;
case 'q':
(*info->fprintf_func) (info->stream, "0x%x%08x",
((long *) p)[1], ((long *) p)[0]);
p += 8;
break;
case 'o':
(*info->fprintf_func) (info->stream, "0x%x%08x%08x%08x",
((long *) p)[3], ((long *) p)[2],
((long *) p)[1], ((long *) p)[0]);
p += 16;
break;
case 'f':
if (INVALID_FLOAT (p, 4))
(*info->fprintf_func) (info->stream,
"<<invalid float 0x%x>>",
*(int *) p);
else
(*info->fprintf_func) (info->stream, "%f", *(float *) p);
p += 4;
break;
case 'd':
if (INVALID_FLOAT (p, 8))
(*info->fprintf_func) (info->stream,
"<<invalid float 0x%x%08x>>",
((long *) p)[1], ((long *) p)[0]);
else
(*info->fprintf_func) (info->stream, "%f", *(double *) p);
p += 8;
break;
case 'g':
(*info->fprintf_func) (info->stream, "g-float");
p += 8;
break;
case 'h':
(*info->fprintf_func) (info->stream, "h-float");
p += 16;
break;
}
}
else
(*info->fprintf_func) (info->stream, "(%s)+", REGISTER_NAME (regnum));
break;
case 11: /* Byte displacement deferred */
(*info->fprintf_func) (info->stream, "@");
case 10: /* Byte displacement */
if (regnum == PC_REGNUM)
{
info->target = addr + *p + 2;
(*info->print_address_func) (info->target, info);
}
else
(*info->fprintf_func) (info->stream, "%d(%s)", *p, REGISTER_NAME (regnum));
p += 1;
break;
case 13: /* Word displacement deferred */
(*info->fprintf_func) (info->stream, "@");
case 12: /* Word displacement */
if (regnum == PC_REGNUM)
{
info->target = addr + *(short *) p + 3;
(*info->print_address_func) (info->target, info);
}
else
(*info->fprintf_func) (info->stream, "%d(%s)",
*(short *) p, REGISTER_NAME (regnum));
p += 2;
break;
case 15: /* Long displacement deferred */
(*info->fprintf_func) (info->stream, "@");
case 14: /* Long displacement */
if (regnum == PC_REGNUM)
{
info->target = addr + *(short *) p + 5;
(*info->print_address_func) (info->target, info);
}
else
(*info->fprintf_func) (info->stream, "%d(%s)",
*(long *) p, REGISTER_NAME (regnum));
p += 4;
}
return (unsigned char *) p;
}
/* Initialize the current architecture based on INFO. If possible, re-use an
architecture from ARCHES, which is a list of architectures already created
during this debugging session.
@ -687,6 +439,8 @@ vax_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
set_gdbarch_print_insn (gdbarch, print_insn_vax);
return (gdbarch);
}
@ -694,6 +448,4 @@ void
_initialize_vax_tdep (void)
{
gdbarch_register (bfd_arch_vax, vax_gdbarch_init, NULL);
deprecated_tm_print_insn = vax_print_insn;
}