summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/stap-probe.exp
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite/gdb.base/stap-probe.exp')
-rw-r--r--gdb/testsuite/gdb.base/stap-probe.exp146
1 files changed, 138 insertions, 8 deletions
diff --git a/gdb/testsuite/gdb.base/stap-probe.exp b/gdb/testsuite/gdb.base/stap-probe.exp
index 6d521870c10..31a054840a5 100644
--- a/gdb/testsuite/gdb.base/stap-probe.exp
+++ b/gdb/testsuite/gdb.base/stap-probe.exp
@@ -15,6 +15,98 @@
standard_testfile
+# Count the number of probes of TYPE (either 'stap' or 'dtrace'),
+# from provider matching PROVIDER, with a name matching NAME, and from
+# an objec file matching OBJECT.
+#
+# The OBJECT is optional, in which case all objects will be matched.
+#
+# If any error condition is detected, then perror is called, and -1
+# returned.
+#
+# Otherwise, returns an integer, 0 or greater.
+proc gdb_count_probes { type provider name { object "" }} {
+ set cmd "info probes ${type} ${provider} ${name}"
+ if { $object != "" } {
+ set cmd "$cmd ${object}"
+ }
+
+ set probe_count 0
+ set no_probes_line false
+ gdb_test_multiple $cmd "" {
+ -re "^$cmd\r\n" {
+ exp_continue
+ }
+ -re "^Type\\s+Provider\\s+Name\\s+Where\\s+Semaphore\\s+Object\\s*\r\n" {
+ exp_continue
+ }
+ -re "^\\s*\r\n" {
+ exp_continue
+ }
+ -re "^stap\[^\r\n\]+\r\n" {
+ incr probe_count
+ exp_continue
+ }
+ -re "^dtrace\[^\r\n\]+\r\n" {
+ incr probe_count
+ exp_continue
+ }
+ -re "^No probes matched\\.\r\n" {
+ set no_probes_line true
+ exp_continue
+ }
+ -re "^$::gdb_prompt $" {
+ pass $gdb_test_name
+ }
+ }
+
+ if { [expr $no_probes_line && $probe_count > 0] \
+ || [expr !$no_probes_line && $probe_count == 0] } {
+ perror "Mismatch between no probes found line, and probes count"
+ return -1
+ }
+
+ return $probe_count
+}
+
+proc check_for_usable_xmm0_probe { binfile } {
+ set readelf_program [gdb_find_readelf]
+ set binfile [standard_output_file $binfile]
+ set command "exec $readelf_program -n $binfile"
+ verbose -log "command is $command"
+ set result [catch $command output]
+ verbose -log "result is $result"
+ verbose -log "output is $output"
+
+ # We don't actually check RESULT. Sometimes readelf gives
+ # warnings about gaps in some of the notes data. This is
+ # unrelated to the staps probes, but still causes readelf to exit
+ # with non-zero status.
+ #
+ # Instead, just check the output. If readelf failed to run then
+ # the output will be empty, and the following regexps will fail to
+ # match.
+
+ # First, look for the xmmreg probe, and if we find it, grab the
+ # argument string.
+ if ![regexp {\n\s+Provider: test\n\s+Name: xmmreg\n[^\n]+\n\s+Arguments: ([^\n]+)\n} $output ignore arguments] {
+ verbose -log "APB: Couldn't find probe at all"
+ return false
+ }
+
+ verbose -log "APB: Matched on '$ignore'"
+ verbose -log "APB: arguments: '$arguments'"
+
+ # Check the the argument string mentions xmm0.
+ if ![regexp {@%?xmm0} $arguments] {
+ verbose -log "APB: Prove doesn't use xmm0 register"
+ return false
+ }
+
+ # Success! We have a probe that uses xmm0 for an argument.
+ return true
+}
+
# Run the tests. We run the tests two different ways: once with a
# plain probe, and once with a probe that has an associated semaphore.
# This returns -1 on failure to compile or start, 0 otherwise.
@@ -29,7 +121,9 @@ proc stap_test {exec_name {args ""}} {
set semaphore_addr_var ""
if {[string first "-DUSE_SEMAPHORES" $args] == -1} {
gdb_test_no_output "set breakpoint always-inserted on"
- set semaphore_addr_var [get_hexadecimal_valueof "&relocation_marker" "0"]
+ set semaphore_addr_var \
+ [get_hexadecimal_valueof "&relocation_marker" "0"\
+ "get original address of relocation_marker"]
}
if ![runto_main] {
@@ -40,10 +134,10 @@ proc stap_test {exec_name {args ""}} {
"check argument not at probe point"
if {[string first "-DUSE_SEMAPHORES" $args] != -1} {
- gdb_test "info probes stap" \
+ gdb_test_lines "info probes stap" "" \
"test *user *$hex *$hex .*"
} else {
- gdb_test "info probes stap" \
+ gdb_test_lines "info probes stap" "" \
"test *user *$hex .*"
}
@@ -54,8 +148,11 @@ proc stap_test {exec_name {args ""}} {
}
if {[string first "-DUSE_SEMAPHORES" $args] == -1} {
+ set updated_semaphore_addr_var \
+ [get_hexadecimal_valueof "&relocation_marker" \
+ "0" "get revised relocation_marker address"]
set relocation_base \
- [expr [get_hexadecimal_valueof "&relocation_marker" "0"] - $semaphore_addr_var]
+ [expr $updated_semaphore_addr_var - $semaphore_addr_var]
if {$relocation_base != 0} {
# Checks that GDB doesn't mistakenly relocate and write to null
# semaphore addresses. If it were to relocate a zero-valued
@@ -103,9 +200,9 @@ proc stap_test {exec_name {args ""}} {
# Reinit GDB, set a breakpoint on probe ps.
delete_breakpoints
if {[runto "-pstap test:ps"]} {
- pass "run to -pstap test:m4"
+ pass "run to -pstap test:ps"
} else {
- fail "run to -pstap test:m4"
+ fail "run to -pstap test:ps"
}
gdb_test "print \$_probe_argc" " = 3" \
@@ -114,6 +211,24 @@ proc stap_test {exec_name {args ""}} {
" = $hex .This is another test message.*" \
"print \$_probe_arg1 for probe ps"
+ # Check the probe is using the xmm0 register.
+ if [check_for_usable_xmm0_probe $exec_name] {
+
+ delete_breakpoints
+ if {[runto "-pstap test:xmmreg"]} {
+ pass "run to -pstap test:xmmreg"
+ } else {
+ fail "run to -pstap test:xmmreg"
+ }
+
+ gdb_test "print \$_probe_argc" " = 1" \
+ "print \$_probe_argc for probe xmmreg"
+ gdb_test "print/x \$_probe_arg0" " = 0x1234" \
+ "check \$_probe_arg0 for probe xmmreg"
+ } else {
+ unsupported "print probe argument from \$xmm0 register"
+ }
+
return 0
}
@@ -169,9 +284,9 @@ proc stap_test_no_debuginfo {exec_name {args ""}} {
# Reinit GDB, set a breakpoint on probe ps.
delete_breakpoints
if {[runto "-pstap test:ps"]} {
- pass "run to -pstap test:m4"
+ pass "run to -pstap test:ps"
} else {
- fail "run to -pstap test:m4"
+ fail "run to -pstap test:ps"
}
gdb_test "print \$_probe_argc" " = 3" \
@@ -180,6 +295,21 @@ proc stap_test_no_debuginfo {exec_name {args ""}} {
" = $hex .This is another test message.*" \
"print \$_probe_arg1 for probe ps"
+ # Reinit GDB, set a breakpoint on probe ps.
+ if { [gdb_count_probes stap test xmmreg] > 0 } {
+ delete_breakpoints
+ if {[runto "-pstap test:xmmreg"]} {
+ pass "run to -pstap test:xmmreg"
+ } else {
+ fail "run to -pstap test:xmmreg"
+ }
+
+ gdb_test "print \$_probe_argc" " = 1" \
+ "print \$_probe_argc for probe xmmreg"
+ gdb_test "print/x \$_probe_arg0" " = 0x1234" \
+ "check \$_probe_arg0 for probe xmmreg"
+ }
+
return 0
}