From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10200 invoked by alias); 22 Aug 2002 15:15:44 -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 10193 invoked from network); 22 Aug 2002 15:15:42 -0000 Received: from unknown (HELO localhost.redhat.com) (216.138.202.10) by sources.redhat.com with SMTP; 22 Aug 2002 15:15:42 -0000 Received: from ges.redhat.com (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 89DDA3EB6; Thu, 22 Aug 2002 11:15:40 -0400 (EDT) Message-ID: <3D65001C.70609@ges.redhat.com> Date: Thu, 22 Aug 2002 08:38:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.0) Gecko/20020810 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Michael Snyder Cc: gdb-patches@sources.redhat.com, kevinb@redhat.com, cagney@redhat.com, Elena Zannoni Subject: Re: [RFC] fixing extract_struct_value_address References: <3D6418C5.FBF117D@redhat.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2002-08/txt/msg00689.txt.bz2 > Problem: Find a function's return value when it is a struct > returned by reference (thru a pointer). Hmm, As far as I know, there are two cases: 1. a normal function forced to return: (gdb) break foo (gdb) finish 2. an inferior function call: (gdb) print foo() I don't think the first case has a solution (unless the debug info steps forward with the answer we need). For the latter case, the inferior function code contains: /* Figure out the value returned by the function. */ /* elz: I defined this new macro for the hppa architecture only. this gives us a way to get the value returned by the function from the stack, at the same address we told the function to put it. We cannot assume on the pa that r28 still contains the address of the returned structure. Usually this will be overwritten by the callee. I don't know about other architectures, so I defined this macro */ #ifdef VALUE_RETURNED_FROM_STACK if (struct_return) { do_cleanups (retbuf_cleanup); return VALUE_RETURNED_FROM_STACK (value_type, struct_addr); } #endif { struct value *retval = value_being_returned (value_type, retbuf, struct_return); do_cleanups (retbuf_cleanup); return retval; } } I get the feeling that all that is needed is for the above to be enabled for all targets. enjoy, Andrew > Solution level one: Take the value of the register that was > used by the caller to pass the struct return address. > > Shortcoming: that register isn't preserved, so may be clobbered. > > Solution level two: Save the struct_return address when it > is passed to store_struct_return (or push_arguments), and > recover it when it is needed by extract_struct_value_address. > > Shortcoming: Not reentrant. Nested function calls will clobber it. > > Proposed solution: create a stack structure, and "push" the > struct_return address in store_struct_return, popping it in > extract_return_address. If you can't find it on the stack, > then use the value of the appropriate arg0 register. > > I think this should work for most targets, so the code for > managing the stack can be shared. > > What do you think? >