omp-par-scope.exp revision 1.1.1.4 1 1.1.1.3 christos # Copyright 2017-2024 Free Software Foundation, Inc.
2 1.1 christos
3 1.1 christos # This program is free software; you can redistribute it and/or modify
4 1.1 christos # it under the terms of the GNU General Public License as published by
5 1.1 christos # the Free Software Foundation; either version 3 of the License, or
6 1.1 christos # (at your option) any later version.
7 1.1 christos #
8 1.1 christos # This program is distributed in the hope that it will be useful,
9 1.1 christos # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 1.1 christos # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 1.1 christos # GNU General Public License for more details.
12 1.1 christos #
13 1.1 christos # You should have received a copy of the GNU General Public License
14 1.1 christos # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 1.1 christos
16 1.1 christos # This file is part of the gdb testsuite.
17 1.1 christos
18 1.1 christos # Tests which verify (or not) that GDB can access in-scope variables
19 1.1 christos # when stopped within an OpenMP parallel region.
20 1.1 christos
21 1.1 christos standard_testfile
22 1.1 christos
23 1.1.1.4 christos if { [test_compiler_info "clang*"] } {
24 1.1.1.4 christos # Clang doesn't add OpenMP information in the correct scope,
25 1.1.1.4 christos # so all relevant tests here will fail. See here for more info:
26 1.1.1.4 christos # https://github.com/llvm/llvm-project/issues/44236
27 1.1.1.4 christos unsupported "Clang doesn't provide required info for the test"
28 1.1.1.4 christos return
29 1.1.1.4 christos }
30 1.1.1.4 christos
31 1.1 christos set have_nested_function_support 0
32 1.1 christos set opts {openmp debug}
33 1.1 christos if [support_nested_function_tests] {
34 1.1 christos lappend opts "additional_flags=-DHAVE_NESTED_FUNCTION_SUPPORT"
35 1.1 christos set have_nested_function_support 1
36 1.1 christos }
37 1.1 christos
38 1.1 christos if {[prepare_for_testing "failed to prepare" $testfile $srcfile $opts]} {
39 1.1 christos return -1
40 1.1 christos }
41 1.1 christos
42 1.1 christos # gdb_openmp_setup may be defined to set auto-load safe-path and possibly
43 1.1 christos # sysroot. These settings are required for gdb to be able to find
44 1.1 christos # the libgomp python plugin. (sysroot only needs to be defined for
45 1.1 christos # remote debugging.)
46 1.1 christos #
47 1.1 christos # This approach has both pros and cons. On the plus side, it's easy
48 1.1 christos # to automatically set a precise auto-load safe-path. (It's easy because
49 1.1 christos # the output of ldd on the binary may be examined to learn the location
50 1.1 christos # of libgomp.so.)
51 1.1 christos #
52 1.1 christos # However, making these settings is also a drawback due to potentially
53 1.1 christos # overriding settings made by a board file. Therefore, this proc
54 1.1 christos # is optional and will only be called if it's defined.
55 1.1 christos
56 1.1 christos if {[info procs gdb_openmp_setup] != ""} {
57 1.1 christos if {[gdb_openmp_setup $binfile] != ""} {
58 1.1 christos untested "could not set up OpenMP environment"
59 1.1 christos return -1
60 1.1 christos }
61 1.1 christos }
62 1.1 christos
63 1.1 christos if {![runto_main]} {
64 1.1 christos return -1
65 1.1 christos }
66 1.1 christos
67 1.1 christos # We want to invoke setup_kfail (and in some cases setup_xfail) when
68 1.1 christos # GDB does not yet have support for finding the values of variables in
69 1.1 christos # (non-master) threads. We'll check this by looking at the output of
70 1.1 christos # "maint print thread-parent". If this command is undefined, then GDB
71 1.1 christos # does not yet have thread parent support, and it makes sense to kfail
72 1.1 christos # tests which won't work. It's possible for GDB to have this support,
73 1.1 christos # but not work. E.g. it may be the case that the plugin doesn't
74 1.1 christos # exist or is not found. We may eventually need to add additional
75 1.1 christos # constraints related to setting allow_kfail to 0. But, for the moment,
76 1.1 christos # this simple test should be sufficient.
77 1.1 christos
78 1.1 christos set allow_kfail 1
79 1.1 christos gdb_test_multiple "maint print thread-parent" "maint print thread-parent" {
80 1.1 christos -re "Undefined maintenance print command.*$gdb_prompt" {
81 1.1 christos pass "maint print thread-parent (does not exist)"
82 1.1 christos }
83 1.1 christos -re "No parent found.*" {
84 1.1 christos pass "maint print thread-parent"
85 1.1 christos set allow_kfail 0
86 1.1 christos }
87 1.1 christos }
88 1.1 christos
89 1.1 christos # Determine whether to xfail some of the tests based on GCC version.
90 1.1 christos #
91 1.1 christos # This may need to be tweaked somewhat. Testing shows that GCC 7.3.1
92 1.1 christos # needs the xfails. GCC 8.3.1 and 9.1.1 do not. The assumption made
93 1.1 christos # below is that all versions of gcc 8 and above won't require the
94 1.1 christos # XFAIL setup and that all versions of gcc 7 and below will, but it's
95 1.1 christos # possible that there are versions in between 7.3.1 and 8.3.1 for
96 1.1 christos # which this assumption is invalid.
97 1.1 christos
98 1.1 christos set have_older_gcc 0
99 1.1 christos if {[test_compiler_info {gcc-[0-7]-*}]} {
100 1.1 christos set have_older_gcc 1
101 1.1 christos }
102 1.1 christos
103 1.1 christos # maybe_setup_kfail will set up a kfail for gdb/22214 when COND holds in
104 1.1 christos # addition to considering the values of $have_older_gcc and $allow_kfail.
105 1.1 christos #
106 1.1 christos # When $have_older_gcc evaluates to true, setup_xfail will invoked
107 1.1 christos # instead.
108 1.1 christos
109 1.1 christos proc maybe_setup_kfail {cond} {
110 1.1 christos global have_older_gcc allow_kfail
111 1.1 christos if {$have_older_gcc} {
112 1.1 christos setup_xfail *-*-*
113 1.1 christos } elseif {[uplevel 1 [list expr $cond]] && $allow_kfail} {
114 1.1 christos setup_kfail "gdb/22214" *-*-*
115 1.1 christos }
116 1.1 christos }
117 1.1 christos
118 1.1 christos with_test_prefix "single_scope" {
119 1.1 christos
120 1.1 christos gdb_breakpoint [gdb_get_line_number "single_scope: thread_num="]
121 1.1 christos gdb_breakpoint [gdb_get_line_number "single_scope: s1="]
122 1.1 christos
123 1.1 christos foreach pref {"first thread" "second thread"} {
124 1.1 christos with_test_prefix $pref {
125 1.1 christos gdb_continue_to_breakpoint "at printf"
126 1.1 christos
127 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
128 1.1 christos set thread_num [get_valueof "" thread_num "unknown"]
129 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
130 1.1 christos gdb_test "print s1" "= -41"
131 1.1 christos gdb_test "print s2" "= \[12\]02"
132 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
133 1.1 christos gdb_test "print s3" "= -43"
134 1.1 christos gdb_test "print i1" "= 11"
135 1.1 christos gdb_test "print i2" "= \[12]12"
136 1.1 christos maybe_setup_kfail {$thread_num != 0}
137 1.1 christos gdb_test "print i3" "= 13"
138 1.1 christos }
139 1.1 christos }
140 1.1 christos
141 1.1 christos with_test_prefix "after parallel region" {
142 1.1 christos gdb_continue_to_breakpoint "at printf"
143 1.1 christos
144 1.1 christos gdb_test "print s1" "= -41"
145 1.1 christos gdb_test "print s2" "= -42"
146 1.1 christos gdb_test "print s3" "= -43"
147 1.1 christos gdb_test "print i1" "= 11"
148 1.1 christos gdb_test "print i2" "= 12"
149 1.1 christos gdb_test "print i3" "= 13"
150 1.1 christos }
151 1.1 christos
152 1.1 christos }
153 1.1 christos
154 1.1 christos with_test_prefix "multi_scope" {
155 1.1 christos gdb_breakpoint [gdb_get_line_number "multi_scope: thread_num="]
156 1.1 christos gdb_breakpoint [gdb_get_line_number "multi_scope: i01="]
157 1.1 christos
158 1.1 christos foreach pref {"first thread" "second thread"} {
159 1.1 christos with_test_prefix $pref {
160 1.1 christos gdb_continue_to_breakpoint "at printf"
161 1.1 christos
162 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
163 1.1 christos set thread_num [get_valueof "" thread_num "unknown"]
164 1.1 christos
165 1.1 christos gdb_test "print i01" "= 1"
166 1.1 christos maybe_setup_kfail {$thread_num != 0}
167 1.1 christos gdb_test "print i02" "= 2"
168 1.1 christos gdb_test "print i11" "= 11"
169 1.1 christos maybe_setup_kfail {$thread_num != 0}
170 1.1 christos gdb_test "print i12" "= 12"
171 1.1 christos gdb_test "print i21" "= \[12\]21"
172 1.1 christos maybe_setup_kfail {$thread_num != 0}
173 1.1 christos gdb_test "print i22" "= 22"
174 1.1 christos gdb_test "print file_scope_var" "= 9876"
175 1.1 christos }
176 1.1 christos }
177 1.1 christos
178 1.1 christos with_test_prefix "after parallel" {
179 1.1 christos gdb_continue_to_breakpoint "at printf"
180 1.1 christos
181 1.1 christos gdb_test "print i01" "= 1"
182 1.1 christos gdb_test "print i02" "= 2"
183 1.1 christos gdb_test "print i11" "= 11"
184 1.1 christos gdb_test "print i12" "= 12"
185 1.1 christos gdb_test "print i21" "= -21"
186 1.1 christos gdb_test "print i22" "= 22"
187 1.1 christos gdb_test "print file_scope_var" "= 9876"
188 1.1 christos }
189 1.1 christos }
190 1.1 christos
191 1.1 christos # Nested functions in C are a GNU extension, so only do the nested function
192 1.1 christos # tests if compiling with -DHAVE_NESTED_FUNCTION_SUPPORT was successful.
193 1.1 christos
194 1.1 christos if $have_nested_function_support {
195 1.1 christos with_test_prefix "nested_func" {
196 1.1 christos gdb_breakpoint [gdb_get_line_number "nested_func: tn="]
197 1.1 christos
198 1.1 christos foreach call_prefix {"1st call" "2nd call"} {
199 1.1 christos with_test_prefix $call_prefix {
200 1.1 christos foreach thread_prefix {"1st thread" "2nd thread"} {
201 1.1 christos with_test_prefix $thread_prefix {
202 1.1 christos gdb_continue_to_breakpoint "at printf"
203 1.1 christos
204 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
205 1.1 christos set thread_num [get_valueof "" "tn" "unknown"]
206 1.1 christos
207 1.1 christos gdb_test "print file_scope_var" "= 9876"
208 1.1 christos if {$have_older_gcc} { setup_xfail *-*-* }
209 1.1 christos gdb_test "print s1" "= -42"
210 1.1 christos if {$call_prefix eq "1st call"} {
211 1.1 christos gdb_test "print i" "= 1"
212 1.1 christos } else {
213 1.1 christos gdb_test "print i" "= 101"
214 1.1 christos }
215 1.1 christos gdb_test "print j" "= \[12\]000"
216 1.1 christos maybe_setup_kfail {$thread_num != 0}
217 1.1 christos if {$call_prefix eq "1st call"} {
218 1.1 christos gdb_test "print k" "= 3"
219 1.1 christos } else {
220 1.1 christos gdb_test "print k" "= 103"
221 1.1 christos }
222 1.1 christos if {$call_prefix eq "1st call"} {
223 1.1 christos gdb_test "print p" "= 10"
224 1.1 christos } else {
225 1.1 christos gdb_test "print p" "= 20"
226 1.1 christos }
227 1.1 christos gdb_test "print q" "= \[12\]001"
228 1.1 christos maybe_setup_kfail {$thread_num != 0}
229 1.1 christos if {$call_prefix eq "1st call"} {
230 1.1 christos gdb_test "print r" "= 12"
231 1.1 christos } else {
232 1.1 christos gdb_test "print r" "= 22"
233 1.1 christos }
234 1.1 christos gdb_test "print x" "= 4"
235 1.1 christos gdb_test "print y" "= \[12\]002"
236 1.1 christos maybe_setup_kfail {$thread_num != 0}
237 1.1 christos gdb_test "print z" "= 6"
238 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
239 1.1 christos gdb_test "print tn" "= \[01\]"
240 1.1 christos }
241 1.1 christos }
242 1.1 christos }
243 1.1 christos }
244 1.1 christos }
245 1.1 christos }
246 1.1 christos
247 1.1 christos with_test_prefix "nested_parallel" {
248 1.1 christos gdb_breakpoint [gdb_get_line_number "nested_parallel (inner threads)"]
249 1.1 christos
250 1.1 christos with_test_prefix "inner_threads" {
251 1.1 christos foreach pref {"1st stop" "2nd stop" "3rd stop" "4th stop"} {
252 1.1 christos with_test_prefix $pref {
253 1.1 christos gdb_continue_to_breakpoint "at printf"
254 1.1 christos
255 1.1 christos # Don't need setup_xfail here due to fact that num is made
256 1.1 christos # made known to the inner parallel region.
257 1.1 christos set thread_num [get_valueof "" "num" "unknown"]
258 1.1 christos
259 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
260 1.1 christos set inner_thread_num [get_valueof "" "inner_num" "unknown"]
261 1.1 christos
262 1.1 christos gdb_test "print file_scope_var" "= 9876"
263 1.1 christos gdb_test "print num" "= \[01\]"
264 1.1 christos maybe_setup_kfail {$thread_num != 0 || $inner_thread_num != 0}
265 1.1 christos gdb_test "print i" "= 1"
266 1.1 christos maybe_setup_kfail {$thread_num != 0 || $inner_thread_num != 0}
267 1.1 christos gdb_test "print j" "= 2"
268 1.1 christos if {$have_older_gcc || ($inner_thread_num != 0 && $allow_kfail)} { setup_xfail *-*-* }
269 1.1 christos gdb_test "print l" "= 10\[24\]"
270 1.1 christos if {$have_older_gcc ||( $inner_thread_num != 0 && $allow_kfail)} { setup_xfail *-*-* }
271 1.1 christos gdb_test "print k" "= 10\[13\]"
272 1.1 christos }
273 1.1 christos }
274 1.1 christos }
275 1.1 christos
276 1.1 christos with_test_prefix "outer_threads" {
277 1.1 christos gdb_breakpoint [gdb_get_line_number "nested_parallel (outer threads)"]
278 1.1 christos
279 1.1 christos with_test_prefix "outer stop" {
280 1.1 christos gdb_continue_to_breakpoint "at printf"
281 1.1 christos
282 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
283 1.1 christos # Use get_local_valueof instead of get_valueof to avoid picking up
284 1.1 christos # some random 'num' in a shared library.
285 1.1 christos set thread_num [get_local_valueof "num" "unknown"]
286 1.1 christos
287 1.1 christos gdb_test "print file_scope_var" "= 9876"
288 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
289 1.1 christos gdb_test "print num" "= \[01\]"
290 1.1 christos maybe_setup_kfail {$thread_num != 0}
291 1.1 christos gdb_test "print i" "= 1"
292 1.1 christos maybe_setup_kfail {$thread_num != 0}
293 1.1 christos gdb_test "print j" "= 2"
294 1.1 christos gdb_test "print l" "= 10\[24\]"
295 1.1 christos if {$have_older_gcc} { setup_xfail "*-*-*" }
296 1.1 christos gdb_test "print k" "= 10\[13\]"
297 1.1 christos }
298 1.1 christos }
299 1.1 christos }
300