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

set testfile "inline-locals"
set srcfile ${testfile}.c
set srcfile2 "inline-markers.c"
set fullsrcfile "${srcdir}/${subdir}/${srcfile}"
set fullsrcfile2 "${srcdir}/${subdir}/${srcfile2}"
set sources [list ${fullsrcfile} ${fullsrcfile2}]
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile ${sources} ${binfile} \
	   executable {debug optimize=-O2}] != "" } {
    untested inline-locals.exp
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

runto_main

get_compiler_info $binfile
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 = <value 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 = <value 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)"
