X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Finfcall.c;h=9e434a9df41e6b299456000a601097d835731cdf;hb=51abb421302bdd86946827727aebc878b5c756e3;hp=8595d9e05853988544501f0d1f7f8caca6f7e320;hpb=a9ff5f12cff6cd06f74ecf387ac5468984c94c6f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/infcall.c b/gdb/infcall.c index 8595d9e058..9e434a9df4 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -1,6 +1,6 @@ /* Perform an inferior function call, for GDB, the GNU debugger. - Copyright (C) 1986-2016 Free Software Foundation, Inc. + Copyright (C) 1986-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -157,10 +157,11 @@ value_arg_coerce (struct gdbarch *gdbarch, struct value *arg, switch (TYPE_CODE (type)) { case TYPE_CODE_REF: + case TYPE_CODE_RVALUE_REF: { struct value *new_value; - if (TYPE_CODE (arg_type) == TYPE_CODE_REF) + if (TYPE_IS_REFERENCE (arg_type)) return value_cast_pointers (type, arg, 0); /* Cast the value to the reference's target type, and then @@ -168,7 +169,7 @@ value_arg_coerce (struct gdbarch *gdbarch, struct value *arg, if the value was not previously in memory - in some cases we should clearly be allowing this, but how? */ new_value = value_cast (TYPE_TARGET_TYPE (type), arg); - new_value = value_ref (new_value); + new_value = value_ref (new_value, TYPE_CODE (type)); return new_value; } case TYPE_CODE_INT: @@ -519,8 +520,6 @@ call_thread_fsm_should_stop (struct thread_fsm *self, if (stop_stack_dummy == STOP_STACK_DUMMY) { - struct cleanup *old_chain; - /* Done. */ thread_fsm_set_finished (self); @@ -530,13 +529,9 @@ call_thread_fsm_should_stop (struct thread_fsm *self, f->return_value = get_call_return_value (&f->return_meta_info); /* Break out of wait_sync_command_done. */ - old_chain = make_cleanup (restore_ui_cleanup, current_ui); - current_ui = f->waiting_ui; + scoped_restore save_ui = make_scoped_restore (¤t_ui, f->waiting_ui); target_terminal_ours (); f->waiting_ui->prompt_state = PROMPT_NEEDED; - - /* This restores the previous UI. */ - do_cleanups (old_chain); } return 1; @@ -584,6 +579,8 @@ run_inferior_call (struct call_thread_fsm *sm, fetch_inferior_event. */ current_ui->async = 0; + delete_file_handler (current_ui->input_fd); + call_thread->control.in_infcall = 1; clear_proceed_status (0); @@ -617,6 +614,10 @@ run_inferior_call (struct call_thread_fsm *sm, state again here. In other cases, stdin will be re-enabled by inferior_event_handler, when an exception is thrown. */ current_ui->prompt_state = saved_prompt_state; + if (current_ui->prompt_state == PROMPT_BLOCKED) + delete_file_handler (current_ui->input_fd); + else + ui_register_input_event_handler (current_ui); current_ui->async = saved_ui_async; /* At this point the current thread may have changed. Refresh @@ -1050,17 +1051,16 @@ call_function_by_hand_dummy (struct value *function, inferior. That way it breaks when it returns. */ { - struct breakpoint *bpt, *longjmp_b; - struct symtab_and_line sal; - - init_sal (&sal); /* initialize to zeroes */ + symtab_and_line sal; sal.pspace = current_program_space; sal.pc = bp_addr; sal.section = find_pc_overlay (sal.pc); + /* Sanity. The exact same SP value is returned by PUSH_DUMMY_CALL, saved as the dummy-frame TOS, and used by dummy_id to form the frame ID's stack address. */ - bpt = set_momentary_breakpoint (gdbarch, sal, dummy_id, bp_call_dummy); + breakpoint *bpt = set_momentary_breakpoint (gdbarch, sal, + dummy_id, bp_call_dummy); /* set_momentary_breakpoint invalidates FRAME. */ frame = NULL; @@ -1068,7 +1068,7 @@ call_function_by_hand_dummy (struct value *function, bpt->disposition = disp_del; gdb_assert (bpt->related_breakpoint == bpt); - longjmp_b = set_longjmp_breakpoint_for_call_dummy (); + breakpoint *longjmp_b = set_longjmp_breakpoint_for_call_dummy (); if (longjmp_b) { /* Link BPT into the chain of LONGJMP_B. */