# 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 args } {
    global gdb_prompt
    global expect_out

    set output_string ""
    if {[llength $args] > 0} {
	# Convert $args into a simple string.
	set test "[join $args]; capture $expression"
    } {
	set test "capture $expression"
    }
    gdb_test_multiple "print ${expression}" "$test" {
	-re "\\$\[0-9\]+ = (\[^\r\n\]+).*$gdb_prompt $" {
	    set output_string "$expect_out(1,string)"
	    pass "$test"
	}
	-re "(Cannot access memory at address \[^\r\n\]+).*$gdb_prompt $" {
	    # Even a failed value is valid
	    set output_string "$expect_out(1,string)"
	    pass "$test"
	}
    }
    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" "file binfile"]] } then {
    fail "start with intarray un-initialized"
} else {
    pass "start with intarray un-initialized"
}

if { ![string compare $struct_val \
	   [capture_value "intstruct" "file binfile"]] } 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 "$msg"]] } then { 
	pass "$msg; value restored ok"
    } else {
	fail "$msg; value restored ok"
    }
}

proc test_restore_saved_value { restore_args msg oldval newval } {
    global gdb_prompt
    
    gdb_test "restore $restore_args" \
	"Restoring .*" \
	"$msg; file restored ok"
    if { ![string compare $oldval \
	       [capture_value $newval "$msg"]] } then { 
	pass "$msg; value restored ok"
    } else {
	fail "$msg; value restored ok"
    }
}

# 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" "load binfile"]] } 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" "load binfile"]] } 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 "(char *) &intarray2 - (char *) &intarray"]
set struct2_offset \
	[capture_value "(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" 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" 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" 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" 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" 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"
