From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20808 invoked by alias); 10 May 2011 14:15:08 -0000 Received: (qmail 20799 invoked by uid 22791); 10 May 2011 14:15:07 -0000 X-SWARE-Spam-Status: No, hits=-6.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 10 May 2011 14:14:53 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p4AEEpla020758 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 10 May 2011 10:14:51 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p4AEEp1H003993; Tue, 10 May 2011 10:14:51 -0400 Received: from opsy.redhat.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id p4AEEoen004742; Tue, 10 May 2011 10:14:50 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id 906FD3784CB; Tue, 10 May 2011 08:14:48 -0600 (MDT) From: Tom Tromey To: "Ulrich Weigand" Cc: gdb-patches@sourceware.org Subject: Re: RFC: implement typed DWARF stack References: <201105092202.p49M2anm000447@d06av02.portsmouth.uk.ibm.com> Date: Tue, 10 May 2011 14:15:00 -0000 In-Reply-To: <201105092202.p49M2anm000447@d06av02.portsmouth.uk.ibm.com> (Ulrich Weigand's message of "Tue, 10 May 2011 00:02:35 +0200 (CEST)") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-05/txt/msg00242.txt.bz2 >>>>> "Ulrich" == Ulrich Weigand 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); }