Re: [RFA] dummy frame handling cleanup, plus inferior fun call signal handling improvement

Doug Evans
2009-01-07T16:36:48Z

On Tue, Jan 6, 2009 at 10:52 PM, Doug Evans <dje@google.com> wrote:
> Hi.
> This version of the patch applies various suggestions to date.
> [Modulo changes to stop_pc handling. A patch to change
> stop_pc handling can trivially be updated to handle this patch.
> This patch handles stop_pc as it exists in the tree today.
> OTOH, Pedro, if your patch to change stop_pc handling is going in
> soon this can wait ... but I wouldn't mind reaching closure on this
> patch ... if that's ok with you of course.]
>
> Note that proceed() is now called inside TRY_CATCH.
>
> Ulrich suggested making the error messages more consistent.
> I like it but after having gone through the exercise I have a question:
> There are two MI testcases that check the precise wording, do we have to worry
> about frontends that check the wording?
> Maybe changes to the wording can be defered to a later patch?
>
> This also adds a few more testcases.
>
> Ok to check in?
>
> 2009-01-06 Doug Evans <dje@google.com>
>
> * dummy-frame.c (dummy_frame): Replace regcache member with
> caller_state.
> (dummy_frame_push): Replace caller_regcache arg with caller_state.
> Return pointer to created dummy frame. All callers updated.
> (remove_dummy_frame,do_dummy_frame_cleanup,pop_dummy_frame_from_ptr,
> lookup_dummy,lookup_dummy_id,dummy_frame_discard): New fns.
> (dummy_frame_pop): Rewrite. Verify requested frame is in the
> dummy frame stack. Restore program state.
> (cleanup_dummy_frames): Rewrite.
> (dummy_frame_sniffer): Update. Make static.
> * dummy-frame.h (regcache): Delete forward decl.
> (inferior_thread_state,dummy_frame): Add forward decls.
> (dummy_frame_push): Update prototype.
> (dummy_frame_discard): Declare.
> * frame.c (frame_pop): dummy_frame_pop now does all the work for
> DUMMY_FRAMEs.
> * infcall.c (breakpoint_auto_delete_contents): Delete.
> (get_function_name,run_inferior_call): New fns.
> (call_function_by_hand): Simplify by moving some code to
> get_function_name, run_inferior_call. Inferior function call wrapped
> in TRY_CATCH so there's less need for cleanups and all exits from
> proceed are handled similarily. Detect program exit.
> Detect program stopping in a different thread.
> Make error messages more consistent.
> * inferior.h (inferior_thread_state): Declare (opaque type).
> (save_inferior_thread_state,restore_inferior_thread_state,
> make_cleanup_restore_inferior_thread_state,
> discard_inferior_thread_state, get_inferior_thread_state_regcache):
> Declare.
> (save_inferior_status): Update prototype.
> * infrun.c: #include "dummy-frame.h"
> (normal_stop): When stopped for the completion of an inferior function
> call, verify the expected stack frame kind.
> (inferior_thread_state): New struct.
> (save_inferior_thread_state,restore_inferior_thread_state,
> do_restore_inferior_thread_state_cleanup,
> make_cleanup_restore_inferior_thread_state,
> discard_inferior_thread_state,
> get_inferior_thread_state_regcache): New functions.
> (inferior_status): Move stop_signal, stop_pc, registers to
> inferior_thread_state. Remove restore_stack_info.
> (save_inferior_status): Remove arg restore_stack_info.
> All callers updated. Remove saving of state now saved by
> save_inferior_thread_state.
> (restore_inferior_status): Remove restoration of state now done by
> restore_inferior_thread_state.
> (discard_inferior_status): Remove freeing of registers, now done by
> discard_inferior_thread_state.
>
> * gdb.base/break.exp: Update expected gdb output.
> * gdb.base/sepdebug.exp: Ditto.
> * gdb.mi/mi-syn-frame.exp: Ditto.
> * gdb.mi/mi2-syn-frame.exp: Ditto.
>
> * gdb.base/call-signal-resume.exp: New file.
> * gdb.base/call-signals.c: New file.
> * gdb.base/unwindonsignal.exp: New file.
> * gdb.base/unwindonsignal.c: New file.
> * gdb.threads/interrupted-hand-call.exp: New file.
> * gdb.threads/interrupted-hand-call.c: New file.
> * gdb.threads/thread-unwindonsignal.exp: New file.

I also meant to ask another question.
What's the intended handling of unwindonsignal if the program stops in
another thread?
Should the inferior function call in the original thread be unwound?
GDB's current behavior is busted as it pops the dummy frame on the wrong thread.
This patch doesn't unwind the dummy frame (so at least it doesn't
clobber the wrong thread), but I can change it to unwind the dummy
frame of the original thread if you like.