From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11696 invoked by alias); 31 Mar 2006 10:40:48 -0000 Received: (qmail 11688 invoked by uid 22791); 31 Mar 2006 10:40:47 -0000 X-Spam-Check-By: sourceware.org Received: from fra-del-03.spheriq.net (HELO fra-del-03.spheriq.net) (195.46.51.99) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 31 Mar 2006 10:40:44 +0000 Received: from fra-out-03.spheriq.net (fra-out-03.spheriq.net [195.46.51.131]) by fra-del-03.spheriq.net with ESMTP id k2VAeV0I003593 for ; Fri, 31 Mar 2006 10:40:32 GMT Received: from fra-cus-01.spheriq.net (fra-cus-01.spheriq.net [195.46.51.37]) by fra-out-03.spheriq.net with ESMTP id k2VAeUcn029501 for ; Fri, 31 Mar 2006 10:40:30 GMT Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by fra-cus-01.spheriq.net with ESMTP id k2VAeS00018572 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=OK) for ; Fri, 31 Mar 2006 10:40:29 GMT Received: from zeta.dmz-eu.st.com (ns2.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id DF212DA48 for ; Fri, 31 Mar 2006 10:40:20 +0000 (GMT) Received: from mail1.bri.st.com (mail1.bri.st.com [164.129.8.218]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 629054741B for ; Fri, 31 Mar 2006 10:44:21 +0000 (GMT) Received: from [164.129.15.13] (terrorhawk.bri.st.com [164.129.15.13]) by mail1.bri.st.com (MOS 3.5.8-GR) with ESMTP id CHK31457 (AUTH stubbsa); Fri, 31 Mar 2006 11:40:17 +0100 (BST) Message-ID: <442D0677.30208@st.com> Date: Fri, 31 Mar 2006 14:16:00 -0000 From: Andrew STUBBS User-Agent: Thunderbird 1.5 (Windows/20051201) MIME-Version: 1.0 To: GDB Patches Subject: Re: [PATCH] Fixup internal variables' endian (again) References: <4408847C.9040907@st.com> <20060329232241.GD9916@nevyn.them.org> <442BBD9A.5020104@st.com> <20060330151255.GA29860@nevyn.them.org> In-Reply-To: <20060330151255.GA29860@nevyn.them.org> Content-Type: multipart/mixed; boundary="------------050101070700090702090604" X-O-Spoofed: Not Scanned X-O-General-Status: No X-O-Spam1-Status: Not Scanned X-O-Spam2-Status: Not Scanned X-O-URL-Status: Not Scanned X-O-Virus1-Status: No X-O-Virus2-Status: Not Scanned X-O-Virus3-Status: No X-O-Virus4-Status: No X-O-Virus5-Status: Not Scanned X-O-Image-Status: Not Scanned X-O-Attach-Status: Not Scanned X-SpheriQ-Ver: 4.2.01 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-03/txt/msg00386.txt.bz2 This is a multi-part message in MIME format. --------------050101070700090702090604 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1189 Daniel Jacobowitz wrote: > So, if you've got a symbol file and the endianness is set wrong, you > can do this. I guess that counts as going out of their way, but it > doesn't match what you wrote originally, which was that you could never > produce such internalvars. Ah well, there's always another, more devious, way to do everything. But, as you say, once the symbol table is loaded there ought to be no endian issues unless the user brings it on themselves. The patch solves the problem where built-in types are set before the file is loaded, which is what I wanted to fix. >> I don't actually know of a host/target where >> this is a problem, but I'm sure there are some out there. > > Where switching endianness affects the floating point format? > Everything but ARM FPA, as far as I know. Well, I've tested it on x86 and sh4, and on both those platforms you can 'set endian ..' as much as you like and the floats are always shown correctly. On a Sparc the numbers do come through garbled in the wrong endian. > Could you put spaces around the equals signs, please. > > OK with that change. Thanks, committed with that change. The final patch is attached. Andrew Stubbs --------------050101070700090702090604 Content-Type: text/plain; name="endian.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="endian.patch" Content-length: 3174 2006-03-31 Andrew Stubbs * value.h (struct internalvar): Add field 'endian'. * value.c (lookup_internalvar): Initialise endian. (value_of_internalvar): Flip the endian of built-in types if required. (set_internalvar): Set the endian. (show_convenience): Access the value through value_of_internalvar(). Index: src/gdb/value.c =================================================================== --- src.orig/gdb/value.c 2006-02-01 23:14:10.000000000 +0000 +++ src/gdb/value.c 2006-03-31 11:10:21.000000000 +0100 @@ -755,6 +755,7 @@ lookup_internalvar (char *name) var = (struct internalvar *) xmalloc (sizeof (struct internalvar)); var->name = concat (name, (char *)NULL); var->value = allocate_value (builtin_type_void); + var->endian = TARGET_BYTE_ORDER; release_value (var->value); var->next = internalvars; internalvars = var; @@ -765,12 +766,46 @@ struct value * value_of_internalvar (struct internalvar *var) { struct value *val; + int i, j; + gdb_byte temp; val = value_copy (var->value); if (value_lazy (val)) value_fetch_lazy (val); VALUE_LVAL (val) = lval_internalvar; VALUE_INTERNALVAR (val) = var; + + /* Values are always stored in the target's byte order. When connected to a + target this will most likely always be correct, so there's normally no + need to worry about it. + + However, internal variables can be set up before the target endian is + known and so may become out of date. Fix it up before anybody sees. + + Internal variables usually hold simple scalar values, and we can + correct those. More complex values (e.g. structures and floating + point types) are left alone, because they would be too complicated + to correct. */ + + if (var->endian != TARGET_BYTE_ORDER) + { + gdb_byte *array = value_contents_raw (val); + struct type *type = check_typedef (value_enclosing_type (val)); + switch (TYPE_CODE (type)) + { + case TYPE_CODE_INT: + case TYPE_CODE_PTR: + /* Reverse the bytes. */ + for (i = 0, j = TYPE_LENGTH (type) - 1; i < j; i++, j--) + { + temp = array[j]; + array[j] = array[i]; + array[i] = temp; + } + break; + } + } + return val; } @@ -809,6 +844,7 @@ set_internalvar (struct internalvar *var long. */ xfree (var->value); var->value = newval; + var->endian = TARGET_BYTE_ORDER; release_value (newval); /* End code which must not call error(). */ } @@ -877,7 +913,8 @@ show_convenience (char *ignore, int from varseen = 1; } printf_filtered (("$%s = "), var->name); - value_print (var->value, gdb_stdout, 0, Val_pretty_default); + value_print (value_of_internalvar (var), gdb_stdout, + 0, Val_pretty_default); printf_filtered (("\n")); } if (!varseen) Index: src/gdb/value.h =================================================================== --- src.orig/gdb/value.h 2006-02-01 23:14:10.000000000 +0000 +++ src/gdb/value.h 2006-03-30 11:17:29.000000000 +0100 @@ -245,6 +245,7 @@ struct internalvar struct internalvar *next; char *name; struct value *value; + int endian; }; --------------050101070700090702090604--