X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fax-general.c;h=d377d0b6eb254f2488c21d031517a89f75c1b27c;hb=8aaaf7577f070c91086533d959ac36a15d1d604f;hp=62c382cc5d70f3055cce2be5af24476f00be4b38;hpb=2b52013fe3b29dd6e23f3e893fb321999dc2f33b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ax-general.c b/gdb/ax-general.c index 62c382cc5d..d377d0b6eb 100644 --- a/gdb/ax-general.c +++ b/gdb/ax-general.c @@ -1,6 +1,5 @@ /* Functions for manipulating expressions designed to be executed on the agent - Copyright (C) 1998, 1999, 2000, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 1998-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -24,10 +23,9 @@ #include "defs.h" #include "ax.h" +#include "gdbarch.h" #include "value.h" -#include "gdb_string.h" - #include "user-regs.h" static void grow_expr (struct agent_expr *x, int n); @@ -40,50 +38,30 @@ static void generic_ext (struct agent_expr *x, enum agent_op op, int n); /* 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 = xmalloc (sizeof (*x)); - - 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 = 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 = xmalloc (x->reg_mask_len * sizeof (x->reg_mask[0])); - memset (x->reg_mask, 0, x->reg_mask_len * sizeof (x->reg_mask[0])); - - return x; -} - -/* Free a agent expression. */ -void -free_agent_expr (struct agent_expr *x) -{ - xfree (x->buf); - xfree (x->reg_mask); - xfree (x); -} + this->reg_mask_len = 1; + this->reg_mask = XCNEWVEC (unsigned char, this->reg_mask_len); -static void -do_free_agent_expr_cleanup (void *x) -{ - free_agent_expr (x); + this->tracing = 0; + this->trace_string = 0; } -struct cleanup * -make_cleanup_free_agent_expr (struct agent_expr *x) +agent_expr::~agent_expr () { - return make_cleanup (do_free_agent_expr_cleanup, x); + xfree (this->buf); + xfree (this->reg_mask); } - /* Make sure that X has room for at least N more bytes. This doesn't affect the length, just the allocated size. */ static void @@ -94,7 +72,7 @@ grow_expr (struct agent_expr *x, int n) x->size *= 2; if (x->size < x->len + n) x->size = x->len + n + 10; - x->buf = xrealloc (x->buf, x->size); + x->buf = (unsigned char *) xrealloc (x->buf, x->size); } } @@ -134,13 +112,20 @@ read_const (struct agent_expr *x, int o, int n) return accum; } +/* See ax.h. */ + +void +ax_raw_byte (struct agent_expr *x, gdb_byte byte) +{ + grow_expr (x, 1); + x->buf[x->len++] = byte; +} /* Append a simple operator OP to EXPR. */ void ax_simple (struct agent_expr *x, enum agent_op op) { - grow_expr (x, 1); - x->buf[x->len++] = op; + ax_raw_byte (x, op); } /* Append a pick operator to EXPR. DEPTH is the stack item to pick, @@ -302,6 +287,9 @@ ax_reg (struct agent_expr *x, int reg) } else { + /* Get the remote register number. */ + reg = gdbarch_remote_register_number (x->gdbarch, reg); + /* Make sure the register number is in range. */ if (reg < 0 || reg > 0xffff) error (_("GDB bug: ax-general.c (ax_reg): " @@ -332,12 +320,28 @@ ax_tsv (struct agent_expr *x, enum agent_op op, int num) x->len += 3; } +/* Append a string to the expression. Note that the string is going + into the bytecodes directly, not on the stack. As a precaution, + include both length as prefix, and terminate with a NUL. (The NUL + is counted in the length.) */ + void -ax_memcpy (struct agent_expr *x, const void *src, size_t n) +ax_string (struct agent_expr *x, const char *str, int slen) { - grow_expr (x, n); - memcpy (x->buf + x->len, src, n); - x->len += n; + int i; + + /* Make sure the string length is reasonable. */ + if (slen < 0 || slen > 0xffff) + internal_error (__FILE__, __LINE__, + _("ax-general.c (ax_string): string " + "length is %d, out of allowed range"), slen); + + grow_expr (x, 2 + slen + 1); + x->buf[x->len++] = ((slen + 1) >> 8) & 0xff; + x->buf[x->len++] = (slen + 1) & 0xff; + for (i = 0; i < slen; ++i) + x->buf[x->len++] = str[i]; + x->buf[x->len++] = '\0'; } @@ -350,7 +354,7 @@ struct aop_map aop_map[] = {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 }; @@ -360,7 +364,6 @@ void ax_print (struct ui_file *f, struct agent_expr *x) { int i; - int is_float = 0; fprintf_filtered (f, _("Scope: %s\n"), paddress (x->gdbarch, x->scope)); fprintf_filtered (f, _("Reg mask:")); @@ -376,8 +379,7 @@ ax_print (struct ui_file *f, struct agent_expr *x) for (i = 0; i < x->len;) { - enum agent_op op = x->buf[i]; - int op_size; + enum agent_op op = (enum agent_op) x->buf[i]; if (op >= (sizeof (aop_map) / sizeof (aop_map[0])) || !aop_map[op].name) @@ -386,19 +388,7 @@ ax_print (struct ui_file *f, struct agent_expr *x) i++; continue; } - if (op == aop_printf) - { - if (i + 2 >= x->len) - { - fprintf_filtered (f, _("%3d \n"), i, op); - i++; - continue; - } - op_size = 1 + strlen (x->buf + i + 2) + 1; - } - else - op_size = aop_map[op].op_size; - if (i + 1 + op_size > x->len) + if (i + 1 + aop_map[op].op_size > x->len) { fprintf_filtered (f, _("%3d \n"), i, aop_map[op].name); @@ -406,17 +396,28 @@ ax_print (struct ui_file *f, struct agent_expr *x) } fprintf_filtered (f, "%3d %s", i, aop_map[op].name); - if (op_size > 0) + if (aop_map[op].op_size > 0) { fputs_filtered (" ", f); print_longest (f, 'd', 0, - read_const (x, i + 1, op_size)); + read_const (x, i + 1, aop_map[op].op_size)); } - fprintf_filtered (f, "\n"); - i += 1 + op_size; + /* Handle the complicated printf arguments specially. */ + else if (op == aop_printf) + { + int slen, nargs; - is_float = (op == aop_float); + i++; + nargs = x->buf[i++]; + slen = x->buf[i++]; + slen = slen * 256 + x->buf[i++]; + fprintf_filtered (f, _(" \"%s\", %d args"), + &(x->buf[i]), nargs); + i += slen - 1; + } + fprintf_filtered (f, "\n"); + i += 1 + aop_map[op].op_size; } } @@ -437,7 +438,11 @@ ax_reg_mask (struct agent_expr *ax, int reg) } else { - int byte = reg / 8; + int byte; + + /* Get the remote register number. */ + reg = gdbarch_remote_register_number (ax->gdbarch, reg); + byte = reg / 8; /* Grow the bit mask if necessary. */ if (byte >= ax->reg_mask_len) @@ -445,9 +450,9 @@ ax_reg_mask (struct agent_expr *ax, int reg) /* It's not appropriate to double here. This isn't a string buffer. */ int new_len = byte + 1; - unsigned char *new_reg_mask = xrealloc (ax->reg_mask, - new_len - * sizeof (ax->reg_mask[0])); + 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; @@ -482,8 +487,6 @@ ax_reqs (struct agent_expr *ax) /* Pointer to a description of the present op. */ struct aop_map *op; - int op_size = 0, consumed = 0; - memset (targets, 0, ax->len * sizeof (targets[0])); memset (boundary, 0, ax->len * sizeof (boundary[0])); @@ -491,7 +494,7 @@ ax_reqs (struct agent_expr *ax) ax->flaw = agent_flaw_none; ax->max_data_size = 0; - for (i = 0; i < ax->len; i += 1 + op_size) + for (i = 0; i < ax->len; i += 1 + op->op_size) { if (ax->buf[i] > (sizeof (aop_map) / sizeof (aop_map[0]))) { @@ -507,23 +510,7 @@ ax_reqs (struct agent_expr *ax) return; } - if (ax->buf[i] == aop_printf) - { - if (i + 2 >= ax->len) - { - ax->flaw = agent_flaw_incomplete_instruction; - return; - } - consumed = ax->buf[i + 1]; - op_size = 1 + strlen (ax->buf + i + 2) + 1; - } - else - { - op_size = op->op_size; - consumed = op->consumed; - } - - if (i + 1 + op_size > ax->len) + if (i + 1 + op->op_size > ax->len) { ax->flaw = agent_flaw_incomplete_instruction; return; @@ -541,7 +528,7 @@ ax_reqs (struct agent_expr *ax) boundary[i] = 1; heights[i] = height; - height -= consumed; + height -= op->consumed; if (height < ax->min_height) ax->min_height = height; height += op->produced;