From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2417 invoked by alias); 10 Aug 2002 00:13:41 -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 2410 invoked from network); 10 Aug 2002 00:13:40 -0000 Received: from unknown (HELO localhost.redhat.com) (216.138.202.10) by sources.redhat.com with SMTP; 10 Aug 2002 00:13:40 -0000 Received: from ges.redhat.com (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 28AC43D33; Fri, 9 Aug 2002 20:13:38 -0400 (EDT) Message-ID: <3D545AB2.4030803@ges.redhat.com> Date: Fri, 09 Aug 2002 17:13:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.0) Gecko/20020802 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Michael Snyder Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA] Mips, return_value_location, small structs References: <3D5438A9.5F0FA8A8@redhat.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2002-08/txt/msg00226.txt.bz2 > 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). I _think_ you also need to add o32. Can you check that out? Just post the results, not the patch. Andrew > 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. > > > > 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)) > {