From 54aeeb996d6cf0730779c640ce0afced77e632b4 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Fri, 1 Jul 2011 16:42:42 +0000 Subject: 2011-07-02 Yao Qi * gdb.base/dump.exp (capture_pointer_with_type): New. Get value from address instead of name. Start GDB once, and do `dump' and `restore' tests together. --- gdb/testsuite/ChangeLog | 7 ++ gdb/testsuite/gdb.base/dump.exp | 217 +++++++++++++++++++++------------------- 2 files changed, 119 insertions(+), 105 deletions(-) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8957c5e..1bf0ba0 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2011-07-02 Yao Qi + + * gdb.base/dump.exp (capture_pointer_with_type): New. + Get value from address instead of name. + Start GDB once, and do `dump' and `restore' + tests together. + 2011-06-30 Jie Zhang Mike Frysinger diff --git a/gdb/testsuite/gdb.base/dump.exp b/gdb/testsuite/gdb.base/dump.exp index e74a12f..1744133 100644 --- a/gdb/testsuite/gdb.base/dump.exp +++ b/gdb/testsuite/gdb.base/dump.exp @@ -153,6 +153,34 @@ proc capture_value { expression args } { return $output_string } +# POINTER is a pointer and this proc captures the value of POINTER along +# with POINTER's type. For example, POINTER is "&intarray", this proc will +# call "p &intarray", capture "(int (*)[32]) 0x804a0e0", and return this +# string. + +proc capture_pointer_with_type { pointer } { + global gdb_prompt + global expect_out + + set test "capture type of pointer $pointer" + set output_string "" + gdb_test_multiple "p ${pointer}" $test { + -re "\\$\[0-9\]+ = .*$gdb_prompt $" { + # Expected output of "p ${pointer}" is like "$7 = (int (*)[32]) 0x804a0e0", + # and we want to extract "(int (*)[32]) 0x804a0e0" from it via + # following regexp. + if [regexp " \\(.*\\).* 0x\[0-9a-fA-F\]+" $expect_out(0,string) output_string] { + # OUTPUT_STRING is expected to be like "(int (*)[32]) 0x804a0e0". + pass "$test" + } else { + fail "$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"] @@ -161,6 +189,9 @@ set struct_end [capture_value "/x &intstruct + 1"] set array_val [capture_value "intarray"] set struct_val [capture_value "intstruct"] +set array_ptr_type [capture_pointer_with_type "&intarray"] +set struct_ptr_type [capture_pointer_with_type "&intstruct"] + make_dump_file "dump mem intarr2.bin $array_start $array_end" \ "dump array as memory, default" @@ -196,49 +227,6 @@ 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} - -# Now fix the endianness at the correct state. - -gdb_test_multiple "set endian $endian" "set endianness" { - -re ".* (big|little) endian.*$gdb_prompt $" { - pass "setting $endian endianness" - } -} - -# 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 @@ -253,71 +241,10 @@ proc test_restore_saved_value { restore_args msg oldval newval } { } } -# 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 { - untested dump.exp - return -1 -} - -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" -} + gdb_test "print zero_all ()" ".*" -if ![string compare $is64bitonly "no"] then { test_restore_saved_value "intarr1.srec" "array as value, srec" \ $array_val "intarray" @@ -500,6 +427,86 @@ if ![string compare $is64bitonly "no"] then { gdb_test "print intarray2\[4\] == 0" " = 1" "element 4 not changed, == 4" } + +# Now start a fresh gdb session, and reload the saved value files. + +gdb_exit +gdb_start +gdb_file_cmd ${binfile} + +# Now fix the endianness at the correct state. + +gdb_test_multiple "set endian $endian" "set endianness" { + -re ".* (big|little) endian.*$gdb_prompt $" { + pass "setting $endian endianness" + } +} + +# 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" + } +} + +# 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 "\*$array_ptr_type" + test_reload_saved_value "intstr1.srec" "reload struct as value, srec" \ + $struct_val "\*$struct_ptr_type" + test_reload_saved_value "intarr2.srec" "reload array as memory, srec" \ + $array_val "\*$array_ptr_type" + test_reload_saved_value "intstr2.srec" "reload struct as memory, srec" \ + $struct_val "\*$struct_ptr_type" +} + +# 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 "\*$array_ptr_type" + test_reload_saved_value "intstr1.ihex" "reload struct as value, intel hex" \ + $struct_val "\*$struct_ptr_type" + test_reload_saved_value "intarr2.ihex" "reload array as memory, intel hex" \ + $array_val "\*$array_ptr_type" + test_reload_saved_value "intstr2.ihex" "reload struct as memory, intel hex" \ + $struct_val "\*$struct_ptr_type" +} + +# 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 "\*$array_ptr_type" + test_reload_saved_value "intstr1.tekhex" "reload struct as value, tekhex" \ + $struct_val "\*$struct_ptr_type" + test_reload_saved_value "intarr2.tekhex" "reload array as memory, tekhex" \ + $array_val "\*$array_ptr_type" + test_reload_saved_value "intstr2.tekhex" "reload struct as memory, tekhex" \ + $struct_val "\*$struct_ptr_type" +} + # 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" -- cgit v1.1