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

# This file was written by Michael Snyder (msnyder@redhat.com)
# This is a test for the gdb command "info proc"

set ws "\[ \t\]+"

set testfile "break"
set srcfile ${testfile}.c
set srcfile1 ${testfile}1.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } {
     untested info-proc.exp
     return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug nowarnings}] != "" } {
     untested info-proc.exp
     return -1
}

if  { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug nowarnings}] != "" } {
     untested info-proc.exp
     return -1
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_test "help info proc" "Show /proc process information about .*"

gdb_test_multiple "info proc" "info proc without a process" {
    -re "No current process.*$gdb_prompt $" {
	pass "info proc without a process"
    }
    -re "Not supported on this target.*$gdb_prompt $" {
	# info proc command not supported -- nothing to test here.
	unsupported "gdb does not support info proc on this target"
	return -1
    }
}

if { ! [ runto_main ] } then {
    untested info-proc.exp
    return -1
}

gdb_test "info proc" "process ${decimal}.*" "info proc with process"

gdb_test "info proc mapping" \
	".*Mapped address spaces:.*${hex}${ws}${hex}${ws}${hex}${ws}${hex}.*" \
	"info proc mapping"

if {[istarget "*-*-linux*"]} {
    set gcorefile [standard_output_file $testfile.gcore]
    if {[gdb_gcore_cmd $gcorefile "save a core file"]} {
	clean_restart $binfile

	gdb_test "core $gcorefile" "Core was generated by.*" \
	    "core [file tail $gcorefile]"

	gdb_test "info proc mapping" \
	    ".*Mapped address spaces:.*${hex}${ws}${hex}${ws}${hex}${ws}${hex}.*" \
	    "info proc mapping with core file"
    }
}
