aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/stap-probe.c7
-rw-r--r--gdb/testsuite/ChangeLog11
-rw-r--r--gdb/testsuite/gdb.base/stap-probe.c2
-rw-r--r--gdb/testsuite/gdb.base/stap-probe.exp38
5 files changed, 55 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 425bafa..0e5c8a9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2020-01-10 George Barrett <bob@bob131.so>
+
+ * stap-probe.c (stap_modify_semaphore): Don't check for null
+ semaphores.
+ (stap_probe::set_semaphore, stap_probe::clear_semaphore): Check
+ for null semaphores.
+
2020-01-09 Andrew Burgess <andrew.burgess@embecosm.com>
* tui/tui-source.c (tui_source_window::do_scroll_vertical): Update
diff --git a/gdb/stap-probe.c b/gdb/stap-probe.c
index 5e9a043..50f6d51 100644
--- a/gdb/stap-probe.c
+++ b/gdb/stap-probe.c
@@ -1430,9 +1430,6 @@ stap_modify_semaphore (CORE_ADDR address, int set, struct gdbarch *gdbarch)
struct type *type = builtin_type (gdbarch)->builtin_unsigned_short;
ULONGEST value;
- if (address == 0)
- return;
-
/* Swallow errors. */
if (target_read_memory (address, bytes, TYPE_LENGTH (type)) != 0)
{
@@ -1466,6 +1463,8 @@ stap_modify_semaphore (CORE_ADDR address, int set, struct gdbarch *gdbarch)
void
stap_probe::set_semaphore (struct objfile *objfile, struct gdbarch *gdbarch)
{
+ if (m_sem_addr == 0)
+ return;
stap_modify_semaphore (relocate_address (m_sem_addr, objfile), 1, gdbarch);
}
@@ -1474,6 +1473,8 @@ stap_probe::set_semaphore (struct objfile *objfile, struct gdbarch *gdbarch)
void
stap_probe::clear_semaphore (struct objfile *objfile, struct gdbarch *gdbarch)
{
+ if (m_sem_addr == 0)
+ return;
stap_modify_semaphore (relocate_address (m_sem_addr, objfile), 0, gdbarch);
}
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 84fa9ae..29d6af2 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,16 @@
2020-01-10 George Barrett <bob@bob131.so>
+ * gdb.base/stap-probe.c (relocation_marker): Add dummy variable
+ to help in finding the image relocation offset.
+ * gdb.base/stap-probe.exp (stap_test): Accept arbitrary compile
+ options in arguments.
+ (stap_test_no_debuginfo): Likewise.
+ (stap-probe-nosem-noopt-pie, stap-probe-nosem-noopt-nopie): Add
+ test variants.
+ (stap_test): Add null semaphore relocation test.
+
+2020-01-10 George Barrett <bob@bob131.so>
+
* gdb.base/stap-probe.c: Rename USE_PROBES to USE_SEMAPHORES.
* gdb.base/stap-probe.exp: Likewise.
(stap_test): Pass argument as an additional flag.
diff --git a/gdb/testsuite/gdb.base/stap-probe.c b/gdb/testsuite/gdb.base/stap-probe.c
index 3d742d1..5cb5494 100644
--- a/gdb/testsuite/gdb.base/stap-probe.c
+++ b/gdb/testsuite/gdb.base/stap-probe.c
@@ -31,6 +31,8 @@ __extension__ unsigned short test_pstr_semaphore __attribute__ ((unused)) __attr
__extension__ unsigned short test_ps_semaphore __attribute__ ((unused)) __attribute__ ((section (".probes")));
#else
+int relocation_marker __attribute__ ((unused));
+
#define TEST 1
#define TEST2 1
diff --git a/gdb/testsuite/gdb.base/stap-probe.exp b/gdb/testsuite/gdb.base/stap-probe.exp
index fce5286..398bc89 100644
--- a/gdb/testsuite/gdb.base/stap-probe.exp
+++ b/gdb/testsuite/gdb.base/stap-probe.exp
@@ -18,14 +18,20 @@ standard_testfile
# 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.
-proc stap_test {exec_name {arg ""}} {
+proc stap_test {exec_name {args ""}} {
global testfile hex srcfile
if {[prepare_for_testing "failed to prepare" ${exec_name} $srcfile \
- [concat additional_flags=$arg debug]]} {
+ [concat $args debug]]} {
return -1
}
+ 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"]
+ }
+
if ![runto_main] {
return -1
}
@@ -33,7 +39,7 @@ proc stap_test {exec_name {arg ""}} {
gdb_test "print \$_probe_argc" "No probe at PC $hex" \
"check argument not at probe point"
- if {[string first "-DUSE_SEMAPHORES" $arg] != -1} {
+ if {[string first "-DUSE_SEMAPHORES" $args] != -1} {
gdb_test "info probes stap" \
"test *user *$hex *$hex .*"
} else {
@@ -47,6 +53,20 @@ proc stap_test {exec_name {arg ""}} {
fail "run to -pstap test:user"
}
+ if {[string first "-DUSE_SEMAPHORES" $args] == -1} {
+ set relocation_base \
+ [expr [get_hexadecimal_valueof "&relocation_marker" "0"] - $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
+ # semaphore address and increment the value at that address, we
+ # would expect to see "\200ELF" here instead.
+ gdb_test "p (*(char*) $relocation_base)@4" \
+ " = \"\\\\177ELF\"" \
+ "null semaphore relocation"
+ }
+ }
+
# Test probe arguments.
gdb_test "print \$_probe_argc" " = 1" \
"print \$_probe_argc for probe user"
@@ -97,11 +117,11 @@ proc stap_test {exec_name {arg ""}} {
return 0
}
-proc stap_test_no_debuginfo {exec_name {arg ""}} {
+proc stap_test_no_debuginfo {exec_name {args ""}} {
global testfile hex
if {[prepare_for_testing "failed to prepare" ${exec_name} ${testfile}.c \
- [concat additional_flags=$arg nodebug optimize=-O2]]} {
+ [concat $args nodebug optimize=-O2]]} {
return -1
}
@@ -168,10 +188,14 @@ with_test_prefix "without semaphore, not optimized" {
untested "stap probe test failed"
return -1
}
+
+ foreach_with_prefix pie { "nopie" "pie" } {
+ stap_test "stap-probe-nosem-noopt-$pie" $pie
+ }
}
with_test_prefix "with semaphore, not optimized" {
- stap_test "stap-probe-sem-noopt" "-DUSE_SEMAPHORES"
+ stap_test "stap-probe-sem-noopt" additional_flags=-DUSE_SEMAPHORES
}
with_test_prefix "without semaphore, optimized" {
@@ -179,5 +203,5 @@ with_test_prefix "without semaphore, optimized" {
}
with_test_prefix "with semaphore, optimized" {
- stap_test_no_debuginfo "stap-probe-sem-opt" "-DUSE_SEMAPHORES"
+ stap_test_no_debuginfo "stap-probe-sem-opt" additional_flags=-DUSE_SEMAPHORES
}