# Copyright 2002-2021 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 {
    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"
    }
}
