/* Print VAX instructions.
- Copyright (C) 1995-2015 Free Software Foundation, Inc.
+ Copyright (C) 1995-2021 Free Software Foundation, Inc.
Contributed by Pauline Middelink <middelin@polyware.iaf.nl>
This file is part of the GNU opcodes library.
#include <setjmp.h>
#include <string.h>
#include "opcode/vax.h"
-#include "dis-asm.h"
+#include "disassemble.h"
static char *reg_names[] =
{
#define COERCE32(x) ((int) (((x) ^ 0x80000000) - 0x80000000))
#define NEXTLONG(p) \
(p += 4, FETCH_DATA (info, p), \
- (COERCE32 ((((((p[-1] << 8) + p[-2]) << 8) + p[-3]) << 8) + p[-4])))
+ (COERCE32 (((((((unsigned) p[-1] << 8) + p[-2]) << 8) + p[-3]) << 8) + p[-4])))
/* Maximum length of an instruction. */
#define MAXLEN 25
entry addresses, which can be useful to disassemble ROM images, since
there's no symbol table. Returns TRUE upon success, FALSE otherwise. */
-static bfd_boolean
-parse_disassembler_options (char * options)
+static bool
+parse_disassembler_options (const char *options)
{
const char * entry_switch = "entry:";
if (entry_addr_occupied_slots >= entry_addr_total_slots)
{
/* A guesstimate of the number of entries we will have to create. */
- entry_addr_total_slots +=
- strlen (options) / (strlen (entry_switch) + 5);
-
+ entry_addr_total_slots
+ += 1 + strlen (options) / (strlen (entry_switch) + 5);
+
entry_addr = realloc (entry_addr, sizeof (bfd_vma)
* entry_addr_total_slots);
}
if (entry_addr == NULL)
- return FALSE;
-
+ return false;
+
entry_addr[entry_addr_occupied_slots] = bfd_scan_vma (options, NULL, 0);
entry_addr_occupied_slots ++;
}
- return TRUE;
+ return true;
}
#if 0 /* FIXME: Ideally the disassembler should have target specific
table at all. Forced entry points can be given by supplying several
-M options to objdump: -M entry:0xffbb7730. */
-static bfd_boolean
+static bool
is_function_entry (struct disassemble_info *info, bfd_vma addr)
{
unsigned int i;
&& info->symbols[0]
&& (info->symbols[0]->flags & (BSF_FUNCTION | BSF_SYNTHETIC))
&& addr == bfd_asymbol_value (info->symbols[0]))
- return TRUE;
+ return true;
/* Check for forced function entry address. */
for (i = entry_addr_occupied_slots; i--;)
if (entry_addr[i] == addr)
- return TRUE;
+ return true;
- return FALSE;
+ return false;
}
/* Check if the given address is the last longword of a PLT entry.
This longword is data and depending on the value it may interfere
with disassembly of further PLT entries. We make use of the fact
PLT symbols are marked BSF_SYNTHETIC. */
-static bfd_boolean
+static bool
is_plt_tail (struct disassemble_info *info, bfd_vma addr)
{
if (info->symbols
&& info->symbols[0]
&& (info->symbols[0]->flags & BSF_SYNTHETIC)
&& addr == bfd_asymbol_value (info->symbols[0]) + 8)
- return TRUE;
+ return true;
- return FALSE;
+ return false;
}
static int
(*info->fprintf_func) (info->stream, "$0x%x", mode);
break;
case 0x40: /* Index: base-addr[Rn] */
- p += print_insn_mode (d, size, p0 + 1, addr + 1, info);
- (*info->fprintf_func) (info->stream, "[%s]", reg_names[reg]);
+ {
+ unsigned char *q = p0 + 1;
+ unsigned char nextmode = NEXTBYTE (q);
+ if (nextmode < 0x60 || nextmode == 0x8f)
+ /* Literal, index, register, or immediate is invalid. In
+ particular don't recurse into another index mode which
+ might overflow the_buffer. */
+ (*info->fprintf_func) (info->stream, "[invalid base]");
+ else
+ p += print_insn_mode (d, size, p0 + 1, addr + 1, info);
+ (*info->fprintf_func) (info->stream, "[%s]", reg_names[reg]);
+ }
break;
case 0x50: /* Register: Rn */
(*info->fprintf_func) (info->stream, "%s", reg_names[reg]);
break;
case 0xB0: /* Displacement byte deferred: *displ(Rn). */
(*info->fprintf_func) (info->stream, "*");
+ /* Fall through. */
case 0xA0: /* Displacement byte: displ(Rn). */
if (reg == 0xF)
(*info->print_address_func) (addr + 2 + NEXTBYTE (p), info);
break;
case 0xD0: /* Displacement word deferred: *displ(Rn). */
(*info->fprintf_func) (info->stream, "*");
+ /* Fall through. */
case 0xC0: /* Displacement word: displ(Rn). */
if (reg == 0xF)
(*info->print_address_func) (addr + 3 + NEXTWORD (p), info);
break;
case 0xF0: /* Displacement long deferred: *displ(Rn). */
(*info->fprintf_func) (info->stream, "*");
+ /* Fall through. */
case 0xE0: /* Displacement long: displ(Rn). */
if (reg == 0xF)
(*info->print_address_func) (addr + 5 + NEXTLONG (p), info);
int
print_insn_vax (bfd_vma memaddr, disassemble_info *info)
{
- static bfd_boolean parsed_disassembler_options = FALSE;
+ static bool parsed_disassembler_options = false;
const struct vot *votp;
const char *argp;
unsigned char *arg;
parse_disassembler_options (info->disassembler_options);
/* To avoid repeated parsing of these options. */
- parsed_disassembler_options = TRUE;
+ parsed_disassembler_options = true;
}
if (OPCODES_SIGSETJMP (priv.bailout) != 0)
int offset;
FETCH_DATA (info, buffer + 4);
- offset = buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];
+ offset = ((unsigned) buffer[3] << 24 | buffer[2] << 16
+ | buffer[1] << 8 | buffer[0]);
(*info->fprintf_func) (info->stream, ".long 0x%08x", offset);
return 4;
while (*argp)
{
- arg += print_insn_arg (argp, arg, memaddr + arg - buffer, info);
+ arg += print_insn_arg (argp, arg, memaddr + (arg - buffer), info);
argp += 2;
if (*argp)
(*info->fprintf_func) (info->stream, ",");