# 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>.
#
# 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 ${testfile}.exp
    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}
