/* DWARF 2 Expression Evaluator.
- Copyright (C) 2001-2015 Free Software Foundation, Inc.
+ Copyright (C) 2001-2016 Free Software Foundation, Inc.
Contributed by Daniel Berlin (dan@dberlin.org)
#include "gdbcore.h"
#include "dwarf2.h"
#include "dwarf2expr.h"
+#include "dwarf2loc.h"
/* Local prototypes. */
static struct type *
dwarf_expr_address_type (struct dwarf_expr_context *ctx)
{
- struct dwarf_gdbarch_types *types = gdbarch_data (ctx->gdbarch,
- dwarf_arch_cookie);
+ struct dwarf_gdbarch_types *types
+ = (struct dwarf_gdbarch_types *) gdbarch_data (ctx->gdbarch,
+ dwarf_arch_cookie);
int ndx;
if (ctx->addr_size == 2)
{
struct dwarf_expr_context *retval;
- retval = xcalloc (1, sizeof (struct dwarf_expr_context));
+ retval = XCNEW (struct dwarf_expr_context);
retval->stack_len = 0;
retval->stack_allocated = 10;
- retval->stack = xmalloc (retval->stack_allocated
- * sizeof (struct dwarf_stack_value));
+ retval->stack = XNEWVEC (struct dwarf_stack_value, retval->stack_allocated);
retval->num_pieces = 0;
retval->pieces = 0;
retval->max_recursion_depth = 0x100;
static void
free_dwarf_expr_context_cleanup (void *arg)
{
- free_dwarf_expr_context (arg);
+ free_dwarf_expr_context ((struct dwarf_expr_context *) arg);
}
/* Return a cleanup that calls free_dwarf_expr_context. */
{
size_t newlen = ctx->stack_len + need + 10;
- ctx->stack = xrealloc (ctx->stack,
- newlen * sizeof (struct dwarf_stack_value));
+ ctx->stack = XRESIZEVEC (struct dwarf_stack_value, ctx->stack, newlen);
ctx->stack_allocated = newlen;
}
}
for those architectures which require it. */
if (gdbarch_integer_to_address_p (ctx->gdbarch))
{
- gdb_byte *buf = alloca (ctx->addr_size);
+ gdb_byte *buf = (gdb_byte *) alloca (ctx->addr_size);
struct type *int_type = get_unsigned_type (ctx->gdbarch,
value_type (result_val));
ctx->num_pieces++;
- ctx->pieces = xrealloc (ctx->pieces,
- (ctx->num_pieces
- * sizeof (struct dwarf_expr_piece)));
+ ctx->pieces
+ = XRESIZEVEC (struct dwarf_expr_piece, ctx->pieces, ctx->num_pieces);
p = &ctx->pieces[ctx->num_pieces - 1];
p->location = ctx->location;
\f
/* Check that the current operator is either at the end of an
- expression, or that it is followed by a composition operator. */
+ expression, or that it is followed by a composition operator or by
+ DW_OP_GNU_uninit (which should terminate the expression). */
void
dwarf_expr_require_composition (const gdb_byte *op_ptr, const gdb_byte *op_end,
const char *op_name)
{
- /* It seems like DW_OP_GNU_uninit should be handled here. However,
- it doesn't seem to make sense for DW_OP_*_value, and it was not
- checked at the other place that this function is called. */
- if (op_ptr != op_end && *op_ptr != DW_OP_piece && *op_ptr != DW_OP_bit_piece)
+ if (op_ptr != op_end && *op_ptr != DW_OP_piece && *op_ptr != DW_OP_bit_piece
+ && *op_ptr != DW_OP_GNU_uninit)
error (_("DWARF-2 expression error: `%s' operations must be "
"used either alone or in conjunction with DW_OP_piece "
"or DW_OP_bit_piece."),
return 0;
}
- if (gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf_reg)
+ if (dwarf_reg_to_regnum (gdbarch, dwarf_reg)
!= gdbarch_sp_regnum (gdbarch))
return 0;
case DW_OP_reg29:
case DW_OP_reg30:
case DW_OP_reg31:
- if (op_ptr != op_end
- && *op_ptr != DW_OP_piece
- && *op_ptr != DW_OP_bit_piece
- && *op_ptr != DW_OP_GNU_uninit)
- error (_("DWARF-2 expression error: DW_OP_reg operations must be "
- "used either alone or in conjunction with DW_OP_piece "
- "or DW_OP_bit_piece."));
+ dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_reg");
result = op - DW_OP_reg0;
result_val = value_from_ulongest (address_type, result);
case DW_OP_GNU_deref_type:
{
int addr_size = (op == DW_OP_deref ? ctx->addr_size : *op_ptr++);
- gdb_byte *buf = alloca (addr_size);
+ gdb_byte *buf = (gdb_byte *) alloca (addr_size);
CORE_ADDR addr = dwarf_expr_fetch_address (ctx, 0);
struct type *type;
ULONGEST result =
extract_unsigned_integer (buf, addr_size, byte_order);
- buf = alloca (TYPE_LENGTH (type));
+ buf = (gdb_byte *) alloca (TYPE_LENGTH (type));
store_unsigned_integer (buf, TYPE_LENGTH (type),
byte_order, result);
}
break;
case DW_OP_GNU_push_tls_address:
+ case DW_OP_form_tls_address:
/* Variable is at a constant offset in the thread-local
storage block into the objfile for the current thread and
the dynamic linker module containing this expression. Here
CORE_ADDR
ctx_no_get_tls_address (void *baton, CORE_ADDR offset)
{
- error (_("%s is invalid in this context"), "DW_OP_GNU_push_tls_address");
+ error (_("%s is invalid in this context"), "DW_OP_form_tls_address");
}
/* Stub dwarf_expr_context_funcs.dwarf_call implementation. */