# Copyright 2008, 2010-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/>.

standard_testfile .c inline-markers.c

if {[prepare_for_testing $testfile.exp $testfile \
	 [list $srcfile $srcfile2] {debug optimize=-O2}]} {
    return -1
}

runto_main

get_compiler_info
get_debug_format
if { [skip_inline_var_tests] } {
    untested inline-bt.exp
    return
}

set no_frames [skip_inline_frame_tests]

set line1 [gdb_get_line_number "set breakpoint 1 here" ${srcfile2}]
gdb_breakpoint $srcfile2:$line1

gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (1)"

gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (2)"

if { ! $no_frames } {
    gdb_test "backtrace" "#0  bar.*#1  .*func1.*#2  .*main.*" \
	"backtrace from bar (2)"
    gdb_test "up" "#1  .*func1 .* at .*" "up from bar (2)"
    gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (2)"
    gdb_test "info locals" "array = {.*}" "info locals above bar (2)"

    set msg "info args above bar (2)"
    gdb_test_multiple "info args" $msg {
	-re "arg1 = $decimal\r\n$gdb_prompt $" {
	    pass $msg
	}
	-re "arg1 = <optimized out>\r\n$gdb_prompt $" {
	    # GCC 4.3 and later lose location information for arg1.  GCC 4.2 is OK.
	    if { [test_compiler_info "gcc-4-3-*"]  || [test_compiler_info "gcc-4-4-*"]} {
		setup_xfail *-*-*
	    }
	    fail $msg
	}
    }
} else {
    gdb_test "up" "#1  .*main .* at .*" "up from bar (2)"
    gdb_test "info locals" ".*arg1 = 0.*" "info locals above bar (2)"
}

# Make sure that locals on the stack are found.  This is an array to
# prevent it from living in a register.
gdb_test "print array\[0\]" "\\\$$decimal = 0" "print local (2)"

if { ! $no_frames } {
    # Verify that we do not print out variables from the inlined
    # function's caller.
    gdb_test "print val" "No symbol \"val\" in current context\\." \
	"print out of scope local"
}

# Repeat the tests from a depth of two inlined functions, and with a
# more interesting value in the local array.
gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (3)"
if { ! $no_frames } {
    gdb_test "backtrace" "#0  bar.*#1  .*func1.*#2  .*func2.*#3  .*main.*" \
	"backtrace from bar (3)"
    gdb_test "up" "#1  .*func1 .* at .*" "up from bar (3)"
    gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (3)"
    gdb_test "info locals" "array = {.*}" "info locals above bar (3)"

    set msg "info args above bar (3)"
    gdb_test_multiple "info args" $msg {
	-re "arg1 = $decimal\r\n$gdb_prompt $" {
	    pass $msg
	}
	-re "arg1 = <optimized out>\r\n$gdb_prompt $" {
	    # GCC 4.3 and later lose location information for arg1.  GCC 4.2 is OK.
	    if { [test_compiler_info "gcc-4-3-*"]  || [test_compiler_info "gcc-4-4-*"]} {
		setup_xfail *-*-*
	    }
	    fail $msg
	}
    }
} else {
    gdb_test "up" "#1  .*main .* at .*" "up from bar (3)"
    gdb_test "info locals" ".*arg1 = 1.*" "info locals above bar (3a)"
    gdb_test "info locals" ".*arg2 = 184.*" "info locals above bar (3b)"
}

gdb_test "print array\[0\]" "\\\$$decimal = 184" "print local (3)"
