aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2020-03-20 19:32:07 +0100
committerTom de Vries <tdevries@suse.de>2020-03-20 19:32:07 +0100
commitc623cc90890de9958bcee382cc60ff1b605532ab (patch)
tree25fb53e368a2d236887304a82d9618e61c7419fa
parentc884cc46193c98fd0b90ce8a79c081f6a1c18cc6 (diff)
downloadbinutils-c623cc90890de9958bcee382cc60ff1b605532ab.zip
binutils-c623cc90890de9958bcee382cc60ff1b605532ab.tar.gz
binutils-c623cc90890de9958bcee382cc60ff1b605532ab.tar.bz2
[gdb/testsuite] Fix gdb.threads/omp-par-scope.exp XPASS
When running test-case gdb.threads/omp-par-scope.exp, I get this XPASS: ... XPASS: gdb.threads/omp-par-scope.exp: nested_parallel: outer_threads: \ outer stop: get valueof "num" ... for test: ... set thread_num [get_valueof "" "num" "unknown"] ... The intention of the test is to get the value of local variable num, which has been set to: ... int num = omp_get_thread_num (); ... but the actually printed value is 'num': ... (gdb) print num^M $76 = num^M ... This is due to the fact that num is missing in the locals, so instead we find the enum member 'num' of enum expression_operator in glibc/intl/plural-exp.h. Fix this by getting the value using a new proc get_local_valueof, which uses the "info locals" commands to get the value. Tested on x86_64-linux, with gcc 7.5.0 (where the test xfails) and gcc 10.0.1 (where the test passes).
-rw-r--r--gdb/testsuite/gdb.threads/omp-par-scope.exp4
-rw-r--r--gdb/testsuite/lib/gdb.exp24
2 files changed, 27 insertions, 1 deletions
diff --git a/gdb/testsuite/gdb.threads/omp-par-scope.exp b/gdb/testsuite/gdb.threads/omp-par-scope.exp
index 16441d3..c70eef4 100644
--- a/gdb/testsuite/gdb.threads/omp-par-scope.exp
+++ b/gdb/testsuite/gdb.threads/omp-par-scope.exp
@@ -273,7 +273,9 @@ with_test_prefix "nested_parallel" {
gdb_continue_to_breakpoint "at printf"
if {$have_older_gcc} { setup_xfail "*-*-*" }
- set thread_num [get_valueof "" "num" "unknown"]
+ # Use get_local_valueof instead of get_valueof to avoid picking up
+ # some random 'num' in a shared library.
+ set thread_num [get_local_valueof "num" "unknown"]
gdb_test "print file_scope_var" "= 9876"
if {$have_older_gcc} { setup_xfail "*-*-*" }
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index b14b3a9..e17ac0e 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -6173,6 +6173,30 @@ proc get_valueof { fmt exp default {test ""} } {
return ${val}
}
+# Retrieve the value of local var EXP in the inferior. DEFAULT is used as
+# fallback if print fails. TEST is the test message to use. It can be
+# omitted, in which case a test message is built from EXP.
+
+proc get_local_valueof { exp default {test ""} } {
+ global gdb_prompt
+
+ if {$test == "" } {
+ set test "get local valueof \"${exp}\""
+ }
+
+ set val ${default}
+ gdb_test_multiple "info locals ${exp}" "$test" {
+ -re "$exp = (\[^\r\n\]*)\[\r\n\]*$gdb_prompt $" {
+ set val $expect_out(1,string)
+ pass "$test"
+ }
+ timeout {
+ fail "$test (timeout)"
+ }
+ }
+ return ${val}
+}
+
# Retrieve the value of EXP in the inferior, as a signed decimal value
# (using "print /d"). DEFAULT is used as fallback if print fails.
# TEST is the test message to use. It can be omitted, in which case