From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9215 invoked by alias); 27 Oct 2011 00:24:32 -0000 Received: (qmail 9207 invoked by uid 22791); 27 Oct 2011 00:24:31 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 27 Oct 2011 00:24:13 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id F02BA2BB4C5; Wed, 26 Oct 2011 20:24:12 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id Vz7xyalPJfQi; Wed, 26 Oct 2011 20:24:12 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id C1CB22BB4BB; Wed, 26 Oct 2011 20:24:12 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id 72676145615; Wed, 26 Oct 2011 20:24:09 -0400 (EDT) Date: Thu, 27 Oct 2011 02:56:00 -0000 From: Joel Brobecker To: Pedro Alves Cc: gdb-patches@sourceware.org Subject: Re: [RFA/RFC] Restore old handling of multi-register variables Message-ID: <20111027002409.GX19246@adacore.com> References: <1317675787-7351-1-git-send-email-brobecker@adacore.com> <201110252002.38708.pedro@codesourcery.com> <20111025203022.GQ19246@adacore.com> <201110252149.34078.pedro@codesourcery.com> <20111026213726.GV19246@adacore.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="I3tAPq1Rm2pUxvsp" Content-Disposition: inline In-Reply-To: <20111026213726.GV19246@adacore.com> User-Agent: Mutt/1.5.20 (2009-06-14) 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-10/txt/msg00714.txt.bz2 --I3tAPq1Rm2pUxvsp Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 333 > gdb/ChangeLog: > > * value.h (read_frame_register_value): Add declaration. > * findvar.c (read_frame_register_value): New function. > (value_from_register): Use read_frame_register_value > instead of get_frame_register_value + value_contents_copy > to get value contents. (sigh) -- Joel --I3tAPq1Rm2pUxvsp Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="multi-register-value.diff" Content-length: 2836 commit 7f0a0ff60859de96d30b20d1462841a1f2283a72 Author: Joel Brobecker Date: Fri Oct 21 14:34:54 2011 -0700 handle variables stored in muliple consecutive registers gdb/ChangeLog: * value.h (read_frame_register_value): Add declaration. * findvar.c (read_frame_register_value): New function. (value_from_register): Use read_frame_register_value instead of get_frame_register_value + value_contents_copy to get value contents. diff --git a/gdb/findvar.c b/gdb/findvar.c index 8e986f1..54e7b4a 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -623,6 +623,35 @@ default_value_from_register (struct type *type, int regnum, return value; } +/* VALUE must be an lval_register value. If regnum is the value's + associated register number, and len the length of the values type, + read one or more registers in FRAME, starting with register REGNUM, + until we've read LEN bytes. */ + +void +read_frame_register_value (struct value *value, struct frame_info *frame) +{ + int offset = 0; + int regnum = VALUE_REGNUM (value); + const int len = TYPE_LENGTH (check_typedef (value_type (value))); + + gdb_assert (VALUE_LVAL (value) == lval_register); + + while (offset < len) + { + struct value *regval = get_frame_register_value (frame, regnum); + int reg_len = TYPE_LENGTH (value_type (regval)); + + if (offset + reg_len > len) + reg_len = len - offset; + value_contents_copy (value, offset, regval, value_offset (regval), + reg_len); + + offset += reg_len; + regnum++; + } +} + /* Return a value of type TYPE, stored in register REGNUM, in frame FRAME. */ struct value * @@ -661,16 +690,11 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame) } else { - int len = TYPE_LENGTH (type); - struct value *v2; - /* Construct the value. */ v = gdbarch_value_from_register (gdbarch, type, regnum, frame); /* Get the data. */ - v2 = get_frame_register_value (frame, regnum); - - value_contents_copy (v, 0, v2, value_offset (v), len); + read_frame_register_value (v, frame); } return v; @@ -695,3 +719,4 @@ address_from_register (struct type *type, int regnum, struct frame_info *frame) return result; } + diff --git a/gdb/value.h b/gdb/value.h index f18390e..d2c58ec 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -502,6 +502,9 @@ extern struct value *default_value_from_register (struct type *type, int regnum, struct frame_info *frame); +extern void read_frame_register_value (struct value *value, + struct frame_info *frame); + extern struct value *value_from_register (struct type *type, int regnum, struct frame_info *frame); --I3tAPq1Rm2pUxvsp--