# Copyright (C) 2010-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 inferior can stop at its very first instruction, usually "_start".
# Dynamic executables have first instruction in ld.so.

# If we're using a stub, we'll already be debugging a live program and
# stopped at the entry point when we connect, and so the runto below
# will issue a "continue", which always skips any breakpoint at PC.
# When testing with a native target (or some other target that supports
# "run"), runto will do a "run", which first creates the process,
# leaving the PC at the entry point, just like the stub case, but then
# continues the process with the equivalent of "jump *$PC", which
# triggers any breakpoint at $PC.  The latter is what we want to test.

standard_testfile start.c

if [use_gdb_stub] {
    untested "skipping tests due to use_gdb_stub"
    return
}

if { [prepare_for_testing "failed to prepare" ${testfile} $srcfile {additional_flags=-static}] } {
    return -1
}

set test "info files"
set entry ""
gdb_test_multiple $test $test {
    -re "\r\n\[\t \]*Entry point:\[\t \]*(0x\[0-9a-f\]+)\r\n.*$gdb_prompt $" {
	set entry $expect_out(1,string)
	pass $test
    }
}
if {$entry == ""} {
    untested "no entrypoint"
    return
}

if {[istarget powerpc64-*] && [is_lp64_target]} {
    set test "convert entry point"
    gdb_test_multiple "p *(void(*)(void) *) $entry" $test {
	-re " =( \\(\[^0-9\]*\\))? (0x\[0-9a-f\]+)( <.*)?\r\n$gdb_prompt $" {
	    set entry $expect_out(2,string)
	    pass $test
	}
    }
}

if ![runto "*$entry"] {
    return
}
gdb_test {p/x $pc} " = $entry"

gdb_breakpoint "main"
gdb_continue_to_breakpoint "main" "\\.?main.*"
