# Copyright 2002-2020 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\]+"

standard_testfile break.c break1.c

if {[prepare_for_testing "failed to prepare" $testfile \
	 [list $srcfile $srcfile2] {debug nowarnings}]} {
    return -1
}

gdb_test "help info proc" "Show additional information about a process.*"

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
    }
}

# Set command line arguments to be verified later with "info proc
# cmdline".  However, if we're using a stub, then "set args" would not
# have any effect, so then just skip this.

set cmdline ""
if { ! [use_gdb_stub] } {
    set cmdline "-i foo bar -o baz 1234"
    gdb_test_no_output "set args $cmdline" "set args"
}

if { ! [ runto_main ] } then {
    untested "could not run to main"
    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}.*"

if {[istarget "*-*-linux*"]} {
    if { $cmdline != "" } {
	gdb_test "info proc cmdline" "cmdline = '.* $cmdline'"
    }
    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"
    }
}
