From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3160 invoked by alias); 22 Oct 2007 16:22:55 -0000 Received: (qmail 3144 invoked by uid 22791); 22 Oct 2007 16:22:54 -0000 X-Spam-Check-By: sourceware.org Received: from an-out-0708.google.com (HELO an-out-0708.google.com) (209.85.132.241) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 22 Oct 2007 16:22:50 +0000 Received: by an-out-0708.google.com with SMTP id b6so157678ana for ; Mon, 22 Oct 2007 09:22:48 -0700 (PDT) Received: by 10.78.136.9 with SMTP id j9mr3213254hud.1193070167587; Mon, 22 Oct 2007 09:22:47 -0700 (PDT) Received: by 10.78.154.10 with HTTP; Mon, 22 Oct 2007 09:22:42 -0700 (PDT) Message-ID: <7aa837f80710220922i70a2fe40xc36948005deb7c6c@mail.gmail.com> Date: Mon, 22 Oct 2007 16:22:00 -0000 From: "Grzegorz Cieslewski" To: gdb@sourceware.org Subject: Re: Setting a floating point register to raw hex value In-Reply-To: <1192823285.5787.122.camel@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <7aa837f80710120829y33db4c3cya21f6ead14ca56f3@mail.gmail.com> <7aa837f80710181238o4aa3e19djffe5324df65e5928@mail.gmail.com> <1192738560.5787.86.camel@localhost.localdomain> <20071018215448.GA12140@caradoc.them.org> <1192823285.5787.122.camel@localhost.localdomain> X-Google-Sender-Auth: 9cf1187a88f2a2f8 X-IsSubscribed: yes Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2007-10/txt/msg00187.txt.bz2 Thank you all for help. In the end since there is no "clean" way of addressing my problem I have merged the ideas into one. I decided that forcing shared library to load is slightly better than overwriting a random memory location (I would have to fix that before continuing to execute the program). The shared library contains only one global variable which is a array of chars. Then I use the method suggested by Thiago: (gdb) set {long long} ($temp_xyz) = 1 (gdb) set $f0 = {double} ($temp_xyz) On 10/19/07, Thiago Jung Bauermann wrote: > On Thu, 2007-10-18 at 17:54 -0400, Daniel Jacobowitz wrote: > > On Thu, Oct 18, 2007 at 06:16:00PM -0200, Thiago Jung Bauermann wrote: > > > Hi, > > > > > > Yes, that's indeed crazy. :-) > > > > > > Just found out that this works: > > > > > > (gdb) set (void *) $f1 = 0x1 > > > (gdb) info reg f1 > > > f1 4.9406564584124654e-324 (raw 0x0000000000000001) > > > > I think this only works by an accident involving > > gdbarch_convert_register_p on PowerPC. We should find some proper way > > to do it, document that, and then make this not work :-) > > You're just spoiling the fun. :-) > > You mean that rs6000_convert_register_p should return true for every > type that's not double, and then GDB would try to convert a void * to a > double and fail? > > I see in value_assign that $f1 in the expression I gave above is being > represented as a value struct in register $f1 with void * type. Wouldn't > it be reasonable for value_assign to see that this register is being > used with a type different than it's default (double) and figure that > the user wants to use the register in a different way and just let him > do that? > > > > On Thu, 2007-10-18 at 15:38 -0400, Grzegorz Cieslewski wrote: > > > > I have figured out a workaround but it is really ugly. > > > > > > > > Step 1: Create shared object containing a union as follows > > > > union longlong2double > > > > { > > > > long long int hexNum; > > > > double floatNum; > > > > } temp; > > > > > > > > Step 2: Force load the library at runtime into your program using > > > > LD_PRELOAD environmental variable > > > > > > > > Step 3: When debugging the program store 0x1 into temp.hexNum; > > > > (one would think that I could use the following now 'set $f0 = > > > > temp.floatNum; but that yields incorrect result) > > > > > > > > Step4: Overwrite the current instruction with 'load float' > > > > > > > > Step5: Using stepping command 'stepi 1' to write the value to the $f0 > > > > > > > > Step6: Undo all the changes required by steps 4 and 5 > > > > > > > > Does any one know of a simpler way because this workaround is crazy? > > > > Sure, here's a much easier way that ought to work: > > > > (gdb) set {long long} ($sp - 8) = 1 > > (gdb) set $f0 = {double} ($sp - 8) > > > > Doesn't have to be $sp - 8, any memory address will do. > > $sp - 8 will mess with the function's frame if he happens to be stepping > through the prologue. Just telling to make sure Grzegorz is aware of > it... > > > Oddly, this does not work on PowerPC. I can't figure out why > > not. It certainly ought to work; perhaps it requires a current > > version of GDB, since 0x1 is a denormal. It does work for normals, > > though, so I know the approach is sound. > > It worked for me in GDB 6.7 but not in HEAD. > -- > []'s > Thiago Jung Bauermann > Software Engineer > IBM Linux Technology Center > > -- ===================================================== Grzegorz Cieslewski Research Assistant High-performance Computing & Simulation (HCS) Research Laboratory University of Florida, Dept. of Electrical and Computer Engineering 330 Benton Hall, Gainesville, FL, 32611-6200 Phone: (352) 392-9041 Email: cieslewski@hcs.ufl.edu Web: www.hcs.ufl.edu =====================================================