From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27726 invoked by alias); 11 Jan 2004 15:58:04 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 27706 invoked from network); 11 Jan 2004 15:58:02 -0000 Received: from unknown (HELO localhost.redhat.com) (65.49.3.48) by sources.redhat.com with SMTP; 11 Jan 2004 15:58:02 -0000 Received: from gnu.org (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 4478E2B8F; Sun, 11 Jan 2004 10:57:57 -0500 (EST) Message-ID: <40017285.8010805@gnu.org> Date: Sun, 11 Jan 2004 15:58:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.2) Gecko/20030820 MIME-Version: 1.0 To: Mark Kettenis Cc: gdb@sources.redhat.com Subject: Re: [RFC] Struct return values References: <200401091622.i09GMRVn000591@elgar.kettenis.dyndns.org> <3FFF0977.3020302@gnu.org> <200401092347.i09Nl6RU000410@elgar.kettenis.dyndns.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2004-01/txt/msg00145.txt.bz2 > > However, it turns out that with 32-bit > > SPARC, we can find out. The SPARC stack frames have a reserved slot > > for this address. Should we allow returning in this case? > > If it's possible to do it robustly ... > > Is that reserved slot still defined after the return instruction has > been executed but before the breakpoint has been hit? Consider the > sequence: > return > > breakpoint at return address > > Yes, the signal handler might touch the register save area at %sp + 0, > but should leave alone the return value address at %sp + 64, and > everything above that address. (sparc stack grows downwards) Ah, what a bizare ABI. > I know of two cases: > > - print_return_value with a tweak round > /* FIXME: 2003-09-27: When returning from a nested inferior function > call, it's possible (with no help from the architecture vector) > to locate and return/print a "struct return" value. This is just > a more complicated case of what is already being done in in the > inferior function call code. In fact, when inferior function > calls are made async, this will likely be made the norm. */ > else if (gdbarch_return_value_p (current_gdbarch)) > The function has already returned so the method would need to take the > callee's frame and return the return value's address. > > I'm not sure I follow you here, but since the return value address > lives at %sp + 64 in the caller's frame, I don't expect any problems. Tipo, caller, not callee. > - return_command where the function hasn't yet returned (both the caller > and callee frame would be available). Previously this case never worked > (I fixed the small structs case)! It would be possible to use call the > same method as for print_return_value (passing the caller's frame). > > Which ever, the doco will need to be really clear that ABI's typically > make this impossible :-/ > > Yes indeed, the 32-bit SPARC ABI is the only case I know of where this > stuff is possible. > > Note that the test needs to ensure that the code storing the return > value in memory is executed. That way the test checks for consistency > between GDB and the compiler, and not GDB and GDB. > > What you could look at is: > -re ".*${gdb_prompt} $" { > if $return_value_unimplemented { > # What a suprize. The architecture hasn't implemented > # return_value, and hence has to fail. > kfail "$test" gdb/1444 > } else { > fail "$test" > } > } > and soften that test a little (however, if the sparc should work in all > cases even that tweak won't be needed). > > OK, but I think the SPARC case has shown that a compiler can simply > generate stupid code that invalidates the assumptions made by the > testsuites on other platforms too. I'd rather see this made conditional on the compiler. I think the current cross check between "finish" and "return" is very important to that test (its one of the reasons why the new test is flushing out so many bugs). Hmm, but then, by fixing the SPARC's struct return case for "return" and "finish", won't the immediate need for this check have been eliminated? For the 32-bit SPARC, that test path should never be reached? Hmm, also, should the final cross check be tweaked, so that for the 32-bit SPARC any unknown value is a failure? enjoy, Andrew