# Copyright 2009-2012 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 "multi-arch"

# The plain remote target can't do multiple inferiors.
if [target_info exists use_gdb_stub] {
    return
}

# Can't use standard_testfile, we want executables with specialized
# names.
set exec1 "ma-hello"
set srcfile1 hello.c
set binfile1 [standard_output_file ${exec1}]

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

# Build two executables, one for each arch.

if [istarget "s390*-*-*"] {
    set march1 "-m64"
    set march2 "-m31"
} else {
    set march1 "-m64"
    set march2 "-m32"
}

if { [prepare_for_testing ${testfile}.exp ${exec1} "${srcfile1}" \
	  [list debug nowarnings additional_flags=${march1}]] } {
    return -1
}

if { [prepare_for_testing ${testfile}.exp ${exec2} "${srcfile2}" \
	  [list debug nowarnings additional_flags=${march2}]] } {
    return -1
}

# Start inferior 1

clean_restart ${exec1}
if ![runto_main] then {
    fail "starting inferior 1"
}

# Add and start inferior 2

gdb_test "add-inferior" "Added inferior 2.*" "add empty inferior 2"
gdb_test "inferior 2" "Switching to inferior 2.*" "switch to inferior 2"
gdb_load ${binfile2}

if ![runto_main] then {
    fail "starting inferior 2"
}

# Check we do have two inferiors loaded.

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