/* Functions for manipulating expressions designed to be executed on the agent
- Copyright (C) 1998-2016 Free Software Foundation, Inc.
+ Copyright (C) 1998-2022 Free Software Foundation, Inc.
This file is part of GDB.
#include "defs.h"
#include "ax.h"
+#include "gdbarch.h"
#include "value.h"
#include "user-regs.h"
\f
/* Functions for building expressions. */
-/* Allocate a new, empty agent expression. */
-struct agent_expr *
-new_agent_expr (struct gdbarch *gdbarch, CORE_ADDR scope)
+agent_expr::agent_expr (struct gdbarch *gdbarch, CORE_ADDR scope)
{
- struct agent_expr *x = XNEW (struct agent_expr);
-
- x->len = 0;
- x->size = 1; /* Change this to a larger value once
+ this->len = 0;
+ this->size = 1; /* Change this to a larger value once
reallocation code is tested. */
- x->buf = (unsigned char *) xmalloc (x->size);
+ this->buf = (unsigned char *) xmalloc (this->size);
- x->gdbarch = gdbarch;
- x->scope = scope;
+ this->gdbarch = gdbarch;
+ this->scope = scope;
/* Bit vector for registers used. */
- x->reg_mask_len = 1;
- x->reg_mask = XCNEWVEC (unsigned char, x->reg_mask_len);
-
- x->tracing = 0;
- x->trace_string = 0;
+ this->reg_mask_len = 1;
+ this->reg_mask = XCNEWVEC (unsigned char, this->reg_mask_len);
- return x;
+ this->tracing = 0;
+ this->trace_string = 0;
}
-/* Free a agent expression. */
-void
-free_agent_expr (struct agent_expr *x)
-{
- xfree (x->buf);
- xfree (x->reg_mask);
- xfree (x);
-}
-
-static void
-do_free_agent_expr_cleanup (void *x)
+agent_expr::~agent_expr ()
{
- free_agent_expr ((struct agent_expr *) x);
+ xfree (this->buf);
+ xfree (this->reg_mask);
}
-struct cleanup *
-make_cleanup_free_agent_expr (struct agent_expr *x)
-{
- return make_cleanup (do_free_agent_expr_cleanup, x);
-}
-
-
/* Make sure that X has room for at least N more bytes. This doesn't
affect the length, just the allocated size. */
static void
LONGEST lim = ((LONGEST) 1) << (size - 1);
if (-lim <= l && l <= lim - 1)
- break;
+ break;
}
/* Emit the right opcode... */
/* Make sure the register number is in range. */
if (reg < 0 || reg > 0xffff)
- error (_("GDB bug: ax-general.c (ax_reg): "
+ error (_("GDB bug: ax-general.c (ax_reg): "
"register number out of range"));
grow_expr (x, 3);
x->buf[x->len] = aop_reg;
{0, 0, 0, 0, 0}
#define DEFOP(NAME, SIZE, DATA_SIZE, CONSUMED, PRODUCED, VALUE) \
, { # NAME, SIZE, DATA_SIZE, CONSUMED, PRODUCED }
-#include "ax.def"
+#include "gdbsupport/ax.def"
#undef DEFOP
};
{
int i;
- fprintf_filtered (f, _("Scope: %s\n"), paddress (x->gdbarch, x->scope));
- fprintf_filtered (f, _("Reg mask:"));
+ gdb_printf (f, _("Scope: %s\n"), paddress (x->gdbarch, x->scope));
+ gdb_printf (f, _("Reg mask:"));
for (i = 0; i < x->reg_mask_len; ++i)
- fprintf_filtered (f, _(" %02x"), x->reg_mask[i]);
- fprintf_filtered (f, _("\n"));
+ gdb_printf (f, _(" %02x"), x->reg_mask[i]);
+ gdb_printf (f, _("\n"));
/* Check the size of the name array against the number of entries in
the enum, to catch additions that people didn't sync. */
if (op >= (sizeof (aop_map) / sizeof (aop_map[0]))
|| !aop_map[op].name)
{
- fprintf_filtered (f, _("%3d <bad opcode %02x>\n"), i, op);
+ gdb_printf (f, _("%3d <bad opcode %02x>\n"), i, op);
i++;
continue;
}
if (i + 1 + aop_map[op].op_size > x->len)
{
- fprintf_filtered (f, _("%3d <incomplete opcode %s>\n"),
- i, aop_map[op].name);
+ gdb_printf (f, _("%3d <incomplete opcode %s>\n"),
+ i, aop_map[op].name);
break;
}
- fprintf_filtered (f, "%3d %s", i, aop_map[op].name);
+ gdb_printf (f, "%3d %s", i, aop_map[op].name);
if (aop_map[op].op_size > 0)
{
- fputs_filtered (" ", f);
+ gdb_puts (" ", f);
print_longest (f, 'd', 0,
read_const (x, i + 1, aop_map[op].op_size));
nargs = x->buf[i++];
slen = x->buf[i++];
slen = slen * 256 + x->buf[i++];
- fprintf_filtered (f, _(" \"%s\", %d args"),
- &(x->buf[i]), nargs);
+ gdb_printf (f, _(" \"%s\", %d args"),
+ &(x->buf[i]), nargs);
i += slen - 1;
}
- fprintf_filtered (f, "\n");
+ gdb_printf (f, "\n");
i += 1 + aop_map[op].op_size;
}
}
/* Grow the bit mask if necessary. */
if (byte >= ax->reg_mask_len)
- {
- /* It's not appropriate to double here. This isn't a
+ {
+ /* It's not appropriate to double here. This isn't a
string buffer. */
- int new_len = byte + 1;
- unsigned char *new_reg_mask
+ int new_len = byte + 1;
+ unsigned char *new_reg_mask
= XRESIZEVEC (unsigned char, ax->reg_mask, new_len);
- memset (new_reg_mask + ax->reg_mask_len, 0,
- (new_len - ax->reg_mask_len) * sizeof (ax->reg_mask[0]));
- ax->reg_mask_len = new_len;
- ax->reg_mask = new_reg_mask;
- }
+ memset (new_reg_mask + ax->reg_mask_len, 0,
+ (new_len - ax->reg_mask_len) * sizeof (ax->reg_mask[0]));
+ ax->reg_mask_len = new_len;
+ ax->reg_mask = new_reg_mask;
+ }
ax->reg_mask[byte] |= 1 << (reg % 8);
}
}
/* If this instruction is a forward jump target, does the
- current stack height match the stack height at the jump
- source? */
+ current stack height match the stack height at the jump
+ source? */
if (targets[i] && (heights[i] != height))
{
ax->flaw = agent_flaw_height_mismatch;
ax->max_data_size = op->data_size;
/* For jump instructions, check that the target is a valid
- offset. If it is, record the fact that that location is a
- jump target, and record the height we expect there. */
+ offset. If it is, record the fact that that location is a
+ jump target, and record the height we expect there. */
if (aop_goto == op - aop_map
|| aop_if_goto == op - aop_map)
{
}
/* Do we have any information about what the stack height
- should be at the target? */
+ should be at the target? */
if (targets[target] || boundary[target])
{
if (heights[target] != height)
}
}
- /* Record the target, along with the stack height we expect. */
- targets[target] = 1;
- heights[target] = height;
+ /* Record the target, along with the stack height we expect. */
+ targets[target] = 1;
+ heights[target] = height;
}
/* For unconditional jumps with a successor, check that the
- successor is a target, and pick up its stack height. */
+ successor is a target, and pick up its stack height. */
if (aop_goto == op - aop_map
&& i + 3 < ax->len)
{