diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dd4b2eb26a..3d2a4dc27d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2014-07-14 Pedro Alves + + * infcall.c (run_inferior_call): Set 'sync_execution' while + running the inferior call. + 2014-07-14 Pedro Alves * value.c (value_contents_equal): Delete function. diff --git a/gdb/infcall.c b/gdb/infcall.c index 52f06128fa..a9b1ceb89f 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -388,6 +388,11 @@ run_inferior_call (struct thread_info *call_thread, CORE_ADDR real_pc) volatile struct gdb_exception e; int saved_in_infcall = call_thread->control.in_infcall; ptid_t call_thread_ptid = call_thread->ptid; + int saved_sync_execution = sync_execution; + + /* Infcalls run synchronously, in the foreground. */ + if (target_can_async_p ()) + sync_execution = 1; call_thread->control.in_infcall = 1; @@ -441,6 +446,8 @@ run_inferior_call (struct thread_info *call_thread, CORE_ADDR real_pc) if (call_thread != NULL) call_thread->control.in_infcall = saved_in_infcall; + sync_execution = saved_sync_execution; + return e; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 85deea5ff3..658892e5f2 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-07-14 Pedro Alves + + * gdb.base/execution-termios.c: New file. + * gdb.base/execution-termios.exp: New file. + 2014-07-14 Tom Tromey * gdb.cp/vla-cxx.cc: New file. diff --git a/gdb/testsuite/gdb.base/execution-termios.c b/gdb/testsuite/gdb.base/execution-termios.c new file mode 100644 index 0000000000..adeb1f1ada --- /dev/null +++ b/gdb/testsuite/gdb.base/execution-termios.c @@ -0,0 +1,35 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include +#include + +int +func (void) +{ + puts ("hello world\n"); + tcdrain (fileno (stdout)); + return 1; +} + +int +main (void) +{ + func (); + return 0; /* set break here */ +} diff --git a/gdb/testsuite/gdb.base/execution-termios.exp b/gdb/testsuite/gdb.base/execution-termios.exp new file mode 100644 index 0000000000..cbdcce678f --- /dev/null +++ b/gdb/testsuite/gdb.base/execution-termios.exp @@ -0,0 +1,60 @@ +# Copyright 2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . */ + +standard_testfile + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { + return -1 +} + +# Run to main, and execute BODY in the caller's context, with PREFIX +# set as test message prefix. + +proc test { prefix body } { + with_test_prefix $prefix { + if ![runto_main] { + fail "Can't run to main" + return 0 + } + uplevel 1 $body + } +} + +# If GDB forgets to put the inferior's terminal settings into effect +# while running any of these commands, the program will get a SIGTTOU. + +test "next" { + gdb_test "next" "set break here.*" "termios ok" +} + +test "infcall" { + if ![target_info exists gdb,cannot_call_functions] { + gdb_test "print func ()" " = 1" "termios ok" + } else { + unsupported "cannot call functions" + } +} + +test "continue" { + set lineno [gdb_get_line_number "set break here"] + gdb_test "break $lineno" + gdb_test "continue" ".*set break here.*" "termios ok" +} + +test "finish" { + gdb_test "break func" "func.*" + gdb_test "continue" "func .*" + gdb_test "finish" " = 1" "termios ok" +}