From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2667 invoked by alias); 20 Apr 2007 23:33:18 -0000 Received: (qmail 2659 invoked by uid 22791); 20 Apr 2007 23:33:17 -0000 X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sat, 21 Apr 2007 00:33:15 +0100 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.1/8.13.1) with ESMTP id l3KNXDld019085 for ; Fri, 20 Apr 2007 19:33:13 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [10.11.255.20]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id l3KNXDek021138 for ; Fri, 20 Apr 2007 19:33:13 -0400 Received: from ironwood.lan (vpn-14-56.rdu.redhat.com [10.11.14.56]) by pobox.corp.redhat.com (8.13.1/8.13.1) with ESMTP id l3KNXCEn013697 for ; Fri, 20 Apr 2007 19:33:13 -0400 Date: Sat, 21 Apr 2007 03:13:00 -0000 From: Kevin Buettner To: gdb-patches@sources.redhat.com Subject: [RFC] dwarf2_read_address(): sign extend as appropriate Message-ID: <20070420163312.56701614@ironwood.lan> X-Mailer: Sylpheed-Claws 2.6.0 (GTK+ 2.10.4; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-IsSubscribed: yes 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: 2007-04/txt/msg00303.txt.bz2 Any comments regarding the patch below? I wrote it last summer, so my memory about it is rather hazy aside from the fact that it fixed a bunch of C++ frame base problems on mips64 targets. It shouldn't affect any architecture other than mips because mips is the only one which defines an integer_to_address method. It also addresses Andrew's FIXME comment from nearly four years ago... * dwarf2expr.c (unsigned_address_type): Add forward declaration. (dwarf2_read_address): Sign extend return address as required by target architecture. Index: dwarf2expr.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2expr.c,v retrieving revision 1.19 diff -u -p -r1.19 dwarf2expr.c --- dwarf2expr.c 9 Jan 2007 17:58:50 -0000 1.19 +++ dwarf2expr.c 20 Apr 2007 23:23:50 -0000 @@ -33,6 +33,7 @@ static void execute_stack_op (struct dwarf_expr_context *, gdb_byte *, gdb_byte *); +static struct type * unsigned_address_type (void); /* Create a new context for the expression evaluator. */ @@ -205,9 +206,24 @@ dwarf2_read_address (gdb_byte *buf, gdb_ error (_("dwarf2_read_address: Corrupted DWARF expression.")); *bytes_read = TARGET_ADDR_BIT / TARGET_CHAR_BIT; - /* NOTE: cagney/2003-05-22: This extract is assuming that a DWARF 2 - address is always unsigned. That may or may not be true. */ - result = extract_unsigned_integer (buf, TARGET_ADDR_BIT / TARGET_CHAR_BIT); + + /* Some architectures (such as MIPS) use signed addresses. Those that + do will have registered a gdbarch_integer_to_address method. Use + that method if it exists, otherwise fall back to extracting an + unsigned integer as the address. + + Note: kevinb/2006-07-10: The use of `unsigned_address_type' in + the gdbarch_integer_to_address() call below refers to the type of + `buf' and has no bearing on the signedness of the address being + returned. In all of the integer-to-address conversion methods + being used by GDB at the time that this comment was written, this + type was used only to determine the size of `buf'. */ + if (gdbarch_integer_to_address_p (current_gdbarch)) + result = gdbarch_integer_to_address (current_gdbarch, + unsigned_address_type(), buf); + else + result = extract_unsigned_integer (buf, + TARGET_ADDR_BIT / TARGET_CHAR_BIT); return result; }