# Copyright 2010-2021 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/>.
#
# Contributed by Ken Werner <ken.werner@de.ibm.com>.
#
# Support library for testing OpenCL GDB features

# Compile OpenCL programs using a generic host app.
proc gdb_compile_opencl_hostapp {clsource executable options} {
    global srcdir objdir subdir
    set src "${srcdir}/lib/cl_util.c ${srcdir}/lib/opencl_hostapp.c"
    set binfile [standard_output_file ${executable}]
    set compile_flags [concat additional_flags=-I${srcdir}/lib/ additional_flags=-DCL_SOURCE=$clsource]
    set options_opencl [concat {debug} $compile_flags $options [list libs=-lOpenCL]]
    return [gdb_compile ${src} ${binfile} "executable" ${options_opencl}]
}

# Run a test on the target to check if it supports OpenCL. Return 0 if so, 1 if
# it does not.
gdb_caching_proc skip_opencl_tests {
    global srcdir objdir subdir gdb_prompt
    global inferior_exited_re

    set me "skip_opencl_tests"

    # Set up, compile, and execute an OpenCL program.  Include the current
    # process ID in the file name of the executable to prevent conflicts with
    # invocations for multiple testsuites.
    set clprogram [remote_download target ${srcdir}/lib/opencl_kernel.cl]
    set executable opencltest[pid].x

    verbose "$me:  compiling OpenCL test app" 2
    set compile_flags {debug nowarnings quiet}

    if { [gdb_compile_opencl_hostapp "${clprogram}" "${executable}" "${compile_flags}" ] != "" } {
	remote_file target delete ${clprogram}
        verbose "$me:  compiling OpenCL binary failed, returning 1" 2
	return 1
    }

    # Compilation succeeded so now run it via gdb.
    clean_restart "$executable"
    gdb_run_cmd
    gdb_expect 30 {
        -re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
            verbose -log "\n$me: OpenCL support detected"
            set result 0
        }
        -re ".*$inferior_exited_re with code.*${gdb_prompt} $" {
            verbose -log "\n$me: OpenCL support not detected"
            set result 1
        }
        default {
            verbose -log "\n$me OpenCL support not detected (default case)"
            set result 1
        }
    }
    gdb_exit
    remote_file build delete $executable

    # Delete the OpenCL program source file.
    remote_file target delete ${clprogram}

    verbose "$me:  returning $result" 2
    return $result
}
