7890fb4566
This patch adds support for AArch64 to the gdb.trace testsuite. Note that it does not add support for testing fast tracepoint as it isn't supported. Therefore the test cases with inline assembly are not ported in this patch, as we do not know what the conditions for inserting a fast tracepoint on AArch64 would be. gdb/testsuite/ChangeLog: * gdb.trace/backtrace.exp: Set registers for aarch64 target. * gdb.trace/collection.exp: Likewise. * gdb.trace/mi-trace-frame-collected.exp: Likewise. * gdb.trace/mi-trace-unavailable.exp: Likewise. * gdb.trace/report.exp: Likewise. * gdb.trace/trace-break.exp: Likewise. * gdb.trace/unavailable.exp: Likewise. * gdb.trace/while-dyn.exp: Likewise.
806 lines
25 KiB
Text
806 lines
25 KiB
Text
# Copyright 1998-2015 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/>.
|
|
|
|
load_lib "trace-support.exp"
|
|
|
|
|
|
standard_testfile
|
|
set executable $testfile
|
|
|
|
if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug nowarnings}]} {
|
|
return -1
|
|
}
|
|
|
|
# Tests:
|
|
# 1) $args
|
|
# 2) function args by name
|
|
# 3) $locs
|
|
# 4) function locals by name
|
|
# 5) $regs
|
|
# 6) registers by name ($sp, $fp?)
|
|
# 7) globals by name
|
|
# 8) expressions (lots of different kinds: local and global)
|
|
|
|
set ws "\[\r\n\t \]+"
|
|
set cr "\[\r\n\]+"
|
|
|
|
if [is_amd64_regs_target] {
|
|
set fpreg "rbp"
|
|
set spreg "rsp"
|
|
set pcreg "rip"
|
|
} elseif [is_x86_like_target] {
|
|
set fpreg "ebp"
|
|
set spreg "esp"
|
|
set pcreg "eip"
|
|
} elseif [is_aarch64_target] {
|
|
set fpreg "x29"
|
|
set spreg "sp"
|
|
set pcreg "pc"
|
|
} else {
|
|
set fpreg "fp"
|
|
set spreg "sp"
|
|
set pcreg "pc"
|
|
}
|
|
|
|
#
|
|
# Utility procs
|
|
#
|
|
|
|
proc test_register { reg test_id } {
|
|
global cr
|
|
global 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 $" {
|
|
pass "collect $test_id: collected $reg"
|
|
}
|
|
-re "\[Ee\]rror.*$gdb_prompt $" {
|
|
fail "collect $test_id: collected $reg (error)"
|
|
}
|
|
}
|
|
}
|
|
|
|
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 } {
|
|
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"
|
|
gdb_test "tstop" \
|
|
"\[\r\n\]+" \
|
|
"collect $msg: stop trace experiment"
|
|
gdb_test "tfind start" \
|
|
"#0 $test_func .*" \
|
|
"collect $msg: tfind test frame"
|
|
}
|
|
|
|
|
|
#
|
|
# Test procs
|
|
#
|
|
|
|
proc gdb_collect_args_test { myargs msg } {
|
|
global cr
|
|
global gdb_prompt
|
|
|
|
prepare_for_trace_test
|
|
|
|
gdb_test "trace args_test_func" \
|
|
"Tracepoint \[0-9\]+ at .*" \
|
|
"collect $msg: set tracepoint"
|
|
gdb_trace_setactions "collect $msg: define actions" \
|
|
"" \
|
|
"collect $myargs" "^$"
|
|
|
|
# Begin the test.
|
|
run_trace_experiment $msg args_test_func
|
|
|
|
# Frame arguments and their entry values are displayed correctly with
|
|
# various values of "print entry-values" when a trace frame is
|
|
# selected.
|
|
|
|
gdb_test "tfind -1" ".*" ""
|
|
gdb_test_no_output "set print entry-values only" ""
|
|
gdb_test "tfind 0" \
|
|
" \\(argc@entry=\[^,\]*, argi@entry=\[^,\]*, argf@entry=\[^,\]*, argd@entry=\[^,\]*, argstruct@entry=\[^,\]*, argarray@entry=\[^,\]*\\) .*" \
|
|
"collect $msg: tfind 0 with entry-values only"
|
|
|
|
gdb_test "tfind -1" ".*" ""
|
|
gdb_test_no_output "set print entry-values both" ""
|
|
gdb_test "tfind 0" \
|
|
" \\(argc=\[^,\]*, argc@entry=\[^,\]*, argi=\[^,\]*, argi@entry=\[^,\]*, argf=\[^,\]*, argf@entry=\[^,\]*, argd=\[^,\]*, argd@entry=\[^,\]*, argstruct=\[^,\]*, argstruct@entry=\[^,\]*, argarray=\[^,\]*, argarray@entry=\[^,\]*\\) .*" \
|
|
"collect $msg: tfind 0 with entry-values both"
|
|
|
|
gdb_test "print argc" \
|
|
"\\$\[0-9\]+ = 1 '.001'$cr" \
|
|
"collect $msg: collected arg char"
|
|
gdb_test "print argi" \
|
|
"\\$\[0-9\]+ = 2$cr" \
|
|
"collect $msg: collected arg int"
|
|
gdb_test "print argf" \
|
|
"\\$\[0-9\]+ = 3.\[23\]\[0-9\]*$cr" \
|
|
"collect $msg: collected arg float"
|
|
gdb_test "print argd" \
|
|
"\\$\[0-9\]+ = 4.\[34\]\[0-9\]*$cr" \
|
|
"collect $msg: collected arg double"
|
|
|
|
# struct arg as one of several args (near end of list)
|
|
gdb_test "print argstruct.memberc" \
|
|
"\\$\[0-9\]+ = 101 'e'$cr" \
|
|
"collect $msg: collected arg struct member char"
|
|
gdb_test "print argstruct.memberi" \
|
|
"\\$\[0-9\]+ = 102$cr" \
|
|
"collect $msg: collected arg struct member int"
|
|
gdb_test "print argstruct.memberf" \
|
|
"\\$\[0-9\]+ = 103.\[23\]\[0-9\]*$cr" \
|
|
"collect $msg: collected arg struct member float"
|
|
gdb_test "print argstruct.memberd" \
|
|
"\\$\[0-9\]+ = 104.\[34\]\[0-9\]*$cr" \
|
|
"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"
|
|
|
|
gdb_test "tfind none" \
|
|
"#0 end .*" \
|
|
"collect $msg: cease trace debugging"
|
|
}
|
|
|
|
proc gdb_collect_argstruct_test { myargs msg } {
|
|
global cr
|
|
global gdb_prompt
|
|
|
|
prepare_for_trace_test
|
|
|
|
gdb_test "trace argstruct_test_func" \
|
|
"Tracepoint \[0-9\]+ at .*" \
|
|
"collect $msg: set tracepoint"
|
|
gdb_trace_setactions "collect $msg: define actions" \
|
|
"" \
|
|
"collect $myargs" "^$"
|
|
|
|
# Begin the test.
|
|
run_trace_experiment $msg argstruct_test_func
|
|
|
|
# struct argument as only argument
|
|
gdb_test "print argstruct.memberc" \
|
|
"\\$\[0-9\]+ = 101 'e'$cr" \
|
|
"collect $msg: collected arg struct member char"
|
|
gdb_test "print argstruct.memberi" \
|
|
"\\$\[0-9\]+ = 102$cr" \
|
|
"collect $msg: collected arg struct member int"
|
|
gdb_test "print argstruct.memberf" \
|
|
"\\$\[0-9\]+ = 103.\[23\]\[0-9\]*$cr" \
|
|
"collect $msg: collected arg struct member float"
|
|
gdb_test "print argstruct.memberd" \
|
|
"\\$\[0-9\]+ = 104.\[34\]\[0-9\]*$cr" \
|
|
"collect $msg: collected arg struct member double"
|
|
|
|
gdb_test "tfind none" \
|
|
"#0 end .*" \
|
|
"collect $msg: cease trace debugging"
|
|
}
|
|
|
|
|
|
proc gdb_collect_argarray_test { myargs msg } {
|
|
global cr
|
|
global gdb_prompt
|
|
|
|
prepare_for_trace_test
|
|
|
|
gdb_test "trace argarray_test_func" \
|
|
"Tracepoint \[0-9\]+ at .*" \
|
|
"collect $msg: set tracepoint"
|
|
gdb_trace_setactions "collect $msg: define actions" \
|
|
"" \
|
|
"collect $myargs" "^$"
|
|
|
|
# Begin the test.
|
|
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"
|
|
|
|
gdb_test "tfind none" \
|
|
"#0 end .*" \
|
|
"collect $msg: cease trace debugging"
|
|
}
|
|
|
|
|
|
proc gdb_collect_locals_test { func mylocs msg } {
|
|
global cr
|
|
global gdb_prompt
|
|
|
|
prepare_for_trace_test
|
|
|
|
# Find the comment-identified line for setting this tracepoint.
|
|
set testline 0
|
|
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"
|
|
}
|
|
-re ".*$gdb_prompt " {
|
|
fail "collect $msg: find tracepoint line (skipping locals test)"
|
|
return
|
|
}
|
|
timeout {
|
|
fail "collect $msg: find tracepoint line (skipping locals test)"
|
|
return
|
|
}
|
|
}
|
|
|
|
gdb_test "trace $testline" \
|
|
"Tracepoint \[0-9\]+ at .*" \
|
|
"collect $msg: set tracepoint"
|
|
gdb_trace_setactions "collect $msg: define actions" \
|
|
"" \
|
|
"collect $mylocs" "^$"
|
|
|
|
# Begin the test.
|
|
run_trace_experiment $msg $func
|
|
|
|
gdb_test "print locc" \
|
|
"\\$\[0-9\]+ = 11 '.\[a-z0-7\]+'$cr" \
|
|
"collect $msg: collected local char"
|
|
gdb_test "print loci" \
|
|
"\\$\[0-9\]+ = 12$cr" \
|
|
"collect $msg: collected local int"
|
|
gdb_test "print locf" \
|
|
"\\$\[0-9\]+ = 13.\[23\]\[0-9\]*$cr" \
|
|
"collect $msg: collected local float"
|
|
gdb_test "print locd" \
|
|
"\\$\[0-9\]+ = 14.\[34\]\[0-9\]*$cr" \
|
|
"collect $msg: collected local double"
|
|
|
|
gdb_test "print locst.memberc" \
|
|
"\\$\[0-9\]+ = 15 '.017'$cr" \
|
|
"collect $msg: collected local member char"
|
|
gdb_test "print locst.memberi" \
|
|
"\\$\[0-9\]+ = 16$cr" \
|
|
"collect $msg: collected local member int"
|
|
gdb_test "print locst.memberf" \
|
|
"\\$\[0-9\]+ = 17.\[67\]\[0-9\]*$cr" \
|
|
"collect $msg: collected local member float"
|
|
gdb_test "print locst.memberd" \
|
|
"\\$\[0-9\]+ = 18.\[78\]\[0-9\]*$cr" \
|
|
"collect $msg: collected local member double"
|
|
|
|
gdb_test "print locar\[0\]" \
|
|
"\\$\[0-9\]+ = 121$cr" \
|
|
"collect $msg: collected locarray #0"
|
|
gdb_test "print locar\[1\]" \
|
|
"\\$\[0-9\]+ = 122$cr" \
|
|
"collect $msg: collected locarray #1"
|
|
gdb_test "print locar\[2\]" \
|
|
"\\$\[0-9\]+ = 123$cr" \
|
|
"collect $msg: collected locarray #2"
|
|
gdb_test "print locar\[3\]" \
|
|
"\\$\[0-9\]+ = 124$cr" \
|
|
"collect $msg: collected locarray #3"
|
|
|
|
|
|
gdb_test "tfind none" \
|
|
"#0 end .*" \
|
|
"collect $msg: cease trace debugging"
|
|
}
|
|
|
|
proc gdb_collect_registers_test { myregs } {
|
|
global cr
|
|
global gdb_prompt
|
|
global fpreg
|
|
global spreg
|
|
global pcreg
|
|
|
|
prepare_for_trace_test
|
|
|
|
# We'll simply re-use the args_test_function for this test
|
|
gdb_test "trace args_test_func" \
|
|
"Tracepoint \[0-9\]+ at .*" \
|
|
"collect $myregs: set tracepoint"
|
|
gdb_trace_setactions "collect $myregs: define actions" \
|
|
"" \
|
|
"collect $myregs" "^$"
|
|
|
|
# Begin the test.
|
|
run_trace_experiment $myregs args_test_func
|
|
|
|
test_register "\$$fpreg" $myregs
|
|
test_register "\$$spreg" $myregs
|
|
test_register "\$$pcreg" $myregs
|
|
|
|
gdb_test "tfind none" \
|
|
"#0 end .*" \
|
|
"collect $myregs: cease trace debugging"
|
|
}
|
|
|
|
proc gdb_collect_expression_test { func expr val msg } {
|
|
global cr
|
|
global gdb_prompt
|
|
|
|
prepare_for_trace_test
|
|
|
|
# Find the comment-identified line for setting this tracepoint.
|
|
set testline 0
|
|
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"
|
|
}
|
|
-re ".*$gdb_prompt " {
|
|
fail "collect $msg: find tracepoint line (skipping locals test)"
|
|
return
|
|
}
|
|
timeout {
|
|
fail "collect $msg: find tracepoint line (skipping locals test)"
|
|
return
|
|
}
|
|
}
|
|
|
|
gdb_test "trace $testline" \
|
|
"Tracepoint \[0-9\]+ at .*" \
|
|
"collect $msg: set tracepoint"
|
|
gdb_trace_setactions "collect $msg: define actions" \
|
|
"" \
|
|
"collect $expr" "^$"
|
|
|
|
# Begin the test.
|
|
run_trace_experiment $msg $func
|
|
|
|
gdb_test "print $expr" \
|
|
"\\$\[0-9\]+ = $val$cr" \
|
|
"collect $msg: got expected value '$val'"
|
|
|
|
gdb_test "tfind none" \
|
|
"#0 end .*" \
|
|
"collect $msg: cease trace debugging"
|
|
}
|
|
|
|
proc gdb_collect_globals_test { } {
|
|
global cr
|
|
global gdb_prompt
|
|
|
|
prepare_for_trace_test
|
|
|
|
# Find the comment-identified line for setting this tracepoint.
|
|
set testline 0
|
|
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"
|
|
}
|
|
-re ".*$gdb_prompt " {
|
|
fail "collect globals: find tracepoint line (skipping global test)"
|
|
return
|
|
}
|
|
timeout {
|
|
fail "collect globals: find tracepoint line (skipping global test)"
|
|
return
|
|
}
|
|
}
|
|
|
|
# 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 \{int \[4\]\}$globalarr2_addr" "^$" \
|
|
"collect \{int \[2\]\}$globalarr2_addr" "^$" \
|
|
"collect \{int \[4\]\}globalarr3" "^$"
|
|
|
|
# Begin the test.
|
|
run_trace_experiment "globals" globals_test_func
|
|
|
|
gdb_test "print globalc" \
|
|
"\\$\[0-9\]+ = 71 'G'$cr" \
|
|
"collect globals: collected global char"
|
|
gdb_test "print globali" \
|
|
"\\$\[0-9\]+ = 72$cr" \
|
|
"collect globals: collected global int"
|
|
gdb_test "print globalf" \
|
|
"\\$\[0-9\]+ = 73.\[23\]\[0-9\]*$cr" \
|
|
"collect globals: collected global float"
|
|
gdb_test "print globald" \
|
|
"\\$\[0-9\]+ = 74.\[34\]\[0-9\]*$cr" \
|
|
"collect globals: collected global double"
|
|
|
|
gdb_test "print globalstruct.memberc" \
|
|
"\\$\[0-9\]+ = 81 'Q'$cr" \
|
|
"collect globals: collected struct char member"
|
|
gdb_test "print globalstruct.memberi" \
|
|
"\\$\[0-9\]+ = 82$cr" \
|
|
"collect globals: collected struct member int"
|
|
gdb_test "print globalstruct.memberf" \
|
|
"\\$\[0-9\]+ = 83.\[23\]\[0-9\]*$cr" \
|
|
"collect globals: collected struct member float"
|
|
gdb_test "print globalstruct.memberd" \
|
|
"\\$\[0-9\]+ = 84.\[34\]\[0-9\]*$cr" \
|
|
"collect globals: collected struct member double"
|
|
|
|
gdb_test "print globalp == &globalstruct" \
|
|
"\\$\[0-9\]+ = 1$cr" \
|
|
"collect globals: collected global pointer"
|
|
|
|
gdb_test "print globalarr\[1\]" \
|
|
"\\$\[0-9\]+ = 1$cr" \
|
|
"collect globals: collected global array element #1"
|
|
gdb_test "print globalarr\[2\]" \
|
|
"\\$\[0-9\]+ = 2$cr" \
|
|
"collect globals: collected global array element #2"
|
|
gdb_test "print globalarr\[3\]" \
|
|
"\\$\[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"
|
|
}
|
|
|
|
# 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
|
|
|
|
prepare_for_trace_test
|
|
|
|
# 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"
|
|
}
|
|
}
|
|
|
|
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_collect_return_test { } {
|
|
global gdb_prompt
|
|
|
|
prepare_for_trace_test
|
|
|
|
# We'll simply re-use the args_test_function for this test
|
|
gdb_test "trace args_test_func" \
|
|
"Tracepoint \[0-9\]+ at .*" \
|
|
"collect \$_ret: set tracepoint"
|
|
gdb_trace_setactions "collect \$_ret: define actions" \
|
|
"" \
|
|
"collect \$_ret" "^$"
|
|
|
|
# Begin the test.
|
|
run_trace_experiment \$_ret args_test_func
|
|
|
|
# Since we can't guarantee that $_ret will give us the caller,
|
|
# pass either way, but giving different messages.
|
|
gdb_test_multiple "backtrace" "" {
|
|
-re ".*#1 .* in main .*\r\n$gdb_prompt $" {
|
|
pass "collect \$_ret: backtrace lists main"
|
|
}
|
|
-re ".*#1 .* in ?? .*\r\n$gdb_prompt $" {
|
|
pass "collect \$_ret: backtrace not listing main"
|
|
}
|
|
}
|
|
|
|
gdb_test "tfind none" \
|
|
"#0 end .*" \
|
|
"collect \$_ret: cease trace debugging"
|
|
}
|
|
|
|
proc gdb_collect_strings_test { func mystr myrslt mylim msg } {
|
|
global hex
|
|
global cr
|
|
global gdb_prompt
|
|
|
|
prepare_for_trace_test
|
|
|
|
# Find the comment-identified line for setting this tracepoint.
|
|
set testline 0
|
|
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"
|
|
}
|
|
-re ".*$gdb_prompt " {
|
|
fail "collect $msg: find tracepoint line (skipping strings test)"
|
|
return
|
|
}
|
|
timeout {
|
|
fail "collect $msg: find tracepoint line (skipping strings test)"
|
|
return
|
|
}
|
|
}
|
|
|
|
gdb_test "trace $testline" \
|
|
"Tracepoint \[0-9\]+ at .*" \
|
|
"collect $msg: set tracepoint"
|
|
gdb_trace_setactions "collect $msg: define actions" \
|
|
"" \
|
|
"collect/s$mylim $mystr" "^$"
|
|
|
|
# Begin the test.
|
|
run_trace_experiment $msg $func
|
|
|
|
gdb_test "print $mystr" \
|
|
"\\$\[0-9\]+ = $hex \"$myrslt\".*$cr" \
|
|
"collect $msg: collected local string"
|
|
|
|
gdb_test "tfind none" \
|
|
"#0 end .*" \
|
|
"collect $msg: 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" \
|
|
"args individually"
|
|
gdb_collect_argstruct_test "\$args" \
|
|
"argstruct collectively"
|
|
gdb_collect_argstruct_test "argstruct" \
|
|
"argstruct individually"
|
|
gdb_collect_argarray_test "\$args" \
|
|
"argarray collectively"
|
|
gdb_collect_argarray_test "argarray" \
|
|
"argarray individually"
|
|
gdb_collect_locals_test local_test_func "\$locals" \
|
|
"auto locals collectively"
|
|
gdb_collect_locals_test local_test_func \
|
|
"locc, loci, locf, locd, locst, locar" \
|
|
"auto locals individually"
|
|
gdb_collect_locals_test reglocal_test_func "\$locals" \
|
|
"register locals collectively"
|
|
gdb_collect_locals_test reglocal_test_func \
|
|
"locc, loci, locf, locd, locst, locar" \
|
|
"register locals individually"
|
|
gdb_collect_locals_test statlocal_test_func "\$locals" \
|
|
"static locals collectively"
|
|
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 "\$$fpreg, \$$spreg, \$$pcreg"
|
|
gdb_collect_globals_test
|
|
gdb_collect_global_in_pieces_test
|
|
|
|
#
|
|
# Expression tests:
|
|
#
|
|
# *x (**x, ...)
|
|
# x.y (x.y.z, ...)
|
|
# x->y (x->y->z, ...)
|
|
# x[2] (x[2][3], ...) (const index)
|
|
# x[y] (x[y][z], ...) (index to be char, short, long, float, double)
|
|
# NOTE:
|
|
# We test the following operators by using them in an array index
|
|
# expression -- because the naked result of an operator is not really
|
|
# collected. To be sure the operator was evaluated correctly on the
|
|
# target, we have to actually use the result eg. in an array offset
|
|
# calculation.
|
|
# x[y + z] (tests addition: y and z various combos of types, sclasses)
|
|
# x[y - z] (tests subtraction) (ditto)
|
|
# x[y * z] (tests multiplication) (ditto)
|
|
# x[y / z] (tests division) (ditto)
|
|
# x[y % z] (tests modulo division) (ditto)
|
|
# x[y == z] (tests equality relation) (ditto) UNSUPPORTED
|
|
# x[y != z] (tests inequality relation) (ditto) UNSUPPORTED
|
|
# x[y > z] (tests greater-than relation) (ditto) UNSUPPORTED
|
|
# x[y < z] (tests less-than relation) (ditto) UNSUPPORTED
|
|
# x[y >= z] (tests greater-than-or-equal relation) (ditto) UNSUPPORTED
|
|
# x[y <= z] (tests less-than-or-equal relation) (ditto) UNSUPPORTED
|
|
# x[y && z] (tests logical and) (ditto) UNSUPPORTED
|
|
# x[y || z] (tests logical or) (ditto) UNSUPPORTED
|
|
# x[y & z] (tests binary and) (ditto) UNSUPPORTED
|
|
# x[y | z] (tests binary or) (ditto) UNSUPPORTED
|
|
# x[y ^ z] (tests binary xor) (ditto) UNSUPPORTED
|
|
# x[y ? z1 : z2] (tests ternary operator) (ditto) UNSUPPORTED
|
|
# x[y << z] (tests shift-left) (ditto) UNSUPPORTED
|
|
# x[y >> z] (tests shift-right) (ditto) UNSUPPORTED
|
|
# x[y = z] (tests assignment operator) (ditto) UNSUPPORTED
|
|
# x[++y] (tests pre-increment operator) (ditto) UNSUPPORTED
|
|
# x[--y] (tests pre-decrement operator) (ditto) UNSUPPORTED
|
|
# x[y++] (tests post-increment operator) (ditto) UNSUPPORTED
|
|
# x[y--] (tests post-decrement operator) (ditto) UNSUPPORTED
|
|
# x[+y] (tests unary plus) (ditto)
|
|
# x[-y] (tests unary minus) (ditto)
|
|
# x[!y] (tests logical not) (ditto) UNSUPPORTED
|
|
# x[~y] (tests binary not) (ditto) UNSUPPORTED
|
|
# x[(y, z)] (tests comma expression) (ditto)
|
|
# cast expr
|
|
# stack data
|
|
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalstruct.memberi" "82" "a.b"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalp->memberc" "81 'Q'" "a->b"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[2\]" "2" "a\[2\]"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[l3\]" "3" "a\[b\]"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[l3 + l2\]" "5" "a\[b + c\]"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[l3 - l2\]" "1" "a\[b - c\]"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[l3 * l2\]" "6" "a\[b * c\]"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[l6 / l3\]" "2" "a\[b / c\]"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[l7 % l3\]" "1" "a\[b % c\]"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[+l1\]" "1" "a\[+b\]"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[-lminus\]" "2" "a\[-b\]"
|
|
gdb_collect_expression_test globals_test_func \
|
|
"globalarr\[\(l6, l7\)\]" "7" "a\[\(b, c\)\]"
|
|
|
|
gdb_collect_return_test
|
|
|
|
gdb_collect_strings_test strings_test_func "locstr" "abcdef" "" \
|
|
"local string"
|
|
|
|
gdb_collect_strings_test strings_test_func "longloc" "how now brown c" 15 \
|
|
"long local string"
|
|
|
|
}
|
|
|
|
runto_main
|
|
|
|
if { ![gdb_target_supports_trace] } then {
|
|
unsupported "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" ".*" ""
|