8980e17 Push thread->control.command_interp to the struct thread_fsm

Authored and Committed by palves 7 years ago
    Push thread->control.command_interp to the struct thread_fsm
    
    I noticed that if we step into an inline function, step_1 never
    reaches proceed, and thus nevers sets the thread's
    tp->control.command_interp.  Because of that,
    should_print_stop_to_console fails to determine that is should print
    stop output to the console.
    
    The fix is to set the thread's command_interp earlier.  However, I
    realized that we can move that field to the thread_fsm, given that its
    lifetime is exactly the same as thread_fsm.  So the patch plumbs all
    fsms constructors to take the command interp and store it in the
    thread_fsm.
    
    We can see the fix in action, with e.g., the gdb.opt/inline-cmds.exp
    test, and issuing a step when stopped at line 67:
    
     &"s\n"
     ^running
     *running,thread-id="all"
     (gdb)
     ~"67\t  result = func2 ();\n"
     *stopped,reason="end-stepping-range",frame={addr="0x00000000004004d0",func="main",args=[],file="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.opt/inline-cmds.c",fullname="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.opt/inline-cmds.c",line="67"},thread-id="1",stopped-threads="all",core="0"
     (gdb)
     s
     &"s\n"
     ^running
     *running,thread-id="all"
     (gdb)
    + ~"func2 () at /home/pedro/gdb/mygit/src/gdb/testsuite/gdb.opt/inline-cmds.c:67\n"
    + ~"67\t  result = func2 ();\n"
     *stopped,reason="end-stepping-range",frame={addr="0x00000000004004d0",func="func2",args=[],file="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.opt/inline-cmds.c",fullname="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.opt/inline-cmds.c",line="67"},thread-id="1",stopped-threads="all",core="0"
     (gdb)
    
    (The inline-cmds.exp command is adjusted to exercise this.)
    
    (Due to the follow_fork change, this also fixes "next N" across a fork
    with "set follow-fork child" with "set detach-on-fork on".  Commands
    that rely on internal breakpoints, like "finish" will still require
    more work to migrate breakpoints etc. to the child thread.)
    
    gdb/ChangeLog:
    2016-06-21  Pedro Alves  <palves@redhat.com>
    
    	* breakpoint.c (new_until_break_fsm): Add 'cmd_interp' parameter.
    	(until_break_fsm_should_stop, until_break_fsm_clean_up): Add
    	thread parameter.
    	(until_break_command): Pass command interpreter to thread fsm
    	ctor.
    	* cli/cli-interp.c (should_print_stop_to_console): Adjust.
    	* gdbthread.h (struct thread_control_state) <command_interp>:
    	Delete field.
    	* infcall.c (new_call_thread_fsm): Add 'cmd_interp' parameter.
    	Pass it down.
    	(call_thread_fsm_should_stop): Add thread parameter.
    	(call_function_by_hand_dummy): Pass command interpreter to thread
    	fsm ctor.  Pass thread pointer to fsm clean up method.
    	* infcmd.c: Include interps.h.
    	(struct step_command_fsm) <thread>: Delete field.
    	(new_step_command_fsm): Add 'cmd_interp' parameter.  Pass it down.
    	(step_command_fsm_prepare): Remove references to fsm's thread
    	field.
    	(step_1): Pass command interpreter to thread
    	fsm ctor.  Pass thread pointer to fsm clean up method.
    	(step_command_fsm_should_stop, step_command_fsm_clean_up): Add
    	thread parameter and use it.
    	(new_until_next_fsm): Add 'cmd_interp' parameter.  Pass it down.
    	(until_next_fsm_should_stop, until_next_fsm_clean_up): Add thread
    	parameter and use it.
    	(until_next_command): Pass command interpreter to thread fsm ctor.
    	(struct finish_command_fsm) <thread>: Delete field.
    	(finish_command_fsm_ops): Add NULL slot for should_notify_stop.
    	(new_finish_command_fsm): Add 'cmd_interp' parameter and pass it
    	down.  Remove thread parameter and adjust.
    	(finish_command_fsm_should_stop, finish_command_fsm_clean_up): Add
    	thread parameter and use it.
    	(finish_command): Pass command interpreter to thread fsm ctor.
    	Don't pass thread.
    	* infrun.c (follow_fork): Move thread fsm to child fork instead of
    	command interpreter, only.
    	(clear_proceed_status_thread): Remove reference to command_interp.
    	(proceed): Don't record the thread's command interpreter.
    	(clean_up_just_stopped_threads_fsms): Pass thread to fsm clean_up
    	method.
    	(fetch_inferior_event): Pass thread to fsm should_stop method.
    	* thread-fsm.c (thread_fsm_ctor): Add 'cmd_interp' parameter.
    	Store it.
    	(thread_fsm_clean_up, thread_fsm_should_stop): Add thread
    	parameter and pass it down.
    	* thread-fsm.h (struct thread_fsm) <command_interp>: New field.
    	(struct thread_fsm_ops) <clean_up, should_stop>: Add thread
    	parameter.
    	(thread_fsm_ctor): Add 'cmd_interp' parameter.
    	(thread_fsm_clean_up, thread_fsm_should_stop): Add thread
    	parameter.
    	* thread.c (thread_cancel_execution_command): Pass thread to
    	thread fsm clean_up method.
    
    gdb/testsuite/ChangeLog:
    2016-06-21  Pedro Alves  <palves@redhat.com>
    
    	* gdb.opt/inline-cmds.c: Add "set mi break here" marker.
    	* gdb.opt/inline-cmds.exp: Add MI tests.
    
        
file modified
+56 -0
file modified
+11 -8
file modified
+3 -4
file modified
+0 -5
file modified
+8 -6
file modified
+36 -38
file modified
+7 -16
file modified
+5 -0
file modified
+7 -5
file modified
+17 -6
file modified
+1 -1