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


set testfile1 "average"
set testfile2 "sum"
set testfile "dbx-test"
set binfile1 ${objdir}/${subdir}/${testfile1}
set binfile2 ${objdir}/${subdir}/${testfile2}
set binfile ${objdir}/${subdir}/${testfile}



if  { [gdb_compile "${srcdir}/${subdir}/average.c" "${binfile1}.o" object {debug}] != "" } {
     untested dbx.exp
     return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/sum.c" "${binfile2}.o" object {debug}] != "" } {
     untested dbx.exp
     return -1
}

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

#
# start gdb -- start gdb running, default procedure
#
proc dbx_gdb_start { } {
    global verbose
    global GDB
    global INTERNAL_GDBFLAGS GDBFLAGS
    global prompt
    global spawn_id
    global timeout
    verbose "Spawning $GDB -dbx $INTERNAL_GDBFLAGS $GDBFLAGS"

    if { [which $GDB] == 0 } then {
        perror "$GDB does not exist."
        exit 1
    }

    set oldtimeout $timeout
    set timeout [expr "$timeout + 60"]
    eval "spawn $GDB -dbx $INTERNAL_GDBFLAGS $GDBFLAGS"
    gdb_expect {
        -re ".*\r\n$gdb_prompt $" {
            verbose "GDB initialized."
        }
        -re "$prompt $" {
            perror "GDB never initialized."
            return -1
        }
        timeout         {
            perror "(timeout) GDB never initialized."
            return -1
        }
    }
    set timeout $oldtimeout
    # force the height to "unlimited", so no pagers get used
    send_gdb "set height 0\n"
    gdb_expect {
        -re ".*$prompt $" {
            verbose "Setting height to 0." 2
        }
        timeout {
            warning "Couldn't set the height to 0."
        }
    }
    # force the width to "unlimited", so no wraparound occurs
    send_gdb "set width 0\n"
    gdb_expect {
        -re ".*$prompt $" {
            verbose "Setting width to 0." 2
        }
        timeout {
            warning "Couldn't set the width to 0."
        }
    }
}


proc dbx_reinitialize_dir { subdir } {
    global gdb_prompt

   send_gdb "use\n"
    gdb_expect {
        -re "Reinitialize source path to empty.*y or n. " {
            send_gdb "y\n"
            gdb_expect {
                -re "Source directories searched.*$gdb_prompt $" {
                    send_gdb "use $subdir\n"
                    gdb_expect {
                        -re "Source directories searched.*$gdb_prompt $" {
                            verbose "Dir set to $subdir"
                        }
                        -re ".*$gdb_prompt $" {
                            perror "Dir \"$subdir\" failed."
                        }
                    }
                }
                -re ".*$gdb_prompt $" {
                    perror "Dir \"$subdir\" failed."
                }
            }
        }
        -re ".*$gdb_prompt $" {
            perror "Dir \"$subdir\" failed."
        }
    }
}

# In "testsuite/config/unix-gdb.exp", the routine "gdb_load"
# is defined as "gdb_file_cmd".  The binding of "gdb_file_cmd"
# is done at invocation time.  Before this file is processed,
# it binds to the definition in "testsuite/lib/gdb.exp"; after
# this file is processed, it binds to this definition.
# TCL lets us overrides a previous routine definition without a
# warning (isn't that special?).
#
# This means that tests before use "file" to load a target, and
# tests afterwards use the pair "symbol-file" "exec-file".
#
# I'm leaving it as it is for now because at the moment it
# is the only test we have of the use of the combination of
# "symbol-file" and "exec-file" to load a debugging target (the
# other definition uses "file". 
#
# Symbol-file and exec-file should be tested explicitly, not
# as a side effect of running a particular test (in this case,
# "testsuite/gdb.compat/dbx.exp").
#
# CM: Renamed the procedure so it does not override the orginal file name.
#     Having the test suite change behavior depending on the tests run makes
#     it extremely difficult to reproduce errors. I've also added a
#     "dbx_gdb_load" procedure.  This and only this test will call these
#     procedures now. I also added an "expect" to the "send exec-file" line.
#     The "expect" waits for a prompt to appear. Otherwise, if the tests run
#     too quickly, the caller could send another command before the prompt
#     of this command returns, causing the test to get out of sync and fail
#     seemingly randomly or only on a loaded system.
#
# Problem is, though, that the testsuite config files can override the definition of
# gdb_load (without notice, as was mentioned above). Unfortunately, the gdb_load proc
# that was copied into this test was a copy of the unix native version.
#
# The real problem that we're attempting to solve is how to load an exec and symbol
# file into gdb for a dbx session. So why not just override gdb_file_cmd with the
# right sequence of events, allowing gdb_load to do its normal thing? This way
# remotes and simulators will work, too.
#
# [drow 2002-03-30]: We can restore the old gdb_file_cmd afterwards, though.
set old_gdb_file_cmd_args [info args gdb_file_cmd]
set old_gdb_file_cmd_body [info body gdb_file_cmd]

proc gdb_file_cmd {arg} {
    global verbose
    global loadpath
    global loadfile
    global GDB
    global gdb_prompt
    global spawn_id
    upvar timeout timeout
    global last_loaded_file

    set last_loaded_file $arg

    if [is_remote host] {
        set arg [remote_download host $arg];
        if { $arg == "" } {
            error "download failed"
            return -1;
        }
    }

    send_gdb "symbol-file $arg\n"
    gdb_expect {
	-re "Detected 64-bit symbol file.\r\nInvoking.*gdb64.*$gdb_prompt $" {
            verbose "\t\tLoaded $arg into the $GDB"
            send_gdb "exec-file $arg\n" 
            gdb_expect {
                -re ".*$gdb_prompt $" {
                    verbose "\t\tLoaded $arg with new symbol table into $GDB"
                    return 0
                }
                timeout {
                    perror "(timeout) Couldn't load $arg"
                    return -1
                }
            }
            return 0
        }
        -re "Reading symbols from.*done.*$gdb_prompt $" {
            verbose "\t\tLoaded $arg into the $GDB"
            send_gdb "exec-file $arg\n" 
            gdb_expect {
	        -re "A program is being debugged already.*Kill it.*y or n. $" {
	            send_gdb "y\n"
	                verbose "\t\tKilling previous program being debugged"
	            exp_continue
	        }
                -re ".*$gdb_prompt $" {
                    verbose "\t\tLoaded $arg with new symbol table into $GDB"
                    return 0
                }
                timeout {
                    perror "(timeout) Couldn't load $arg"
                    return -1
                }
            }
            return 0
        }
        -re "has no symbol-table.*$gdb_prompt $" {
            perror "$arg wasn't compiled with \"-g\""
            return -1
        }
        -re "Load new symbol table from \".*\".*y or n. $" {
            send_gdb "y\n"
	    exp_continue
        }
        -re ".*No such file or directory.*$gdb_prompt $" {
            perror "($arg) No such file or directory\n"
            return -1
        }
        -re "$gdb_prompt $" {
            perror "couldn't load $arg into $GDB."
            return -1
            }
        timeout {
            perror "couldn't load $arg into $GDB (timed out)."
            return -1
        }
        eof {
            # This is an attempt to detect a core dump, but seems not to
            # work.  Perhaps we need to match .* followed by eof, in which
            # expect does not seem to have a way to do that.
            perror "couldn't load $arg into $GDB (end of file)."
            return -1
        }
    }
}

#
#test_breakpoints
#
proc test_breakpoints { } {
    gdb_test "stop in main" "Breakpoint.*at.*: file.*average\.c, line 38\."
    gdb_test "status" "Num.*Type.*Disp.*Enb.*Address.*What\r\n1\[ \r\]+breakpoint\[ \r\]+keep y.*in main at.*average\.c:38.*"
    gdb_test "stop at average.c:43" "Breakpoint.*at.*: file.*average\.c, line 43.*"
    gdb_test "stop in average.c:43" "Usage: stop in <function . address>"
    gdb_test "stop at main" "Usage: stop at <line>"
}

#
#test_assign
#
proc test_assign { } {
    global decimal
    global gdb_prompt

    gdb_run_cmd
    gdb_expect 30 {
        -re "Break.* at .*:$decimal.*$gdb_prompt $" { pass "running to main" }
        -re "Breakpoint \[0-9\]*, \[0-9xa-f\]* in .*$gdb_prompt $" { pass "running to main"  }
        -re "$gdb_prompt $" { fail "running to main" }
        timeout { fail "running to main (timeout)" }
    }
    send_gdb "assign first=1\n"
    gdb_expect {
      -re "No symbol \"first\" in current context.*$" { fail "assign first" }
      -re "$gdb_prompt $" { pass "assign first" }
      timeout { fail "assign first (timeout)" }
    }
    gdb_test "print first" ".1 = 1"
}

#
#test_whereis
#
proc test_whereis { } {
    gdb_test "whereis my_list" "All variables matching regular expression \"my_list\":\r\n\r\nFile.*average\.c:\r\nstatic int my_list\\\[10\\\];"
}

#
#test_func
#
proc test_func { } {
    gdb_test "cont" ".*" "cont 1"
    gdb_test "step" ".*"
    # This always fails, but it's not clear why. -sts 1999-08-17
    setup_xfail "*-*-*"
    gdb_test "func sum" "'sum' not within current stack frame\."
    gdb_test "stop in sum" "Breakpoint.*at.*: file.*sum\.c, line 11\."
    gdb_test "cont" ".*" "cont 2"
    # This always fails, but it's not clear why. -sts 1999-08-17
    setup_xfail "*-*-*"
    gdb_test "func print_average" ".*in print_average.*\\(list=.*, low=0, high=6\\).*at.*average\.c:24\r\n24\[ \t\]+total = sum\\(list, low, high\\);"
}

# Start with a fresh gdb.

gdb_exit
global GDBFLAGS
set saved_gdbflags $GDBFLAGS

set GDBFLAGS "$GDBFLAGS --dbx"
gdb_start
dbx_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

test_breakpoints
test_assign
test_whereis
gdb_test "file average.c:1" "1\[ \t\]+/. This is a sample program.*"
test_func

#exit and cleanup
gdb_exit

set GDBFLAGS $saved_gdbflags
eval proc gdb_file_cmd {$old_gdb_file_cmd_args} {$old_gdb_file_cmd_body}

return 0
