# Copyright 2002, 2004 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Michael Snyder (msnyder@redhat.com)
# This is a test for the gdb command "dump".

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile "dump"

set srcfile  ${testfile}.c
set binfile  ${objdir}/${subdir}/${testfile}
set options  {debug}

set is64bitonly "no"

if [istarget "alpha*-*-*"] then {
    # SREC etc cannot handle 64-bit addresses.  Force the test
    # program into the low 31 bits of the address space.
    lappend options "additional_flags=-Wl,-taso"
}

if [istarget "ia64*-*-*"] then {
    set is64bitonly "yes"
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ${options}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# Start with a fresh gdb.

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

# Clean up any stale output files from previous test runs

remote_exec build "rm -f intarr1.bin intarr1b.bin intarr1.ihex intarr1.srec intarr1.tekhex intarr2.bin intarr2b.bin intarr2.ihex intarr2.srec intarr2.tekhex intstr1.bin intstr1b.bin intstr1.ihex intstr1.srec intstr1.tekhex intstr2.bin intstr2b.bin intstr2.ihex intstr2.srec intstr2.tekhex intarr3.srec"

# Test help (FIXME:)

# Run target program until data structs are initialized.

if { ! [ runto checkpoint1 ] } then {
    gdb_suppress_entire_file "Program failed to run, so all tests in this file will automatically fail."
}

# Now generate some dump files.

proc make_dump_file { command msg } {
  global gdb_prompt

    send_gdb "${command}\n"
    gdb_expect {
	-re ".*\[Ee\]rror.*$gdb_prompt $"      { fail $msg }
	-re ".*\[Ww\]arning.*$gdb_prompt $"    { fail $msg }
	-re ".*\[Uu\]ndefined .*$gdb_prompt $" { fail $msg }
	-re ".*$gdb_prompt $" { pass $msg }
	timeout                                { fail "$msg (timeout)" }
    }
}

make_dump_file "dump val intarr1.bin intarray" \
	"dump array as value, default"

make_dump_file "dump val intstr1.bin intstruct" \
	"dump struct as value, default"

make_dump_file "dump bin val intarr1b.bin intarray" \
	"dump array as value, binary"

make_dump_file "dump bin val intstr1b.bin intstruct" \
	"dump struct as value, binary"

make_dump_file "dump srec val intarr1.srec intarray" \
	"dump array as value, srec"

make_dump_file "dump srec val intstr1.srec intstruct" \
	"dump struct as value, srec"

make_dump_file "dump ihex val intarr1.ihex intarray" \
	"dump array as value, intel hex"

make_dump_file "dump ihex val intstr1.ihex intstruct" \
	"dump struct as value, intel hex"

make_dump_file "dump tekhex val intarr1.tekhex intarray" \
	"dump array as value, tekhex"

make_dump_file "dump tekhex val intstr1.tekhex intstruct" \
	"dump struct as value, tekhex"

proc capture_value { expression } {
    global gdb_prompt
    global expect_out

    set output_string ""
    send_gdb "print ${expression}\n"
    gdb_expect {
	-re ".*\[\r\n\]+.\[0123456789\]+ = (\[^\r\n\]+).*$gdb_prompt $" {
	    set output_string $expect_out(1,string)
	}
	default {
	    fail "capture_value failed on $expression."
	}
    }
    return $output_string
}

set array_start  [capture_value "/x &intarray\[0\]"]
set array_end    [capture_value "/x &intarray\[32\]"]
set struct_start [capture_value "/x &intstruct"]
set struct_end   [capture_value "/x &intstruct + 1"]

set array_val    [capture_value "intarray"]
set struct_val   [capture_value "intstruct"]

make_dump_file "dump mem intarr2.bin $array_start $array_end" \
	"dump array as memory, default"

make_dump_file "dump  mem intstr2.bin $struct_start $struct_end" \
	"dump struct as memory, default"

make_dump_file "dump bin mem intarr2b.bin $array_start $array_end" \
	"dump array as memory, binary"

make_dump_file "dump bin mem intstr2b.bin $struct_start $struct_end" \
	"dump struct as memory, binary"

make_dump_file "dump srec mem intarr2.srec $array_start $array_end" \
	"dump array as memory, srec"

make_dump_file "dump srec mem intstr2.srec $struct_start $struct_end" \
	"dump struct as memory, srec"

make_dump_file "dump ihex mem intarr2.ihex $array_start $array_end" \
	"dump array as memory, ihex"

make_dump_file "dump ihex mem intstr2.ihex $struct_start $struct_end" \
	"dump struct as memory, ihex"

make_dump_file "dump tekhex mem intarr2.tekhex $array_start $array_end" \
	"dump array as memory, tekhex"

make_dump_file "dump tekhex mem intstr2.tekhex $struct_start $struct_end" \
	"dump struct as memory, tekhex"

# test complex expressions
make_dump_file \
	"dump srec mem intarr3.srec &intarray \(char *\) &intarray + sizeof intarray" \
	"dump array as mem, srec, expressions"


# Now start a fresh gdb session, and reload the saved value files.

gdb_exit
gdb_start
gdb_file_cmd ${binfile}

# Reload saved values one by one, and compare.

if { ![string compare $array_val [capture_value "intarray"]] } then {
    fail "start with intarray un-initialized"
} else {
    pass "start with intarray un-initialized"
}

if { ![string compare $struct_val [capture_value "intstruct"]] } then {
    fail "start with intstruct un-initialized"
} else {
    pass "start with intstruct un-initialized"
}

proc test_reload_saved_value { filename msg oldval newval } {
    global gdb_prompt
    
    gdb_file_cmd $filename
    if { ![string compare $oldval [capture_value $newval]] } then { 
	pass $msg 
    } else {
	fail $msg 
    }
}

proc test_restore_saved_value { restore_args msg oldval newval } {
    global gdb_prompt
    
    gdb_test "restore $restore_args" \
	    "Restoring .*" \
	    "Restore command, $msg"

    if { ![string compare $oldval [capture_value $newval]] } then { 
	pass "Restored value, $msg"
    } else {
	fail "Restored value, $msg"
    }
}

# srec format can not be loaded for 64-bit-only platforms
if ![string compare $is64bitonly "no"] then {
  test_reload_saved_value "intarr1.srec" "reload array as value, srec" \
	$array_val "intarray"
  test_reload_saved_value "intstr1.srec" "reload struct as value, srec" \
	$struct_val "intstruct"
  test_reload_saved_value "intarr2.srec" "reload array as memory, srec" \
	$array_val "intarray"
  test_reload_saved_value "intstr2.srec" "reload struct as memory, srec" \
	$struct_val "intstruct"
}

# ihex format can not be loaded for 64-bit-only platforms
if ![string compare $is64bitonly "no"] then {

  test_reload_saved_value "intarr1.ihex" "reload array as value, intel hex" \
	$array_val "intarray"
  test_reload_saved_value "intstr1.ihex" "reload struct as value, intel hex" \
	$struct_val "intstruct"
  test_reload_saved_value "intarr2.ihex" "reload array as memory, intel hex" \
	$array_val "intarray"
  test_reload_saved_value "intstr2.ihex" "reload struct as memory, intel hex" \
	$struct_val "intstruct"
}

# tekhex format can not be loaded for 64-bit-only platforms
if ![string compare $is64bitonly "no"] then {
  test_reload_saved_value "intarr1.tekhex" "reload array as value, tekhex" \
	$array_val "intarray"
  test_reload_saved_value "intstr1.tekhex" "reload struct as value, tekhex" \
	$struct_val "intstruct"
  test_reload_saved_value "intarr2.tekhex" "reload array as memory, tekhex" \
	$array_val "intarray"
  test_reload_saved_value "intstr2.tekhex" "reload struct as memory, tekhex" \
	$struct_val "intstruct"
}

# Start a fresh gdb session

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

# Run to main.
if { ! [ runto_main ] } then {
    gdb_suppress_entire_file "Program failed to run, so remaining tests in this file will automatically fail."
}

if { ![string compare $array_val [capture_value "intarray"]] } then {
    fail "start with intarray un-initialized, runto main"
} else {
    pass "start with intarray un-initialized, runto main"
}

if { ![string compare $struct_val [capture_value "intstruct"]] } then {
    fail "start with intstruct un-initialized, runto main"
} else {
    pass "start with intstruct un-initialized, runto main"
}

if ![string compare $is64bitonly "no"] then {
  test_restore_saved_value "intarr1.srec" "array as value, srec" \
	$array_val "intarray"

  test_restore_saved_value "intstr1.srec" "struct as value, srec" \
	$struct_val "intstruct"

  gdb_test "print zero_all ()" "void" "zero all"

  test_restore_saved_value "intarr2.srec" "array as memory, srec" \
	$array_val "intarray"

  test_restore_saved_value "intstr2.srec" "struct as memory, srec" \
	$struct_val "intstruct"

  gdb_test "print zero_all ()" ""

  test_restore_saved_value "intarr1.ihex" "array as value, ihex" \
	$array_val "intarray"

  test_restore_saved_value "intstr1.ihex" "struct as value, ihex" \
	$struct_val "intstruct"

  gdb_test "print zero_all ()" ""

  test_restore_saved_value "intarr2.ihex" "array as memory, ihex" \
	$array_val "intarray"

  test_restore_saved_value "intstr2.ihex" "struct as memory, ihex" \
	$struct_val "intstruct"

  gdb_test "print zero_all ()" ""

  test_restore_saved_value "intarr1.tekhex" "array as value, tekhex" \
	$array_val "intarray"

  test_restore_saved_value "intstr1.tekhex" "struct as value, tekhex" \
	$struct_val "intstruct"

  gdb_test "print zero_all ()" ""

  test_restore_saved_value "intarr2.tekhex" "array as memory, tekhex" \
	$array_val "intarray"

  test_restore_saved_value "intstr2.tekhex" "struct as memory, tekhex" \
	$struct_val "intstruct"
}

gdb_test "print zero_all ()" ""

test_restore_saved_value "intarr1.bin binary $array_start" \
	"array as value, binary" \
	$array_val "intarray"

test_restore_saved_value "intstr1.bin binary $struct_start" \
	"struct as value, binary" \
	$struct_val "intstruct"

gdb_test "print zero_all ()" ""

test_restore_saved_value "intarr2.bin binary $array_start" \
	"array as memory, binary" \
	$array_val "intarray"

test_restore_saved_value "intstr2.bin binary $struct_start" \
	"struct as memory, binary" \
	$struct_val "intstruct"

# test restore with offset.

set array2_start   [capture_value "/x &intarray2\[0\]"]
set struct2_start  [capture_value "/x &intstruct2"]
set array2_offset  \
	[capture_value "/x (char *) &intarray2 - (char *) &intarray"]
set struct2_offset \
	[capture_value "/x (char *) &intstruct2 - (char *) &intstruct"]

gdb_test "print zero_all ()" ""


if ![string compare $is64bitonly "no"] then {
  test_restore_saved_value "intarr1.srec $array2_offset" \
	"array copy, srec" \
	$array_val "intarray2"

  test_restore_saved_value "intstr1.srec $struct2_offset" \
	"struct copy, srec" \
	$struct_val "intstruct2"

  gdb_test "print zero_all ()" ""

  test_restore_saved_value "intarr1.ihex $array2_offset" \
	"array copy, ihex" \
	$array_val "intarray2"

  test_restore_saved_value "intstr1.ihex $struct2_offset" \
	"struct copy, ihex" \
	$struct_val "intstruct2"

  gdb_test "print zero_all ()" ""

  test_restore_saved_value "intarr1.tekhex $array2_offset" \
	"array copy, tekhex" \
	$array_val "intarray2"

  test_restore_saved_value "intstr1.tekhex $struct2_offset" \
	"struct copy, tekhex" \
	$struct_val "intstruct2"
}

gdb_test "print zero_all ()" ""

test_restore_saved_value "intarr1.bin binary $array2_start" \
	"array copy, binary" \
	$array_val "intarray2"

test_restore_saved_value "intstr1.bin binary $struct2_start" \
	"struct copy, binary" \
	$struct_val "intstruct2"

#
# test restore with start/stop addresses.
#
# For this purpose, we will restore just the third element of the array, 
# and check to see that adjacent elements are not modified.
#
# We will need the address and offset of the third and fourth elements.
#

set element3_start  [capture_value "/x &intarray\[3\]"]
set element4_start  [capture_value "/x &intarray\[4\]"]
set element3_offset \
	[capture_value "/x (char *) &intarray\[3\] - (char *) &intarray\[0\]"]
set element4_offset \
	[capture_value "/x (char *) &intarray\[4\] - (char *) &intarray\[0\]"]

if ![string compare $is64bitonly "no"] then {
  gdb_test "print zero_all ()" ""

  test_restore_saved_value "intarr1.srec 0 $element3_start $element4_start" \
	"array partial, srec" \
	[capture_value "4"] "intarray\[3\]"

  gdb_test "print intarray\[2\] == 0" " = 1" "element 2 not changed - 1"
  gdb_test "print intarray\[4\] == 0" " = 1" "element 4 not changed - 1"

  gdb_test "print zero_all ()" ""

  test_restore_saved_value "intarr1.ihex 0 $element3_start $element4_start" \
	"array partial, ihex" \
	[capture_value "4"] "intarray\[3\]"

  gdb_test "print intarray\[2\] == 0" " = 1" "element 2 not changed - 2"
  gdb_test "print intarray\[4\] == 0" " = 1" "element 4 not changed - 2"

  gdb_test "print zero_all ()" ""

  test_restore_saved_value "intarr1.tekhex 0 $element3_start $element4_start" \
	"array partial, tekhex" \
	[capture_value "4"] "intarray\[3\]"

  gdb_test "print intarray\[2\] == 0" " = 1" "element 2 not changed - 3"
  gdb_test "print intarray\[4\] == 0" " = 1" "element 4 not changed - 3"
}

gdb_test "print zero_all ()" ""

test_restore_saved_value \
    "intarr1.bin binary $array_start $element3_offset $element4_offset" \
    "array partial, binary" \
    [capture_value "4"] "intarray\[3\]"

gdb_test "print intarray\[2\] == 0" " = 1" "element 2 not changed - 4"
gdb_test "print intarray\[4\] == 0" " = 1" "element 4 not changed - 4"

if ![string compare $is64bitonly "no"] then {
  gdb_test "print zero_all ()" "" ""

  # restore with expressions 
  test_restore_saved_value \
	"intarr3.srec ${array2_start}-${array_start} &intarray\[3\] &intarray\[4\]" \
	"array partial with expressions" \
	[capture_value "4"] "intarray2\[3\]"

  gdb_test "print intarray2\[2\] == 0" " = 1" "element 2 not changed, == 4"
  gdb_test "print intarray2\[4\] == 0" " = 1" "element 4 not changed, == 4"
}

# clean up files

remote_exec build "rm -f intarr1.bin intarr1b.bin intarr1.ihex intarr1.srec intarr1.tekhex intarr2.bin intarr2b.bin intarr2.ihex intarr2.srec intarr2.tekhex intstr1.bin intstr1b.bin intstr1.ihex intstr1.srec intstr1.tekhex intstr2.bin intstr2b.bin intstr2.ihex intstr2.srec intstr2.tekhex intarr3.srec"

