# Copyright 2008-2017 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 "failed to prepare" $testfile \
	 [list $srcfile $srcfile2] {debug additional_flags=-Winline}]} {
    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)"
