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

if { [is_remote target] || ![isnative] } then {
    continue
}

# Until "catch exec" is implemented on other targets...
#
if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then {
    continue
}

set testfile "bkpt-multi-exec"

set exec1 "bkpt-multi-exec"
set srcfile1 ${exec1}.c
set binfile1 [standard_output_file ${exec1}]

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

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

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

# Start with a fresh gdb

clean_restart ${exec1}

# Start the program running, and stop at main.
#
if ![runto_main] then {
    perror "Couldn't run ${binfile1}"
    return
}

delete_breakpoints

# continuing should exec and trigger the bug
gdb_test "continue" "SIGSEGV.*"

# Start over, but this time, set a breakpoint before the app crashes.

clean_restart ${exec1}

gdb_test "add-inferior -exec ${binfile2}" \
    "Added inferior 2.*" \
    "add inferior 2 with -exec ${exec2}"

set bp_location [gdb_get_line_number "set breakpoint here" ${srcfile2}]

gdb_test "inferior 2"
gdb_test "break ${srcfile2}:${bp_location}" ".*"

# Start the program running, and stop at main.
#
gdb_test "inferior 1"

# Now run to the breakpoint.  This should cross the exec, and stop at
# the breakpoint before the crash.
gdb_test "run" "${srcfile2}:${bp_location}.*set breakpoint here.*"

return 0
