gdb/testsuite/
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.trace / collection.exp
index a48e3633055d28cac2d1cd42a93b3a5abebac2f2..4917ea847dabad9feedc0777dfc34659fcc986a9 100644 (file)
@@ -1,26 +1,18 @@
-# Copyright (C) 1998 Free Software Foundation, Inc.
+# Copyright 1998, 2005, 2007, 2008, 2009, 2010, 2011
+# 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
+# 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, 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
-
-if [istarget "m68k-*-elf"] then {
-    pass "Test not supported on this target"
-    return;
-}
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 load_lib "trace-support.exp"
 
@@ -28,16 +20,16 @@ if $tracelevel then {
        strace $tracelevel
 }
 
-set prms_id 0
-set bug_id 0
 
 set testfile "collection"
 set srcfile ${testfile}.c
-set binfile $objdir/$subdir/$testfile
+set executable $testfile
+set binfile $objdir/$subdir/$executable
 
 if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
-       executable {debug additional_flags="-gdwarf"}] != "" } {
-    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+       executable {debug nowarnings}] != "" } {
+    untested collection.exp
+    return -1
 }
 
 # Tests: 
@@ -53,6 +45,20 @@ if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
 set ws "\[\r\n\t \]+"
 set cr "\[\r\n\]+"
 
+if {([istarget "x86_64-*"] || [istarget "i?86-*"]) && [is_lp64_target]} then {
+    set fpreg "rbp"
+    set spreg "rsp"
+    set pcreg "rip"
+} elseif {[istarget "x86_64-*"] || [istarget "i?86-*"]} then {
+    set fpreg "ebp"
+    set spreg "esp"
+    set pcreg "eip"
+} else {
+    set fpreg "fp"
+    set spreg "sp"
+    set pcreg "pc"
+}
+
 #
 # Utility procs
 #
@@ -61,28 +67,44 @@ proc test_register { reg test_id } {
     global cr
     global gdb_prompt
 
-    send_gdb "print $reg\n"
-    gdb_expect {
-       -re "\\$\[0-9\]+ = \[x0\]+$cr$gdb_prompt " {
+    gdb_test_multiple "print /x $reg" "" {
+       -re "\\$\[0-9\]+ = \[x0\]+$cr$gdb_prompt $" {
            fail "collect $test_id: collected $reg (zero)"
        }
-       -re "\\$\[0-9\]+ = \[x0-9a-fA-F\]+$cr$gdb_prompt " {
+       -re "\\$\[0-9\]+ = \[x0-9a-fA-F\]+$cr$gdb_prompt $" {
            pass "collect $test_id: collected $reg"
        }
-       -re "\[Ee\]rror.*$gdb_prompt " {
+       -re "\[Ee\]rror.*$gdb_prompt $" {
            fail "collect $test_id: collected $reg (error)"
        }
-       timeout {
-           fail "collect $test_id: collected $reg (timeout)"
-       }
     }
 }
 
+proc prepare_for_trace_test {} {
+    global executable
+
+    clean_restart $executable
+
+    runto_main
+
+    gdb_test "break begin" ".*" ""
+    gdb_test "break end" ".*" ""
+}
+
 proc run_trace_experiment { msg test_func } {
-    gdb_run_cmd 
-    gdb_test "tstart" \
-           "\[\r\n\]+" \
-           "collect $msg: start trace experiment"
+    global gdb_prompt
+
+    gdb_test "continue" \
+       ".*Breakpoint \[0-9\]+, begin .*" \
+       "collect $msg: advance to begin"
+
+    set test "collect $msg: start trace experiment"
+    gdb_test_multiple "tstart" "$test" {
+       -re "^tstart\r\n$gdb_prompt $" {
+           pass "$test"
+       }
+    }
+
     gdb_test "continue" \
            "Continuing.*Breakpoint \[0-9\]+, end.*" \
            "collect $msg: run trace experiment"
@@ -103,10 +125,7 @@ proc gdb_collect_args_test { myargs msg } {
     global cr
     global gdb_prompt
 
-    # Make sure we're in a sane starting state.
-    gdb_test "tstop" "" ""
-    gdb_test "tfind none" "" ""
-    gdb_delete_tracepoints
+    prepare_for_trace_test
 
     gdb_test "trace args_test_func" \
            "Tracepoint \[0-9\]+ at .*" \
@@ -146,15 +165,30 @@ proc gdb_collect_args_test { myargs msg } {
            "collect $msg: collected arg struct member double"
 
     # array arg as one of several args (near end of list)
+
+    # It isn't clear why is the test assuming the array's elements are
+    # collected.  In C, an array as function parameters is a special
+    # case; it's just a pointer into the caller's array, and as such,
+    # that's what normally the debug info describes.  Maybe this was
+    # originaly written for a compiler where array parameters were
+    # really described as arrays in debug info.
+
+    setup_xfail "*-*-*"
     gdb_test "print argarray\[0\]" \
            "\\$\[0-9\]+ = 111$cr" \
            "collect $msg: collected argarray #0"
+
+    setup_xfail "*-*-*"
     gdb_test "print argarray\[1\]" \
            "\\$\[0-9\]+ = 112$cr" \
            "collect $msg: collected argarray #1"
+
+    setup_xfail "*-*-*"
     gdb_test "print argarray\[2\]" \
            "\\$\[0-9\]+ = 113$cr" \
            "collect $msg: collected argarray #2"
+
+    setup_xfail "*-*-*"
     gdb_test "print argarray\[3\]" \
            "\\$\[0-9\]+ = 114$cr" \
            "collect $msg: collected argarray #3"
@@ -168,10 +202,7 @@ proc gdb_collect_argstruct_test { myargs msg } {
     global cr
     global gdb_prompt
 
-    # Make sure we're in a sane starting state.
-    gdb_test "tstop" "" ""
-    gdb_test "tfind none" "" ""
-    gdb_delete_tracepoints
+    prepare_for_trace_test
 
     gdb_test "trace argstruct_test_func" \
            "Tracepoint \[0-9\]+ at .*" \
@@ -207,10 +238,7 @@ proc gdb_collect_argarray_test { myargs msg } {
     global cr
     global gdb_prompt
 
-    # Make sure we're in a sane starting state.
-    gdb_test "tstop" "" ""
-    gdb_test "tfind none" "" ""
-    gdb_delete_tracepoints
+    prepare_for_trace_test
 
     gdb_test "trace argarray_test_func" \
            "Tracepoint \[0-9\]+ at .*" \
@@ -223,15 +251,30 @@ proc gdb_collect_argarray_test { myargs msg } {
     run_trace_experiment $msg argarray_test_func
 
     # array arg as only argument
+
+    # It isn't clear why is the test assuming the array's elements are
+    # collected.  In C, an array as function parameters is a special
+    # case; it's just a pointer into the caller's array, and as such,
+    # that's what normally the debug info describes.  Maybe this was
+    # originaly written for a compiler where array parameters were
+    # really described as arrays in debug info.
+
+    setup_xfail "*-*-*"
     gdb_test "print argarray\[0\]" \
            "\\$\[0-9\]+ = 111$cr" \
            "collect $msg: collected argarray #0"
+
+    setup_xfail "*-*-*"
     gdb_test "print argarray\[1\]" \
            "\\$\[0-9\]+ = 112$cr" \
            "collect $msg: collected argarray #1"
+
+    setup_xfail "*-*-*"
     gdb_test "print argarray\[2\]" \
            "\\$\[0-9\]+ = 113$cr" \
            "collect $msg: collected argarray #2"
+
+    setup_xfail "*-*-*"
     gdb_test "print argarray\[3\]" \
            "\\$\[0-9\]+ = 114$cr" \
            "collect $msg: collected argarray #3"
@@ -246,15 +289,11 @@ proc gdb_collect_locals_test { func mylocs msg } {
     global cr
     global gdb_prompt
 
-    # Make sure we're in a sane starting state.
-    gdb_test "tstop" "" ""
-    gdb_test "tfind none" "" ""
-    gdb_delete_tracepoints
+    prepare_for_trace_test
 
     # Find the comment-identified line for setting this tracepoint.
     set testline 0
-    send_gdb "list $func, +30\n"
-    gdb_expect {
+    gdb_test_multiple "list $func, +30" "collect $msg: find tracepoint line" {
        -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+ Set_Tracepoint_Here .*$gdb_prompt" {
            set testline $expect_out(1,string)
            pass "collect $msg: find tracepoint line"
@@ -280,7 +319,7 @@ proc gdb_collect_locals_test { func mylocs msg } {
     run_trace_experiment $msg $func
 
     gdb_test "print locc" \
-           "\\$\[0-9\]+ = 11 '.013'$cr" \
+       "\\$\[0-9\]+ = 11 '.\[a-z0-7\]+'$cr" \
            "collect $msg: collected local char"
     gdb_test "print loci" \
            "\\$\[0-9\]+ = 12$cr" \
@@ -327,11 +366,11 @@ proc gdb_collect_locals_test { func mylocs msg } {
 proc gdb_collect_registers_test { myregs } {
     global cr
     global gdb_prompt
+    global fpreg
+    global spreg
+    global pcreg
 
-    # Make sure we're in a sane starting state.
-    gdb_test "tstop" "" ""
-    gdb_test "tfind none" "" ""
-    gdb_delete_tracepoints
+    prepare_for_trace_test
 
     # We'll simply re-use the args_test_function for this test
     gdb_test "trace args_test_func" \
@@ -344,9 +383,9 @@ proc gdb_collect_registers_test { myregs } {
     # Begin the test.
     run_trace_experiment $myregs args_test_func
 
-    test_register "\$fp" $myregs
-    test_register "\$sp" $myregs
-    test_register "\$pc" $myregs
+    test_register "\$$fpreg" $myregs
+    test_register "\$$spreg" $myregs
+    test_register "\$$pcreg" $myregs
 
     gdb_test "tfind none" \
            "#0  end .*" \
@@ -357,15 +396,11 @@ proc gdb_collect_expression_test { func expr val msg } {
     global cr
     global gdb_prompt
 
-    # Make sure we're in a sane starting state.
-    gdb_test "tstop" "" ""
-    gdb_test "tfind none" "" ""
-    gdb_delete_tracepoints
+    prepare_for_trace_test
 
     # Find the comment-identified line for setting this tracepoint.
     set testline 0
-    send_gdb "list $func, +30\n"
-    gdb_expect {
+    gdb_test_multiple "list $func, +30" "collect $msg: find tracepoint line" {
        -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+ Set_Tracepoint_Here .*$gdb_prompt" {
            set testline $expect_out(1,string)
            pass "collect $msg: find tracepoint line"
@@ -403,15 +438,11 @@ proc gdb_collect_globals_test { } {
     global cr
     global gdb_prompt
 
-    # Make sure we're in a sane starting state.
-    gdb_test "tstop" "" ""
-    gdb_test "tfind none" "" ""
-    gdb_delete_tracepoints
+    prepare_for_trace_test
 
     # Find the comment-identified line for setting this tracepoint.
     set testline 0
-    send_gdb "list globals_test_func, +30\n"
-    gdb_expect {
+    gdb_test_multiple "list globals_test_func, +30" "collect globals: find tracepoint line" {
        -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+ Set_Tracepoint_Here .*$gdb_prompt" {
            set testline $expect_out(1,string)
            pass "collect globals: find tracepoint line"
@@ -426,13 +457,30 @@ proc gdb_collect_globals_test { } {
        }
     }
 
+    # Use use this to test collecting overlapping memory ranges
+    # (making use of UNOP_MEMVAL, as objects don't usually overlap
+    # other objects).  Note that globalarr2 should not be collected in
+    # any other way so that a regression test below can be effective.
+
+    set globalarr2_addr ""
+    set test "get address of globalarr2"
+    gdb_test_multiple "p /x &globalarr2" $test {
+       -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" {
+           set globalarr2_addr $expect_out(1,string)
+           pass $test
+       }
+    }
+
     gdb_test "trace $testline" \
            "Tracepoint \[0-9\]+ at .*" \
            "collect globals: set tracepoint"
     gdb_trace_setactions "collect globals: define actions" \
            "" \
            "collect globalc, globali, globalf, globald" "^$" \
-           "collect globalstruct, globalp, globalarr" "^$"
+           "collect globalstruct, globalp, globalarr" "^$" \
+           "collect \{int \[4\]\}$globalarr2_addr" "^$" \
+           "collect \{int \[2\]\}$globalarr2_addr" "^$" \
+           "collect \{int \[4\]\}globalarr3" "^$"
 
     # Begin the test.
     run_trace_experiment "globals" globals_test_func
@@ -477,26 +525,74 @@ proc gdb_collect_globals_test { } {
            "\\$\[0-9\]+ = 3$cr" \
            "collect globals: collected global array element #3"
 
+    # Check that we didn't mess up sort&merging memory ranges to
+    # collect.
+    gdb_test "print globalarr2" \
+       "\\$\[0-9\]+ = \\{0, 1, 2, 3\\}$cr" \
+       "collect globals: collected global array 2"
+
+    # GDB would internal error collecting UNOP_MEMVAL's whose address
+    # expression wasn't an rvalue (that's regtested in the
+    # corresponding 'collect' action above).  This just double checks
+    # we actually did collect what we wanted.
+    gdb_test "print globalarr3" \
+       "\\$\[0-9\]+ = \\{3, 2, 1, 0\\}$cr" \
+       "collect globals: collected global array 3"
+
     gdb_test "tfind none" \
            "#0  end .*" \
            "collect globals: cease trace debugging"
 }
 
-proc gdb_trace_collection_test { } {
-    global gdb_prompt;
+# Test that when we've collected all fields of a structure
+# individually, we can print the whole structure in one go.
+proc gdb_collect_global_in_pieces_test { } {
+    global gdb_prompt
 
-    gdb_test "set width 0" "" ""
-    delete_breakpoints
+    prepare_for_trace_test
 
-    # We generously give ourselves one "pass" if we successfully 
-    # detect that this test cannot be run on this target!
-    if { ![gdb_target_supports_trace] } then { 
-       pass "Current target does not supporst trace"
-       return 1;
+    # Find the comment-identified line for setting this tracepoint.
+    set testline 0
+    set msg "collect global in pieces: find tracepoint line"
+    gdb_test_multiple "list globals_test_func, +30" "$msg" {
+       -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+ Set_Tracepoint_Here .*$gdb_prompt" {
+           set testline $expect_out(1,string)
+           pass "$msg"
+       }
     }
 
-    gdb_test "break begin" "" ""
-    gdb_test "break end"   "" ""
+    if {$testline == 0} {
+       return
+    }
+
+    gdb_test "trace $testline" \
+       "Tracepoint \[0-9\]+ at .*" \
+       "collect global in pieces: set tracepoint"
+    gdb_trace_setactions "collect global in pieces: define actions" \
+           "" \
+           "collect global_pieces.a, global_pieces.b" \
+           "^$"
+
+    # Begin the test.
+    run_trace_experiment "global in pieces" globals_test_func
+
+    gdb_test "print /x global_pieces.a" " = 0x12345678" \
+       "collect global in pieces: print piece a"
+    gdb_test "print /x global_pieces.b" " = 0x87654321" \
+       "collect global in pieces: print piece b"
+
+    gdb_test "print /x global_pieces" " = \{a = 0x12345678, b = 0x87654321\}" \
+       "collect global in pieces: print whole object"
+
+    gdb_test "tfind none" "#0  end .*" \
+       "collect global in pieces: cease trace debugging"
+}
+
+proc gdb_trace_collection_test {} {
+    global fpreg
+    global spreg
+    global pcreg
+
     gdb_collect_args_test "\$args" \
            "args collectively"
     gdb_collect_args_test "argc, argi, argf, argd, argstruct, argarray" \
@@ -524,10 +620,10 @@ proc gdb_trace_collection_test { } {
     gdb_collect_locals_test statlocal_test_func \
            "locc, loci, locf, locd, locst, locar" \
            "static locals individually"
-    
     gdb_collect_registers_test "\$regs"
-    gdb_collect_registers_test "\$fp, \$sp, \$pc"
+    gdb_collect_registers_test "\$$fpreg, \$$spreg, \$$pcreg"
     gdb_collect_globals_test
+    gdb_collect_global_in_pieces_test
     
     #
     # Expression tests:
@@ -602,22 +698,18 @@ proc gdb_trace_collection_test { } {
 
 }
 
-# Start with a fresh gdb.
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load $binfile
-if [target_info exists gdb_stub] {
-    gdb_step_for_stub;
+clean_restart $executable
+runto_main
+
+# We generously give ourselves one "pass" if we successfully
+# detect that this test cannot be run on this target!
+if { ![gdb_target_supports_trace] } then {
+    pass "Current target does not support trace"
+    return 1;
 }
+
 # Body of test encased in a proc so we can return prematurely.
 gdb_trace_collection_test
 
 # Finished!
-gdb_test "tfind none" "" ""
-
-
-
+gdb_test "tfind none" ".*" ""
This page took 0.028448 seconds and 4 git commands to generate.