# Copyright 2017-2025 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# This file is part of the gdb testsuite.

# Tests which verify (or not) that GDB can access in-scope variables
# when stopped within an OpenMP parallel region.

standard_testfile

if { [test_compiler_info "clang*"] } {
    # Clang doesn't add OpenMP information in the correct scope,
    # so all relevant tests here will fail.  See here for more info:
    # https://github.com/llvm/llvm-project/issues/44236
    unsupported "Clang doesn't provide required info for the test"
    return
}

set have_nested_function_support 0
set opts {openmp debug}
if [support_nested_function_tests] {
    lappend opts "additional_flags=-DHAVE_NESTED_FUNCTION_SUPPORT"
    set have_nested_function_support 1
}

if {[prepare_for_testing "failed to prepare" $testfile $srcfile $opts]} {
    return -1
}

# gdb_openmp_setup may be defined to set auto-load safe-path and possibly
# sysroot.  These settings are required for gdb to be able to find
# the libgomp python plugin.  (sysroot only needs to be defined for
# remote debugging.)
#
# This approach has both pros and cons.  On the plus side, it's easy
# to automatically set a precise auto-load safe-path.  (It's easy because
# the output of ldd on the binary may be examined to learn the location
# of libgomp.so.)
#
# However, making these settings is also a drawback due to potentially
# overriding settings made by a board file.  Therefore, this proc
# is optional and will only be called if it's defined.

if {[info procs gdb_openmp_setup] != ""} {
    if {[gdb_openmp_setup $binfile] != ""} {
	untested "could not set up OpenMP environment"
	return -1
    }
}

if {![runto_main]} {
    return -1
}

# We want to invoke setup_kfail (and in some cases setup_xfail) when
# GDB does not yet have support for finding the values of variables in
# (non-master) threads.  We'll check this by looking at the output of
# "maint print thread-parent".  If this command is undefined, then GDB
# does not yet have thread parent support, and it makes sense to kfail
# tests which won't work.  It's possible for GDB to have this support,
# but not work.  E.g. it may be the case that the plugin doesn't
# exist or is not found.  We may eventually need to add additional
# constraints related to setting allow_kfail to 0.  But, for the moment,
# this simple test should be sufficient.

set allow_kfail 1
gdb_test_multiple "maint print thread-parent" "maint print thread-parent" {
    -re "Undefined maintenance print command.*$gdb_prompt" {
	pass "maint print thread-parent (does not exist)"
    }
    -re "No parent found.*" {
	pass "maint print thread-parent"
	set allow_kfail 0
    }
}

# Determine whether to xfail some of the tests based on GCC version.
#
# This may need to be tweaked somewhat.  Testing shows that GCC 7.3.1
# needs the xfails.  GCC 8.3.1 and 9.1.1 do not.  The assumption made
# below is that all versions of gcc 8 and above won't require the
# XFAIL setup and that all versions of gcc 7 and below will, but it's
# possible that there are versions in between 7.3.1 and 8.3.1 for
# which this assumption is invalid.

set have_older_gcc 0
if {[test_compiler_info {gcc-[0-7]-*}]} {
    set have_older_gcc 1
}

# maybe_setup_kfail will set up a kfail for gdb/22214 when COND holds in
# addition to considering the values of $have_older_gcc and $allow_kfail.
#
# When $have_older_gcc evaluates to true, setup_xfail will invoked
# instead.

proc maybe_setup_kfail {cond} {
    global have_older_gcc allow_kfail
    if {$have_older_gcc} {
	setup_xfail *-*-*
    } elseif {[uplevel 1 [list expr $cond]] && $allow_kfail} {
	setup_kfail "gdb/22214" *-*-*
    }
}

with_test_prefix "single_scope" {

    gdb_breakpoint [gdb_get_line_number "single_scope: thread_num="]
    gdb_breakpoint [gdb_get_line_number "single_scope: s1="]

    foreach pref {"first thread" "second thread"} {
	with_test_prefix $pref {
	    gdb_continue_to_breakpoint "at printf"

	    if {$have_older_gcc} { setup_xfail "*-*-*" }
	    set thread_num [get_valueof "" thread_num "unknown"]
	    if {$have_older_gcc} { setup_xfail "*-*-*" }
	    gdb_test "print s1" "= -41"
	    gdb_test "print s2" "= \[12\]02"
	    if {$have_older_gcc} { setup_xfail "*-*-*" }
	    gdb_test "print s3" "= -43"
	    gdb_test "print i1" "= 11"
	    gdb_test "print i2" "= \[12]12"
	    maybe_setup_kfail {$thread_num != 0}
	    gdb_test "print i3" "= 13"
	}
    }

    with_test_prefix "after parallel region" {
	gdb_continue_to_breakpoint "at printf"

	gdb_test "print s1" "= -41"
	gdb_test "print s2" "= -42"
	gdb_test "print s3" "= -43"
	gdb_test "print i1" "= 11"
	gdb_test "print i2" "= 12"
	gdb_test "print i3" "= 13"
    }

}

with_test_prefix "multi_scope" {
    gdb_breakpoint [gdb_get_line_number "multi_scope: thread_num="]
    gdb_breakpoint [gdb_get_line_number "multi_scope: i01="]

    foreach pref {"first thread" "second thread"} {
	with_test_prefix $pref {
	    gdb_continue_to_breakpoint "at printf"

	    if {$have_older_gcc} { setup_xfail "*-*-*" }
	    set thread_num [get_valueof "" thread_num "unknown"]

	    gdb_test "print i01" "= 1"
	    maybe_setup_kfail {$thread_num != 0}
	    gdb_test "print i02" "= 2"
	    gdb_test "print i11" "= 11"
	    maybe_setup_kfail {$thread_num != 0}
	    gdb_test "print i12" "= 12"
	    gdb_test "print i21" "= \[12\]21"
	    maybe_setup_kfail {$thread_num != 0}
	    gdb_test "print i22" "= 22"
	    gdb_test "print file_scope_var" "= 9876"
	}
    }

    with_test_prefix "after parallel" {
	gdb_continue_to_breakpoint "at printf"

	gdb_test "print i01" "= 1"
	gdb_test "print i02" "= 2"
	gdb_test "print i11" "= 11"
	gdb_test "print i12" "= 12"
	gdb_test "print i21" "= -21"
	gdb_test "print i22" "= 22"
	gdb_test "print file_scope_var" "= 9876"
    }
}

# Nested functions in C are a GNU extension, so only do the nested function
# tests if compiling with -DHAVE_NESTED_FUNCTION_SUPPORT was successful.

if $have_nested_function_support {
    with_test_prefix "nested_func" {
	gdb_breakpoint [gdb_get_line_number "nested_func: tn="]

	foreach call_prefix {"1st call" "2nd call"} {
	    with_test_prefix $call_prefix {
		foreach thread_prefix {"1st thread" "2nd thread"} {
		    with_test_prefix $thread_prefix {
			gdb_continue_to_breakpoint "at printf"

			if {$have_older_gcc} { setup_xfail "*-*-*" }
			set thread_num [get_valueof "" "tn" "unknown"]

			gdb_test "print file_scope_var" "= 9876"
			if {$have_older_gcc} { setup_xfail *-*-* }
			gdb_test "print s1" "= -42"
			if {$call_prefix eq "1st call"} {
			    gdb_test "print i" "= 1"
			} else {
			    gdb_test "print i" "= 101"
			}
			gdb_test "print j" "= \[12\]000"
			maybe_setup_kfail {$thread_num != 0}
			if {$call_prefix eq "1st call"} {
			    gdb_test "print k" "= 3"
			} else {
			    gdb_test "print k" "= 103"
			}
			if {$call_prefix eq "1st call"} {
			    gdb_test "print p" "= 10"
			} else {
			    gdb_test "print p" "= 20"
			}
			gdb_test "print q" "= \[12\]001"
			maybe_setup_kfail {$thread_num != 0}
			if {$call_prefix eq "1st call"} {
			    gdb_test "print r" "= 12"
			} else {
			    gdb_test "print r" "= 22"
			}
			gdb_test "print x" "= 4"
			gdb_test "print y" "= \[12\]002"
			maybe_setup_kfail {$thread_num != 0}
			gdb_test "print z" "= 6"
			if {$have_older_gcc} { setup_xfail "*-*-*" }
			gdb_test "print tn" "= \[01\]"
		    }
		}
	    }
	}
    }
}

with_test_prefix "nested_parallel" {
    gdb_breakpoint [gdb_get_line_number "nested_parallel (inner threads)"]

    with_test_prefix "inner_threads" {
	foreach pref {"1st stop" "2nd stop" "3rd stop" "4th stop"} {
	    with_test_prefix $pref {
		gdb_continue_to_breakpoint "at printf"

		# Don't need setup_xfail here due to fact that num is made
		# made known to the inner parallel region.
		set thread_num [get_valueof "" "num" "unknown"]

		if {$have_older_gcc} { setup_xfail "*-*-*" }
		set inner_thread_num [get_valueof "" "inner_num" "unknown"]

		gdb_test "print file_scope_var" "= 9876"
		gdb_test "print num" "= \[01\]"
		maybe_setup_kfail {$thread_num != 0 || $inner_thread_num != 0}
		gdb_test "print i" "= 1"
		maybe_setup_kfail {$thread_num != 0 || $inner_thread_num != 0}
		gdb_test "print j" "= 2"
		if {$have_older_gcc || ($inner_thread_num != 0 && $allow_kfail)} { setup_xfail *-*-* }
		gdb_test "print l" "= 10\[24\]"
		if {$have_older_gcc ||( $inner_thread_num != 0 && $allow_kfail)} { setup_xfail *-*-* }
		gdb_test "print k" "= 10\[13\]"
	    }
	}
    }

    with_test_prefix "outer_threads" {
	gdb_breakpoint [gdb_get_line_number "nested_parallel (outer threads)"]

	with_test_prefix "outer stop" {
	    gdb_continue_to_breakpoint "at printf"

	    if {$have_older_gcc} { setup_xfail "*-*-*" }
	    # 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 "*-*-*" }
	    gdb_test "print num" "= \[01\]"
	    maybe_setup_kfail {$thread_num != 0}
	    gdb_test "print i" "= 1"
	    maybe_setup_kfail {$thread_num != 0}
	    gdb_test "print j" "= 2"
	    gdb_test "print l" "= 10\[24\]"
	    if {$have_older_gcc} { setup_xfail "*-*-*" }
	    gdb_test "print k" "= 10\[13\]"
	}
    }
}
