# Copyright 2010-2020 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>.
#
# Tests GDBs support for OpenCL type conversions and casts.

load_lib opencl.exp

if { [skip_opencl_tests] } {
    return 0
}

set testfile "convs_casts"
set clprogram [remote_download target ${srcdir}/${subdir}/${testfile}.cl]

# Compile the generic OpenCL host app
if { [gdb_compile_opencl_hostapp "${clprogram}" "${testfile}" "" ] != "" } {
    untested "failed to compile"
    return -1
}

# Load the OpenCL app
clean_restart ${testfile}

# Set breakpoint at the OpenCL kernel
gdb_test "tbreak testkernel" \
    "" \
    "Set pending breakpoint" \
    ".*Function \"testkernel\" not defined.*Make breakpoint pending.*y or \\\[n\\\]. $" \
    "y"

gdb_run_cmd
gdb_test "" ".*reakpoint.*1.*testkernel.*" "run"

# Continue to the marker
gdb_breakpoint [gdb_get_line_number "marker" "${clprogram}"]
gdb_continue_to_breakpoint "marker"

# Retrieve some information about availability of OpenCL extensions
set have_cl_khr_fp64 [get_integer_valueof "have_cl_khr_fp64" 0]
set have_cl_khr_fp16 [get_integer_valueof "have_cl_khr_fp16" 0]

proc vec_casts { name } {
  global have_cl_khr_fp16 have_cl_khr_fp64
  set types {"char" "uchar" "short" "ushort" "int" "uint" "long" "ulong" "half" "float" "double"}
  set len [llength ${types}]

  for {set i 0} {$i < ${len}} {incr i} {
    set type [lindex ${types} $i]

    gdb_test "print/d (${type}2)${name}" " = \\{123, 123\\}"
    gdb_test "print/d (${type}3)${name}" " = \\{123, 123, 123\\}"
    gdb_test "print/d (${type}4)${name}" " = \\{123, 123, 123, 123\\}"
    gdb_test "print/d (${type}8)${name}" " = \\{123, 123, 123, 123, 123, 123, 123, 123\\}"
    gdb_test "print/d (${type}16)${name}" " = \\{123 <repeats 16 times>\\}"

    gdb_test "ptype (${type}2)${name}" "${type}2"
    gdb_test "ptype (${type}3)${name}" "${type}3"
    gdb_test "ptype (${type}4)${name}" "${type}4"
    gdb_test "ptype (${type}8)${name}" "${type}8"
    gdb_test "ptype (${type}16)${name}" "${type}16"
  }
}

vec_casts "c"
vec_casts "uc"
vec_casts "s"
vec_casts "us"
vec_casts "i"
vec_casts "ui"
vec_casts "l"
vec_casts "ul"
if { ${have_cl_khr_fp16} } {
  vec_casts "h"
}
vec_casts "f"
if { ${have_cl_khr_fp64} } {
  vec_casts "d"
}

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