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

# Test multi-exec / multi-process features that work for all configurations,
# even ones that cannot run multiple processes simultaneously.

set testfile "base"

set exec1 "hello"
set srcfile1 ${exec1}.c
set binfile1 [standard_output_file ${exec1}]

set exec2 "hangout"
set srcfile2 ${exec2}.c
set binfile2 [standard_output_file ${exec2}]

set exec3 "goodbye"
set srcfile3 ${exec3}.c
set binfile3 [standard_output_file ${exec3}]

if { [build_executable ${testfile}.exp ${exec1} "${srcfile1}" {debug}] == -1 } {
    return -1
}

if { [build_executable ${testfile}.exp ${exec2} "${srcfile2}" {debug}] == -1} {
    return -1
}

if { [build_executable ${testfile}.exp ${exec3} "${srcfile3}" {debug}] == -1 } {
    return -1
}

clean_restart ${exec1}

gdb_test {print $_inferior} " = 1"

# Add an empty inferior, switch to it, and load a main executable into
# it.
gdb_test "add-inferior" "Added inferior 2.*" "add empty inferior 2"
gdb_test "inferior 2" "Switching to inferior 2.*" "switch to inferior 2"
gdb_test "file ${binfile2}" ".*" "load ${exec2} file in inferior 2"

gdb_test {print $_inferior} " = 2" "print \$_inferior after switching"

# Add a new inferior and load a main executable into it in one
# command.
gdb_test "add-inferior -exec ${binfile3}" \
    "Added inferior 3.*" \
    "add inferior 3 with -exec ${exec3}"

# Check that we have multiple inferiors.

gdb_test "info inferiors" \
    "Executable.*${exec1}.*${exec2}.*${exec3}.*"

# Test info inferiors with args

set see1 0
set see2 0
set see3 0

gdb_test_multiple "info inferior 2 3" "info inferior 2 3" {
    -re ". 1 \[^\r\n\]*${exec1}" {
	set see1 1
	exp_continue
    }
    -re ". 2 \[^\r\n\]*${exec2}" {
	set see2 1
	exp_continue
    }
    -re ". 3 \[^\r\n\]*${exec3}" {
	set see3 1
	exp_continue
    }
    -re "$gdb_prompt $" {
	if { !$see1 && $see2 && $see3 } then {
	    pass "info inferior 2 3"
	} else {
	    fail "info inferior 2 3"
	}
    }
}

set see1 0
set see2 0
set see3 0

gdb_test_multiple "info inferior 1-2" "info inferior 1-2" {
    -re ". 1 \[^\r\n\]*${exec1}" {
	set see1 1
	exp_continue
    }
    -re ". 2 \[^\r\n\]*${exec2}" {
	set see2 1
	exp_continue
    }
    -re ". 3 \[^\r\n\]*${exec3}" {
	set see3 1
	exp_continue
    }
    -re "$gdb_prompt $" {
	if { $see1 && $see2 && !$see3 } then {
	    pass "info inferior 1-2"
	} else {
	    fail "info inferior 1-2"
	}
    }
}

# Test that we have multiple symbol tables.

gdb_test "inferior 1" ".*" "switch to inferior 1"
gdb_test "info functions commonfun" \
    "${srcfile1}.*" \
    "'info functions commonfun' in inferior 1"

gdb_test "inferior 3" ".*" "switch to inferior 3"
gdb_test "info functions commonfun" \
    "${srcfile3}.*" \
    "'info functions commonfun' in inferior 3"

gdb_test "inferior 1" ".*" "switch back to inferior 1"

gdb_test_no_output "set listsize 1"

gdb_test "list commonfun" "from hello.*" "list commonfun in hello"

gdb_test "print hglob" "1"

gdb_test "print glob" "92" "print glob (${exec1})"


gdb_test "inferior 3" ".*" "switch to inferior 3 to print globals"

gdb_test "print gglob" "2"

gdb_test "print glob" "45" "print glob (${exec3})"

gdb_test "list commonfun" "from goodbye.*" "list commonfun in goodbye"


# Let's run the hello program.
gdb_test "inferior 1" ".*" "switch to inferior 1 to run it"

if { ![runto_main] } then {
    return -1
}

gdb_test "break hello" ".*"
gdb_test "continue" "Breakpoint \[0-9\].*, hello.*"

# Now let's remove the other two

gdb_test_no_output "remove-inferiors 2-3" "remove-inferiors 2-3"

set see1 0
set see2 0
set see3 0

gdb_test_multiple "info inferiors" "check remove-inferiors" {
    -re ". 3 \[^\r\n\]*${exec3}" {
	set see3 1
	exp_continue
    }
    -re ". 2 \[^\r\n\]*${exec2}" {
	set see2 1
	exp_continue
    }
    -re ". 1 \[^\r\n\]*${exec1}" {
	set see1 1
	exp_continue
    }
    -re "$gdb_prompt $" {
	if { $see1 && !$see2 && !$see3 } then {
	    pass "check remove-inferiors"
	} else {
	    fail "check remove-inferiors"
	}
    }
}

