# Copyright 2002-2013 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 <http://www.gnu.org/licenses/>.

# Regression test for PR11557.  Make sure we don't end up with a stale
# register cache just after resuming a thread.

if { ![support_displaced_stepping] } { 
    unsupported "displaced stepping"
    return -1
}

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if {[mi_gdb_start]} {
    continue
}

proc mi_nonstop_resume { command test } {
    if { [mi_send_resuming_command $command $test] != 0 } {
	# If a resume fails, assume non-stop is broken or unsupported
	# for this target.  We have logged a FAIL or UNSUPPORTED; skip
	# the remaining tests to limit timeouts.
	return -code continue
    }
}

#
# Start here
#
standard_testfile ns-stale-regcache.c

set options [list debug]
if {[gdb_compile "$srcdir/$subdir/$srcfile" \
	 $binfile executable $options] != "" } {
    return -1
}

mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load $binfile

mi_gdb_test "-gdb-set non-stop 1" ".*"
mi_gdb_test "-gdb-set target-async 1" ".*"
mi_detect_async

if { [mi_run_to_main] < 0 } {
    continue
}

# Check that register and stack info don't end up stale after resuming
# a thread.
mi_nonstop_resume "exec-continue" "resume thread"

mi_gdb_test "-data-evaluate-expression \$pc" \
    "\\^error,msg=\".*\"" "no stale register cache of resumed thread"

mi_gdb_test "-stack-info-frame" \
    "\\^error,msg=\".*\"" "no stale frame info of resumed thread"

# Check that the thread is still running.  If the above tests passed,
# we want it to be for the right reasons.
mi_check_thread_states {"running"} "main thread still running"

mi_gdb_exit
