1# Copyright (C) 2010, 2011 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16# Test inferior can stop at its very first instruction, usually "_start".
17# Dynamic executables have first instruction in ld.so.
18
19set testfile break-entry
20if { [prepare_for_testing ${testfile}.exp ${testfile} start.c {additional_flags=-static}] } {
21    return -1
22}
23
24# If we're using a stub, we'll already be debugging a live program and
25# stopped at the entry point when we connect, and so the runto below
26# will issue a "continue", which always skips any breakpoint at PC.
27# When testing with a native target (or some other target that supports
28# "run"), runto will do a "run", which first creates the process,
29# leaving the PC at the entry point, just like the stub case, but then
30# continues the process with the equivalent of "jump *$PC", which
31# triggers any breakpoint at $PC.  The latter is what we want to test.
32
33if [target_info exists use_gdb_stub] {
34    untested ${testfile}.exp
35    return
36}
37
38set test "info files"
39set entry ""
40gdb_test_multiple $test $test {
41    -re "\r\n\[\t \]*Entry point:\[\t \]*(0x\[0-9a-f\]+)\r\n.*$gdb_prompt $" {
42	set entry $expect_out(1,string)
43	pass $test
44    }
45}
46if {$entry == ""} {
47    untested ${testfile}.exp
48    return
49}
50
51if {[istarget powerpc64-*] && [is_lp64_target]} {
52    set test "convert entry point"
53    gdb_test_multiple "p *(void(*)(void) *) $entry" $test {
54	-re " =( \\(\[^0-9\]*\\))? (0x\[0-9a-f\]+)( <.*)?\r\n$gdb_prompt $" {
55	    set entry $expect_out(2,string)
56	    pass $test
57	}
58    }
59}
60
61if ![runto "*$entry"] {
62    return
63}
64gdb_test {p/x $pc} " = $entry"
65
66gdb_breakpoint "main"
67gdb_continue_to_breakpoint "main" "\\.?main.*"
68