summaryrefslogtreecommitdiff
path: root/gdb/dwarf2expr.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2004-08-24 21:01:49 +0000
committerJim Blandy <jimb@codesourcery.com>2004-08-24 21:01:49 +0000
commit592be8b7950cdf2d12cb7bc5af1d8a42e3c20c0d (patch)
treee02415b1532a95990d87bdae833cd441ce20ebac /gdb/dwarf2expr.c
parent90cec2b33bb900d64cfdf042fa95e07b6bcefdeb (diff)
downloadgdb-592be8b7950cdf2d12cb7bc5af1d8a42e3c20c0d.tar.gz
* dwarf2expr.h (struct dwarf_expr_context): New members
'num_pieces' and 'pieces', for returning the result of an expression that uses DW_OP_piece. (struct dwarf_expr_piece): New struct type. * dwarf2expr.c (new_dwarf_expr_context): Initialize num_pieces and pieces. (free_dwarf_expr_context): Free pieces, if any. (add_piece): New function. (execute_stack_op): Implement DW_OP_piece. * dwarf2loc.c (dwarf2_evaluate_loc_desc): If the result of the expression is a list of pieces, print an error message. (dwarf2_loc_desc_needs_frame): If the expression yields pieces, and any piece is in a register, then we need a frame.
Diffstat (limited to 'gdb/dwarf2expr.c')
-rw-r--r--gdb/dwarf2expr.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c
index 294afa06c63..a60e5a90e86 100644
--- a/gdb/dwarf2expr.c
+++ b/gdb/dwarf2expr.c
@@ -42,6 +42,8 @@ new_dwarf_expr_context (void)
retval->stack_len = 0;
retval->stack_allocated = 10;
retval->stack = xmalloc (retval->stack_allocated * sizeof (CORE_ADDR));
+ retval->num_pieces = 0;
+ retval->pieces = 0;
return retval;
}
@@ -51,6 +53,7 @@ void
free_dwarf_expr_context (struct dwarf_expr_context *ctx)
{
xfree (ctx->stack);
+ xfree (ctx->pieces);
xfree (ctx);
}
@@ -100,6 +103,29 @@ dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n)
}
+/* Add a new piece to CTX's piece list. */
+static void
+add_piece (struct dwarf_expr_context *ctx,
+ int in_reg, CORE_ADDR value, ULONGEST size)
+{
+ struct dwarf_expr_piece *p;
+
+ ctx->num_pieces++;
+
+ if (ctx->pieces)
+ ctx->pieces = xrealloc (ctx->pieces,
+ (ctx->num_pieces
+ * sizeof (struct dwarf_expr_piece)));
+ else
+ ctx->pieces = xmalloc (ctx->num_pieces
+ * sizeof (struct dwarf_expr_piece));
+
+ p = &ctx->pieces[ctx->num_pieces - 1];
+ p->in_reg = in_reg;
+ p->value = value;
+ p->size = size;
+}
+
/* Evaluate the expression at ADDR (LEN bytes long) using the context
CTX. */
@@ -661,6 +687,22 @@ execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
case DW_OP_nop:
goto no_push;
+ case DW_OP_piece:
+ {
+ ULONGEST size;
+ CORE_ADDR addr_or_regnum;
+
+ /* Record the piece. */
+ op_ptr = read_uleb128 (op_ptr, op_end, &size);
+ addr_or_regnum = dwarf_expr_fetch (ctx, 0);
+ add_piece (ctx, ctx->in_reg, addr_or_regnum, size);
+
+ /* Pop off the address/regnum, and clear the in_reg flag. */
+ dwarf_expr_pop (ctx);
+ ctx->in_reg = 0;
+ }
+ goto no_push;
+
default:
error ("Unhandled dwarf expression opcode 0x%x", op);
}