# Copyright 2009-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/>.

if [is_remote target] {
    # The test always runs locally.
    return 0
}

standard_testfile .c
if {[build_executable $testfile.exp $testfile $srcfile {debug}] == -1} {
    return -1
}

gdb_exit

# remote_spawn breaks the command on each whitespace despite possible quoting.
# Use backslash-escaped whitespace there instead:

set db_command "--db-command=$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts] %f %p"
regsub -all " " $db_command "\\ " db_command

set test "spawn valgrind"
set cmd "valgrind --db-attach=yes $db_command $binfile"
set res [remote_spawn host $cmd]
if { $res < 0 || $res == "" } {
    verbose -log "Spawning $cmd failed."
    unsupported $test
    return -1
}
pass $test
# Declare GDB now as running.
set gdb_spawn_id -1

# GDB spawned by `valgrind --db-attach=yes' stops already after the startup is
# executed, like with non-extended gdbserver.  It is also not correct to
# run/attach the inferior.
set use_gdb_stub 1

set test "valgrind started"
# The trailing '.' differs for different memcheck versions.
gdb_test_multiple "" $test {
    -re "Memcheck, a memory error detector\\.?\r\n" {
	pass $test
    }
    -re "valgrind: failed to start tool 'memcheck' for platform '.*': No such file or directory" {
	unsupported $test
	return -1
    }
    -re "valgrind: wrong ELF executable class" {
	unsupported $test
	return -1
    }
    -re "command not found" {
	# The spawn succeeded, but then valgrind was not found - e.g. if
	# we spawned SSH to a remote system.
	unsupported $test
	return -1
    }
}

set double_free [gdb_get_line_number "double-free"]

set test "attach to debugger"
gdb_test_multiple "" $test {
    -re "Invalid free\\(\\).*: main \\(${srcfile}:$double_free\\)\r\n.*---- Attach to debugger \\? --- \[^\r\n\]* ---- " {
	send_gdb "y\r"
    }
    -re "---- Attach to debugger \\? --- \[^\r\n\]* ---- " {
	send_gdb "n\r"
	exp_continue
    }
}

gdb_test "" ".*" "eat first prompt"

# Initialization from default_gdb_start.
gdb_test_no_output "set height 0"
gdb_test_no_output "set width 0"

gdb_test "bt" "in main \\(.*\\) at .*${srcfile}:$double_free"

# Explicitly kill the program so it doesn't dump core when we quit->detach.
gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y"
