From c623cc90890de9958bcee382cc60ff1b605532ab Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Fri, 20 Mar 2020 19:32:07 +0100 Subject: [PATCH] [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). --- gdb/testsuite/gdb.threads/omp-par-scope.exp | 4 +++- gdb/testsuite/lib/gdb.exp | 24 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/gdb/testsuite/gdb.threads/omp-par-scope.exp b/gdb/testsuite/gdb.threads/omp-par-scope.exp index 16441d3ec68..c70eef42808 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 b14b3a968e1..e17ac0ef75b 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 -- 2.30.2