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

load_lib dwarf.exp

set test "clztest"

# This test can only be run on targets which support DWARF-2 and use gas.
if ![dwarf2_support] {
    return 0  
}

# This test can only be run on x86-64 targets.
if {![istarget x86_64-*] || ![is_lp64_target]} {
    return 0
}

if { [prepare_for_testing "${test}.exp" "${test}" ${test}.S {nodebug additional_flags=-nostdlib}] } {
    return -1
}

if ![runto_main] {
    return -1
}

# Initialize tests to be an empty array.
unset -nocomplain tests
array set tests {}

proc gdb-test {line var value} {
    global tests

    lappend tests($line) [list $var $value 0]
}

proc xfail-gdb-test {line var value} {
    global tests

    lappend tests($line) [list $var $value 1]
}

proc scan_gdb_tests {} {
    global srcdir subdir test

    set file "$srcdir/$subdir/$test.c"

    set fd [open "$file"]
    while {![eof $fd]} {
	set line [gets $fd]
	if {! [regexp "\{ (gdb-test .+) \} \}" $line ignore test_cmd]} {
	    continue
	}

	eval $test_cmd
    }
    close $fd
}

scan_gdb_tests

foreach line [lsort [array names tests]] {
    gdb_test "break ${test}.c:$line" "Breakpoint .*" \
	"set breakpoint at ${test}.c:$line"
    gdb_continue_to_breakpoint "continue to ${test}.c:$line"

    foreach testvec $tests($line) {
	set var [lindex $testvec 0]
	set value [lindex $testvec 1]
	set should_xfail [lindex $testvec 2]

	if {$should_xfail} {
	    setup_xfail *-*-*
	}

	gdb_test "print $var" \
	    " = $value" \
	    "check value of $var at ${test}.c:$line"
    }
}
