# Copyright 2010-2012 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 ${objdir}/${subdir}/${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.
proc skip_opencl_tests {} {
    global skip_opencl_tests_saved srcdir objdir subdir gdb_prompt
    global inferior_exited_re

    # Use the cached value, if it exists.  Cache value per "board" to handle
    # runs with multiple options (e.g. unix/{-m32,-64}) correctly.
    set me "skip_opencl_tests"
    set board [target_info name]
    if [info exists skip_opencl_tests_saved($board)] {
        verbose "$me:  returning saved $skip_opencl_tests_saved($board)" 2
        return $skip_opencl_tests_saved($board)
    }

    # 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}" ] != "" } {
        verbose "$me:  compiling OpenCL binary failed, returning 1" 2
	return [set skip_opencl_tests_saved($board) 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 skip_opencl_tests_saved($board) 0
        }
        -re ".*$inferior_exited_re code.*${gdb_prompt} $" {
            verbose -log "\n$me: OpenCL support not detected"
            set skip_opencl_tests_saved($board) 1
        }
        default {
            verbose -log "\n$me OpenCL support not detected (default case)"
            set skip_opencl_tests_saved($board) 1
        }
    }
    gdb_exit
    remote_file build delete $executable

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

    verbose "$me:  returning $skip_opencl_tests_saved($board)" 2
    return $skip_opencl_tests_saved($board)
}
