From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28681 invoked by alias); 10 Apr 2003 01:55:10 -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 28388 invoked from network); 10 Apr 2003 01:55:08 -0000 Received: from unknown (HELO localhost.redhat.com) (24.157.166.107) by sources.redhat.com with SMTP; 10 Apr 2003 01:55:08 -0000 Received: from redhat.com (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 740192B2F; Wed, 9 Apr 2003 21:54:52 -0400 (EDT) Message-ID: <3E94CEEC.3060302@redhat.com> Date: Thu, 10 Apr 2003 01:55:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.2) Gecko/20030223 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jim Blandy Cc: gdb-patches@sources.redhat.com Subject: Re: RFA: report failure to restore selected frame, but continue References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2003-04/txt/msg00189.txt.bz2 Jim, The opening line should state up front that ``An architecture incorrectly using it's stack pointer as the frame ID's stack address ...''. That way, the specific bug identified by 1155, is made clear from the start. At present it isn't mentioned until the third paragraph. I should also note that frame_id_eq() is ~week from being `fixed'. You may want to drop that part. enjoy, Andrew > + # Suppose an architecture uses the stack pointer as its frame base > + # (that is, the 'base' member of its frame ID). (Ignore functions > + # that use alloca for the moment.) This means that the youngest > + # frame's base is the top of the stack. If that function calls a > + # frameless function, then the caller and callee frames will have > + # identical base addresses. frame_id_eq is supposed to use both the > + # base and pc fields of the ID's to decide whether they're eq, but as > + # of 4-2003 it doesn't, so code like frame_find_by_id can't > + # distinguish between those two frames. > + # > + # This means that, on such architectures, if the marker function we're > + # stopped at in this test is frameless, GDB doesn't properly restore > + # the selected frame after an inferior function call: > + # infrun.c:restore_selected_frame will select the youngest frame (the > + # marker function), not its caller (main). > + # > + # Changing frame_id_eq isn't really a full solution, though. By > + # definition, a frame base is constant over the lifetime of the frame. > + # However, the stack pointer changes as a function's prologue code > + # sets up the stack frame, making it unsuitable for use as a frame > + # base. The address of the inner end of each frame --- furthest from > + # the stack pointer --- would work better here; it remains unchanged > + # through frame allocation, frame teardown, and any alloca'ing that > + # might happen in between. > + # > + # Of course, strictly speaking, that just shifts the problem around: > + # if there's a younger frame sitting on top of a frameless frame, then > + # they'll have identical ID's. But frameless functions can't call > + # other functions directly, at least using the standard ABI --- they > + # have no place to save the return address. Only signal delivery > + # frames and inferior calls can be there, and those have all sorts of > + # other associated magic. > + # > + # Anyway, if GDB fails to restore the selected frame properly after > + # the inferior function call above, all the subsequent tests will > + # fail. We should detect report that failure, but let the marker call > + # finish so that the rest of the tests can run undisturbed.