This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFA: report failure to restore selected frame, but continue


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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]