From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9918 invoked by alias); 9 Aug 2002 22:07:24 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 9911 invoked from network); 9 Aug 2002 22:07:23 -0000 Received: from unknown (HELO cygnus.com) (205.180.83.203) by sources.redhat.com with SMTP; 9 Aug 2002 22:07:23 -0000 Received: from redhat.com (reddwarf.sfbay.redhat.com [172.16.24.50]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id PAA23088; Fri, 9 Aug 2002 15:04:47 -0700 (PDT) Message-ID: <3D5438A9.5F0FA8A8@redhat.com> Date: Fri, 09 Aug 2002 15:07:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. X-Accept-Language: en MIME-Version: 1.0 To: cagney@redhat.com, gdb-patches@sources.redhat.com Subject: [RFA] Mips, return_value_location, small structs Content-Type: multipart/mixed; boundary="------------E65C7F4895DB07DC3C7CB249" X-SW-Source: 2002-08/txt/msg00223.txt.bz2 This is a multi-part message in MIME format. --------------E65C7F4895DB07DC3C7CB249 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-length: 626 Re-submitted as a separate patch. The problem: small structs returned in one (or two) registers are aligned left in N32/N64 and aligned right in the others (or vice versa, depending on how you cross your eyes). There are two code paths here, one for structs of length < MIPS_REGSIZE, and one for MIPS_REGSIZE < struct len < 2 * MIPS_REGSIZE. The first case I've split into two paths: one for N32 && TYPE_CODE_STRUCT, and a second for everything else (the later being identical to what was there before). In the second case, I've simply let the N32/N64 path fall thru. The next "if" catches it and handles it correctly. --------------E65C7F4895DB07DC3C7CB249 Content-Type: text/plain; charset=us-ascii; name="patch4b.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch4b.diff" Content-length: 2133 2002-08-08 Michael Snyder * mips-tdep.c (return_value_location): Structs returned in registers are aligned differently (n32/64 vs. o32/64). Index: mips-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-tdep.c,v retrieving revision 1.92 diff -c -3 -p -r1.92 mips-tdep.c *** mips-tdep.c 8 Aug 2002 00:26:51 -0000 1.92 --- mips-tdep.c 8 Aug 2002 21:48:09 -0000 *************** return_value_location (struct type *valt *** 3608,3622 **** if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG && len < MIPS_SAVED_REGSIZE) { ! /* "un-left-justify" the value in the low register */ ! lo->reg_offset = MIPS_SAVED_REGSIZE - len; ! lo->len = len; hi->reg_offset = 0; hi->len = 0; } else if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG && len > MIPS_SAVED_REGSIZE /* odd-size structs */ && len < MIPS_SAVED_REGSIZE * 2 && (TYPE_CODE (valtype) == TYPE_CODE_STRUCT || TYPE_CODE (valtype) == TYPE_CODE_UNION)) { --- 3608,3635 ---- if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG && len < MIPS_SAVED_REGSIZE) { ! if ((gdbarch_tdep (current_gdbarch) -> mips_abi == MIPS_ABI_N32 ! || gdbarch_tdep (current_gdbarch) -> mips_abi == MIPS_ABI_N64) ! && (TYPE_CODE (valtype) == TYPE_CODE_STRUCT ! || TYPE_CODE (valtype) == TYPE_CODE_UNION)) ! { ! /* Values are already aligned in the low register. */ ! lo->reg_offset = 0; ! } ! else ! { ! /* "un-left-justify" the value in the low register */ ! lo->reg_offset = MIPS_SAVED_REGSIZE - len; ! } hi->reg_offset = 0; + lo->len = len; hi->len = 0; } else if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG && len > MIPS_SAVED_REGSIZE /* odd-size structs */ && len < MIPS_SAVED_REGSIZE * 2 + && gdbarch_tdep (current_gdbarch) -> mips_abi != MIPS_ABI_N32 + && gdbarch_tdep (current_gdbarch) -> mips_abi != MIPS_ABI_N64 && (TYPE_CODE (valtype) == TYPE_CODE_STRUCT || TYPE_CODE (valtype) == TYPE_CODE_UNION)) { --------------E65C7F4895DB07DC3C7CB249--