This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: FYI: fix big-endian bug with DWARF_VALUE_STACK
- From: "Ulrich Weigand" <uweigand at de dot ibm dot com>
- To: tromey at redhat dot com
- Cc: gdb-patches at sourceware dot org
- Date: Thu, 25 Feb 2010 21:43:59 +0100 (CET)
- Subject: Re: FYI: fix big-endian bug with DWARF_VALUE_STACK
Tom Tromey wrote:
> >>>>> "Ulrich" == Ulrich Weigand <uweigand@de.ibm.com> writes:
> Ulrich> So it would seem to me that you should be able to request that
> Ulrich> this value be represented in any arbitrary length ...
>
> That interpretation makes sense to me, but so does the one making it an
> error. I suspect we will never run across code that exercises this. If
> you want to change it, I have no objection.
I agree that it is unlikely code will exercises this, and I'm fine
with leaving the check in. However, we should at least use the proper
DWARF address size (ctx->addr_size), as is used everywhere else where
the size of values on the DWARF stack is considered, instead of using
gdbarch_addr_bit, which really refers to GDB's internal representation
of target addresses ...
The patch below implements this change; tested on powerpc64-linux.
Does this look reasonable to you?
Bye,
Ulrich
ChangeLog:
* dwarf2loc.c (struct piece_closure): Remove ARCH member,
add ADDR_SIZE member.
(allocate_piece_closure): Update.
(copy_pieced_value_closure): Likewise.
(dwarf2_evaluate_loc_desc): Likewise.
(read_pieced_value): Use DWARF address size instead of
GDB's gdbarch_addr_bit as size of values on the DWARF stack.
Index: gdb/dwarf2loc.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2loc.c,v
retrieving revision 1.72
diff -u -p -r1.72 dwarf2loc.c
--- gdb/dwarf2loc.c 23 Feb 2010 16:14:36 -0000 1.72
+++ gdb/dwarf2loc.c 25 Feb 2010 18:36:02 -0000
@@ -232,8 +232,8 @@ struct piece_closure
/* The number of pieces used to describe this variable. */
int n_pieces;
- /* The architecture, used only for DWARF_VALUE_STACK. */
- struct gdbarch *arch;
+ /* The target address size, used only for DWARF_VALUE_STACK. */
+ int addr_size;
/* The pieces themselves. */
struct dwarf_expr_piece *pieces;
@@ -244,12 +244,12 @@ struct piece_closure
static struct piece_closure *
allocate_piece_closure (int n_pieces, struct dwarf_expr_piece *pieces,
- struct gdbarch *arch)
+ int addr_size)
{
struct piece_closure *c = XZALLOC (struct piece_closure);
c->n_pieces = n_pieces;
- c->arch = arch;
+ c->addr_size = addr_size;
c->pieces = XCALLOC (n_pieces, struct dwarf_expr_piece);
memcpy (c->pieces, pieces, n_pieces * sizeof (struct dwarf_expr_piece));
@@ -298,13 +298,12 @@ read_pieced_value (struct value *v)
case DWARF_VALUE_STACK:
{
- size_t n;
- int addr_size = gdbarch_addr_bit (c->arch) / 8;
- n = p->size;
- if (n > addr_size)
- n = addr_size;
+ struct gdbarch *gdbarch = get_type_arch (value_type (v));
+ size_t n = p->size;
+ if (n > c->addr_size)
+ n = c->addr_size;
store_unsigned_integer (contents + offset, n,
- gdbarch_byte_order (c->arch),
+ gdbarch_byte_order (gdbarch),
p->v.expr.value);
}
break;
@@ -377,7 +376,7 @@ copy_pieced_value_closure (struct value
{
struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
- return allocate_piece_closure (c->n_pieces, c->pieces, c->arch);
+ return allocate_piece_closure (c->n_pieces, c->pieces, c->addr_size);
}
static void
@@ -439,7 +438,8 @@ dwarf2_evaluate_loc_desc (struct symbol
struct piece_closure *c;
struct frame_id frame_id = get_frame_id (frame);
- c = allocate_piece_closure (ctx->num_pieces, ctx->pieces, ctx->gdbarch);
+ c = allocate_piece_closure (ctx->num_pieces, ctx->pieces,
+ ctx->addr_size);
retval = allocate_computed_value (SYMBOL_TYPE (var),
&pieced_value_funcs,
c);
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com