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

# This file was written by Fred Fish. (fnf@cygnus.com)


set testfile "scope"
set binfile ${objdir}/${subdir}/${testfile}


if  { [gdb_compile "${srcdir}/${subdir}/scope0.c" "${binfile}0.o" object {debug}] != "" } {
     untested scope.exp
     return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/scope1.c" "${binfile}1.o" object {debug}] != "" } {
     untested scope.exp
     return -1
}

if  { [gdb_compile "${binfile}0.o ${binfile}1.o" ${binfile} executable {debug}] != "" } {
     untested scope.exp
     return -1
}

# Create and source the file that provides information about the compiler
# used to compile the test case.
if [get_compiler_info] {
    return -1
}

# Test locating various things when stopped just inside main, after
# running init0().  To prevent cascading of errors, we report the
# first one and quit.  If all pass, then we print the pass results.

proc test_at_main {} {
    global gdb_prompt
    global decimal
    global det_file
    global srcdir
    global subdir
    global hp_cc_compiler

    # skip past init0.
    # This used to do an extra "next" if the first one didn't get us
    # over the call to init0, to handle calls to __main in the
    # prologue, etc.  But if a breakpoint at main doesn't leave us on
    # the first line of real code in the function, that's a GDB bug.
    gdb_test "next" "$decimal.*foo \\(\\);" "next over init0() in main"

    # Print scope0.c::filelocal, which is 1

    if [gdb_test "print filelocal" "\\\$$decimal = 1" "print filelocal" ] { 
      gdb_suppress_tests ; 
    }


    if [gdb_test "print 'scope0.c'::filelocal" "\\\$$decimal = 1" "print 'scope0.c'::filelocal at main"  "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal"] { 
      gdb_suppress_tests ; 
    }


    # Print scope0.c::filelocal_bss, which is 101

    if [gdb_test "print filelocal_bss" "\\\$$decimal = 101" "print filelocal_bss" ] { 
      gdb_suppress_tests ; 
    }


    if [gdb_test "print 'scope0.c'::filelocal_bss" "\\\$$decimal = 101" "print 'scope0.c'::filelocal_bss in test_at_main"  "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_bss"] { 
      gdb_suppress_tests ; 
    }


    # Print scope0.c::filelocal_ro, which is 201

    # No clue why the rs6000 fails this test.
    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print filelocal_ro" "\\\$$decimal = 201" "print filelocal_ro in test_at_main" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope0.c'::filelocal_ro" "\\\$$decimal = 201" "print 'scope0.c'::filelocal_ro"  "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_ro"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::filelocal, which is 2

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::filelocal" "\\\$$decimal = 2" "print 'scope1.c'::filelocal"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::filelocal_bss, which is 102

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::filelocal_bss" "\\\$$decimal = 102" "print 'scope1.c'::filelocal_bss"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_bss"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::filelocal_ro, which is 202

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if {$hp_cc_compiler} then { setup_xfail "hppa2.0w-*-*" 11747CLLbs}
    if [gdb_test "print 'scope1.c'::filelocal_ro" "\\\$$decimal = 202" "print 'scope1.c'::filelocal_ro"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_ro"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::foo::funclocal, which is 3

    if [gdb_test "print foo::funclocal" "\\\$$decimal = 3" "print foo::funclocal" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::foo::funclocal" "\\\$$decimal = 3" "print 'scope1.c'::foo::funclocal"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::foo::funclocal_ro, which is 203

    if [gdb_test "print foo::funclocal_ro" "\\\$$decimal = 203" "print foo::funclocal_ro" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::foo::funclocal_ro" "\\\$$decimal = 203" "print 'scope1.c'::foo::funclocal_ro"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_ro"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::bar::funclocal, which is 4

    if [gdb_test "print bar::funclocal" "\\\$$decimal = 4" "print bar::funclocal" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::bar::funclocal" "\\\$$decimal = 4" "print 'scope1.c'::bar::funclocal"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::bar::funclocal"] { 
      gdb_suppress_tests ; 
    }
    gdb_stop_suppressing_tests;

}

proc test_at_foo {} {
    global gdb_prompt
    global decimal
    global det_file
    global srcdir
    global subdir

    if [gdb_test "next" ".*bar \\(\\);" "" ] { 
      gdb_suppress_tests ; 
    }


    # Print scope0.c::filelocal, which is 1

    if [gdb_test "print 'scope0.c'::filelocal" "\\\$$decimal = 1" "print 'scope0.c'::filelocal at foo"  "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal"] { 
      gdb_suppress_tests ; 
    }


    # Print scope0.c::filelocal_bss, which is 101

    if [gdb_test "print 'scope0.c'::filelocal_bss" "\\\$$decimal = 101" "print 'scope0.c'::filelocal_bss in test_at_foo"  "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_bss"] { 
      gdb_suppress_tests ; 
    }


    # Print scope0.c::filelocal_ro, which is 201

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope0.c'::filelocal_ro" "\\\$$decimal = 201" "print 'scope0.c'::filelocal_ro"  "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_ro"] { 
      gdb_suppress_tests ; 
    }


    gdb_test "print filelocal" "\\\$$decimal = 2" "print filelocal at foo"

    # Print scope1.c::filelocal, which is 2

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::filelocal" "\\\$$decimal = 2" "print 'scope1.c'::filelocal at foo"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal"] { 
      gdb_suppress_tests ; 
    }


    gdb_test "print filelocal_bss" "\\\$$decimal = 102" \
	"print filelocal_bss at foo"

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    gdb_test "print 'scope1.c'::filelocal_bss" "\\\$$decimal = 102" "print 'scope1.c'::filelocal_bss at foo"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_bss"


    gdb_test "print filelocal_ro" "\\\$$decimal = 202" \
	"print filelocal_ro at foo"

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    gdb_test "print 'scope1.c'::filelocal_ro" "\\\$$decimal = 202" "print 'scope1.c'::filelocal_ro at foo"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_ro"


    # Print scope1.c::foo::funclocal, which is 3

    gdb_test "print funclocal" "\\\$$decimal = 3" "print funclocal at foo"

    gdb_test "print foo::funclocal" "\\\$$decimal = 3" \
	"print foo::funclocal at foo"

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    gdb_test "print 'scope1.c'::foo::funclocal" "\\\$$decimal = 3" "print 'scope1.c'::foo::funclocal at foo"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal"


    # Print scope1.c::foo::funclocal_bss, which is 103

    gdb_test "print funclocal_bss" "\\\$$decimal = 103" \
	"print funclocal_bss at foo"

    gdb_test "print foo::funclocal_bss" "\\\$$decimal = 103" \
	"print foo::funclocal_bss at foo"

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    gdb_test "print 'scope1.c'::foo::funclocal_bss" "\\\$$decimal = 103" "print 'scope1.c'::foo::funclocal_bss at foo"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_bss"


    # Print scope1.c::foo::funclocal_ro, which is 203

    gdb_test "print funclocal_ro" "\\\$$decimal = 203" \
	"print funclocal_ro at foo"

    gdb_test "print foo::funclocal_ro" "\\\$$decimal = 203" \
	"print foo::funclocal_ro at foo"

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    gdb_test "print 'scope1.c'::foo::funclocal_ro" "\\\$$decimal = 203" "print 'scope1.c'::foo::funclocal_ro at foo"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_ro"


    # Print scope1.c::bar::funclocal, which is 4

    gdb_test "print bar::funclocal" "\\\$$decimal = 4" \
	"print bar::funclocal at foo"

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    gdb_test "print 'scope1.c'::bar::funclocal" "\\\$$decimal = 4" "print 'scope1.c'::bar::funclocal at foo"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::bar::funclocal"
    gdb_stop_suppressing_tests;

}

proc test_at_bar {} {
    global gdb_prompt
    global decimal
    global det_file
    global srcdir
    global subdir

    if [gdb_test "next" ".*" "" ] { 
      gdb_suppress_tests ; 
    }


    # Print scope0.c::filelocal, which is 1

    if [gdb_test "print 'scope0.c'::filelocal" "\\\$$decimal = 1" "print 'scope0.c'::filelocal at bar"  "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal"] { 
      gdb_suppress_tests ; 
    }


   # Print scope0.c::filelocal_bss, which is 101

    if [gdb_test "print 'scope0.c'::filelocal_bss" "\\\$$decimal = 101" "print 'scope0.c'::filelocal_bss in test_at_bar"  "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_bss"] { 
      gdb_suppress_tests ; 
    }


   # Print scope0.c::filelocal_ro, which is 201

    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope0.c'::filelocal_ro" "\\\$$decimal = 201" "print 'scope0.c'::filelocal_ro at bar"  "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_ro"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::filelocal, which is 2

    if [gdb_test "print filelocal" "\\\$$decimal = 2" "print filelocal at bar" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::filelocal" "\\\$$decimal = 2" "print 'scope1.c'::filelocal at bar"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::filelocal_bss, which is 102

    if [gdb_test "print filelocal_bss" "\\\$$decimal = 102" "print filelocal_bss at bar" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::filelocal_bss" "\\\$$decimal = 102" "print 'scope1.c'::filelocal_bss at bar"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_bss"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::filelocal_ro, which is 202

    if [gdb_test "print filelocal_ro" "\\\$$decimal = 202" "print filelocal_ro in test_at_bar" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::filelocal_ro" "\\\$$decimal = 202" "print 'scope1.c'::filelocal_ro at bar"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_ro"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::foo::funclocal, which is 3

    if [gdb_test "print foo::funclocal" "\\\$$decimal = 3" "print foo::funclocal at bar" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::foo::funclocal" "\\\$$decimal = 3" "print 'scope1.c'::foo::funclocal at bar"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::foo::funclocal_bss, which is 103

    if [gdb_test "print foo::funclocal_bss" "\\\$$decimal = 103" "print foo::funclocal_bss at bar" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::foo::funclocal_bss" "\\\$$decimal = 103" "print 'scope1.c'::foo::funclocal_bss at bar"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_bss"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::foo::funclocal_ro, which is 203

    if [gdb_test "print foo::funclocal_ro" "\\\$$decimal = 203" "print foo::funclocal_ro at bar" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::foo::funclocal_ro" "\\\$$decimal = 203" "print 'scope1.c'::foo::funclocal_ro at bar"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_ro"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::bar::funclocal, which is 4

    if [gdb_test "print funclocal" "\\\$$decimal = 4" "print funclocal at bar" ] { 
      gdb_suppress_tests ; 
    }


    if [gdb_test "print bar::funclocal" "\\\$$decimal = 4" "print bar::funclocal at bar" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::bar::funclocal" "\\\$$decimal = 4" "print 'scope1.c'::bar::funclocal at bar"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::bar::funclocal"] { 
      gdb_suppress_tests ; 
    }


    # Print scope1.c::bar::funclocal_bss, which is 104

    if [gdb_test "print funclocal_bss" "\\\$$decimal = 104" "print funclocal_bss at bar" ] { 
      gdb_suppress_tests ; 
    }


    if [gdb_test "print bar::funclocal_bss" "\\\$$decimal = 104" "print bar::funclocal_bss at bar" ] { 
      gdb_suppress_tests ; 
    }


    if { [test_compiler_info gcc-*-*] } then { setup_xfail "rs6000-*-*" }
    if [gdb_test "print 'scope1.c'::bar::funclocal_bss" "\\\$$decimal = 104" "print 'scope1.c'::bar::funclocal_bss at bar"  "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::bar::funclocal_bss"] { 
      gdb_suppress_tests ; 
    }
    gdb_stop_suppressing_tests;

}

# This test has little to do with local scopes, but it is in scope.exp anyway.
# That's life.

proc test_at_autovars {} {
    global gdb_prompt
    global decimal
    global hex
    global srcfile

    # Test symbol table lookup with 100 local (auto) variables.

    gdb_breakpoint marker1

    if [gdb_test "cont" "Break.* marker1 \\(\\) at .*:$decimal.*" "continue to marker1"] {
	gdb_suppress_tests;
    }

    if [gdb_test "up" ".*autovars.*" "up from marker1 in scope.exp" ] { 
	gdb_suppress_tests ; 
    }

    set count 0
    while {$count < 100} {
	if [gdb_test "print i$count" ".* = $count" "" ] { 
	  gdb_suppress_tests ; 
	}

	set count [expr $count+1]
    }
    clear_xfail "*-*-*"
    pass "$count auto variables correctly initialized"

    # Test that block variable sorting is not screwing us.
    gdb_test "frame" "#.*autovars \\(bcd=5, abc=6\\).*" "args in correct order"
}

proc test_at_localscopes {} {
    global gdb_prompt
    global decimal
    global hex
    global srcfile

    gdb_breakpoint marker2
    gdb_breakpoint marker3
    gdb_breakpoint marker4

    if [gdb_test "cont" "Break.* marker2 \\(\\) at .*:$decimal.*" "continue to marker2"] {
	gdb_suppress_tests;
    }
    if [gdb_test "up" ".*localscopes.*" "up from marker2 in scopes.exp" ] { 
	gdb_suppress_tests ; 
    }

    # Should be at first (outermost) scope.  Check values.

    gdb_test "print localval" " = 10" "print localval, outer scope"
    gdb_test "print localval1" " = 11" "print localval1, outer scope"
    gdb_test "print localval2" "No symbol \"localval2\" in current context." \
	"print localval2, outer scope"
    gdb_test "print localval3" "No symbol \"localval3\" in current context." \
	"print localval3, outer scope"

    if [gdb_test "cont" "Break.* marker3 \\(\\) at .*:$decimal.*" \
	"continue to marker3 in scope.exp"] then { gdb_suppress_tests }
    if [gdb_test "up" ".*localscopes.*" "up from marker3 in scope.exp"] { 
	gdb_suppress_tests 
    }

    # Should be at next (first nested) scope.  Check values.

    gdb_test "print localval" " = 20" \
	"print localval, first nested scope"
    gdb_test "print localval1" " = 11" "print localval1, first nested scope"
    gdb_test "print localval2" " = 12" "print localval2, first nested scope"
    gdb_test "print localval3" "No symbol \"localval3\" in current context." \
	"print localval3, first nested scope"

    # This test will only fail if the file was compiled by gcc, but
    # there's no way to check that.
    if [gdb_test "cont" "Break.* marker4.*at .*:$decimal.*" \
	"continue to marker4 in scope.exp"] then { gdb_suppress_tests }
    if [gdb_test "up" ".*localscopes.*" "up from marker4 in scope.exp"] {
	gdb_suppress_tests 
    }

    gdb_test "print localval" " = 30" "print localval, innermost scope"
    gdb_test "print localval1" " = 11" "print localval1, innermost scope"
    gdb_test "print localval2" " = 12" "print localval2, innermost scope"
    gdb_test "print localval3" " = 13" "print localval3, innermost scope"
    gdb_stop_suppressing_tests;
}

# Start with a fresh gdb.

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

if [istarget "*-*-vxworks*"] {
    set timeout 120
    verbose "Timeout is now $timeout seconds" 2
}

# Test that variables in various segments print out correctly before
# the program is run.  

# AIX--sections get mapped to the same address so we can't get the right one.
setup_xfail "rs6000-*-*"

gdb_test "print 'scope0.c'::filelocal_ro" "= 201"

# gdb currently cannot access bss memory on some targets if the inferior
# is not running.
#
# For PA boards using monitor/remote-pa.c, the bss test is going to 
# randomly fail.  We've already put remote-pa on the target stack,
# so we actually read memory from the board.  Problem is crt0.o
# is responsible for clearing bss and that hasnt' happened yet.
#
# This is a problem for all non-native targets. -- manson
if [is_remote target] {
    unsupported "print 'scope0.c'::filelocal_bss before run"
} else {
    gdb_test "print 'scope0.c'::filelocal_bss" "= 0" \
	"print 'scope0.c'::filelocal_bss before run"
}

gdb_test "print 'scope0.c'::filelocal" "= 1" \
    "print 'scope0.c'::filelocal before run"

if [runto_main] then { test_at_main }
if [runto foo] then { test_at_foo }
if [runto bar] then { test_at_bar }
if [runto localscopes] then { test_at_localscopes }
if [runto autovars] then { test_at_autovars }

if [istarget "*-*-vxworks*"] {
    set timeout 120
    verbose "Timeout is now $timeout seconds" 2
}
