# Copyright 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
# 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
#
set testfile "ns-stale-regcache"
set srcfile "$testfile.c"
set binfile "$objdir/$subdir/mi-$testfile"

set options [list debug incdir=$objdir]
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
