From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14256 invoked by alias); 22 Aug 2002 02:04:50 -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 14249 invoked from network); 22 Aug 2002 02:04:49 -0000 Received: from unknown (HELO cygnus.com) (205.180.83.203) by sources.redhat.com with SMTP; 22 Aug 2002 02:04:49 -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 SAA22564; Wed, 21 Aug 2002 18:59:09 -0700 (PDT) Message-ID: <3D6442DF.6B0F6120@redhat.com> Date: Wed, 21 Aug 2002 19:04:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. X-Accept-Language: en MIME-Version: 1.0 To: Daniel Jacobowitz CC: gdb-patches@sources.redhat.com, kevinb@redhat.com, cagney@redhat.com Subject: Re: [RFC] fixing extract_struct_value_address References: <3D6418C5.FBF117D@redhat.com> <20020822013255.GA18169@nevyn.them.org> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2002-08/txt/msg00678.txt.bz2 Daniel Jacobowitz wrote: > > On Wed, Aug 21, 2002 at 03:48:37PM -0700, Michael Snyder wrote: > > Problem: Find a function's return value when it is a struct > > returned by reference (thru a pointer). > > > > 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? > > Sharing the solution to this across targets would be a good step > forward - I just had to use the same hack for another port. You want > to be careful of functions which don't return (either GDB is activated > inside the called function and the expression is never finished, or we > longjmp out, or something...) but I believe there's somewhere that > already tries to figure these things out... I've a sample implementation which I've now tested on four targets. I'll post it tomorrow, after a little more testing.