[gdb/testsuite] Fix gdb.threads/omp-par-scope.exp XPASS
authorTom de Vries <tdevries@suse.de>
Fri, 20 Mar 2020 18:32:07 +0000 (19:32 +0100)
committerTom de Vries <tdevries@suse.de>
Fri, 20 Mar 2020 18:32:07 +0000 (19:32 +0100)
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).

gdb/testsuite/gdb.threads/omp-par-scope.exp
gdb/testsuite/lib/gdb.exp

index 16441d3ec68d2d0c2e3e92a5a919e1d32140d595..c70eef428083b21f11da48a32b4f65cbb661c06b 100644 (file)
@@ -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 "*-*-*" }
index b14b3a968e19a3f3c234a2197af330eae3075e05..e17ac0ef75be4613d72b2bd92d540fa50cc77f33 100644 (file)
@@ -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