This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFC: implement typed DWARF stack


>>>>> "Ulrich" == Ulrich Weigand <uweigand@de.ibm.com> writes:

Ulrich> I guess I still find it a bit odd why we need those
Ulrich> DWARF-specific types in the first place (apparently solely for
Ulrich> DW_OP_mod), but if we really want to be completely compatible
Ulrich> with the prior behaviour, it seems we have to.

Yes, the reason is DW_OP_mod.

"Old-style" DWARF values are untyped.  We normally represent them as
signed ints of the appropriate size (DWARF says unsigned, but it is
simpler to use signed and gets the same results as long as the
arithmetic respects word size).  For DW_OP_mod, we must convert the
values to unsigned -- but we must not do this for values on the stack
that have an explicit type.  So, we need a special type we can
recognize, one that cannot be the same as any base type from the CU.

I will add a comment about this to the code.

Ulrich> B.t.w. your patch always performs an unsigned shift for
Ulrich> DW_OP_shr, even on signed operands.  However, for DW_OP_shra,
Ulrich> your patch respects the sign of the operands and might actually
Ulrich> perform an unsigned shift (even though the opcode explicitly
Ulrich> says "arithmetic right shift" ...)  This looks like another of
Ulrich> those signed/unsigned inconsistencies with the proposal to me.

Yes.  My understanding is that for new-style typed values, DW_OP_shr and
DW_OP_shra are actually the same -- the type indicates the operation to
perform.  But, for old-style values, we must cast to unsigned for
DW_OP_shr.

Ulrich> Looking into that, your code does run through value_as_address, but
Ulrich> since the platform does not define gdbarch_integer_to_address, this
Ulrich> falls through to unpack_long, and since the underlying type is a
Ulrich> TYPE_CODE_INT and not a pointer type, this in turn now respects
Ulrich> the TYPE_UNSIGNED flag and does a signed conversion ...

What if we add a cast to dwarf_expr_fetch_address, like the appended?
I am not really sure whether this is ok.

I will try to find a suitable PPC machine for testing.

Tom

diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c
index 3f6f277..bd3d4d7 100644
--- a/gdb/dwarf2expr.c
+++ b/gdb/dwarf2expr.c
@@ -215,6 +215,8 @@ dwarf_expr_fetch_address (struct dwarf_expr_context *ctx, int n)
   struct value *result_val = dwarf_expr_fetch (ctx, n);
 
   dwarf_require_integral (value_type (result_val));
+  result_val = value_cast (builtin_type (ctx->gdbarch)->builtin_data_ptr,
+			   result_val);
   return value_as_address (result_val);
 }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]